Knock-JWT-ログイン管理について

■定義
JWTとは...JSONに電子署名をして、URL Safeな文字列にしたもの。セキュアなセッションとしてログイン時に使うことあり。
Knockとは...Rails APIでJWT認証を使えるようにしたライブラリ

■参考
  1. 【Rails】JSON Web Token(JWT)を使ってみる - 実装編【knock】
  2. KnockでRails APIモードでJWT認証してみる
  3. SPAサイトでの認証認可 JWT✗Rails5✗Nuxt.js
  4. Knock gemを用いてJWTで2種類のユーザーを認証する方法
  5. [Facebookログイン]Railsでプロフィール画像を取得したい
■自作
実行画面

  • Knockは、rails APIモードで、API通信でのセキュアを担保するための仕組み。
  • クライアントのPOSTに、JWTというtokenを生成して返す。改ざん不能の鍵。
  • 二度目の通信では、クライアントはheaderにJWT情報を付与することによって、サーバー側の認証を通過することが可能となる。
  • before_action :authenticate_userとの指定によって、レコードを認証対象にするかどうかを決定できる
  • APIモードではないRailsでは、deviceが使われるのが普通。
[使い方]
ApplicationControllerに
include Knock::Authenticable
を宣言する。これで、コントローラ内でbefore_actionとしてauthenticate_userを呼び出すことで、リソースを保護する。

----
Knockableに定義されているメソッド

  • self.from_token_request
  • self.from_token_payload
  • self.authorize
  • to_token_payload
辺りに関しては、Githubに記載が存在する。

英語記事での使い方について、、、

  1. A Look at The Draft for JWT Best Current Practices
  2. JSON Web Token (JWT) Signing Algorithms Overview
  3. Stateless Sessions for Stateful Minds: JWTs Explained and How You Can Make The Switch

使用ファイル
  • ApplicationController->includeしている。before_actionで指定している
  • AdminTokenController -> jwtを生成createしている?
  • knockable->token_secret_sigature_key/token_signature_algoritm/token_lifetimeとか使ってる
  • useable->includeしてるだけ。
  • knock.rb->設定値
  • request_helper->Knock::AuthToken.newしてる
JWTについて
Token Based 認証の簡単な流れは
  1. クライアントは認証サーバに認証情報(user_id, password等)を送信し、トークンを請求する。
  2. 認証サーバは認証情報が正しいことを確認して、トークン を発行する。
  3. クライアントはこの トークン を使って API リクエストを行なう。
  4. サーバは トークンから必要情報を取り出し、処理を行なう。
という感じになります。フローは従来のCookieベースの認証と大きく変わりませんが、Cookieベースの認証はCookieヘッダを使い、Token Based 認証では Authorizationヘッダを使うところが異なります。
こういったトークンを(セキュリティ的な考慮なしに)発行すると、user_id を書き換えて任意のユーザになりすましたり、expiration_date を書き換えて有効期限を自由に操れたりといった致命的な欠陥を生み出してしまいます。
しかしながらJWTを認証トークンとして使えば、この欠点を署名を検証することで克服することができます。サーバは一度認証情報を確認してから署名していますので、検証が通る(= 改ざんされていない)限りは信頼して使って良いことになります。



Next Post Previous Post
No Comment
Add Comment
comment url