JWTで認証するGem「Knock」でRSA認証する
Knockのデフォルトは secret_key_base を使ったHMAC using SHA-256らしい。
つまり、公開鍵暗号じゃないので、クライアントサイドで自由に中身を見れるというJWTの利点を半分失ってる(安全性については問題ないと思うけど…)
(追記)…と適当な事を書いてたら補足を頂きました。その通りですね! @koniyan ありがとう。
@AknEp HSとRSの違いはクライアント側で見れるかではなく、クライアント側で公開鍵を使ってverifyできるかどうかが違いじゃないかな。
— Kyoji Konishi (@koniyan) 2017年2月16日
※この辺とても難しいし、僕は暗号の専門家じゃないので、重要なプロジェクトで使う場合は、鵜呑みにしないで裏を取ってくださいね。
で、このメモで書いておきたいのは、KnockでRSA認証する方法。ただそれだけ。
まず、g knock:install で生成される knock.rb の各項目に以下のような感じで書く。 File.readにしてるけど、ENVに設定すればENVから引っ張り出しても良いと思う。(ENVに改行入れる手段とかは知らない…)
# knock.rb config.token_signature_algorithm = 'RS256' config.token_secret_signature_key = OpenSSL::PKey.read(File.read(Rails.root.join('keys','jwt-private.pem'))) config.token_public_key = OpenSSL::PKey.read(File.read(Rails.root.join('keys','jwt-public.pem')))
で、以下のコマンドで鍵ペアを生成する。
openssl genrsa 2048 > jwt-private.pem openssl rsa -in jwt-private.pem -pubout -out jwt-public.pem
あとは所定の位置にpemファイルを置いておくだけ。 クライアントサイドで複合したい時は、jwt-public.pem を誰でも見れるところに置いておくなりして、複合すればOK。お手軽。
特に分かりやすい利点としては、複合したトークンのexpをチェックするだけで期限がチェックできるので、トークンの延長をすべきか否かの判断とかが手軽にできる。とか。そのへん。