2016-04-09 10 views
1

1つのプロジェクトを開発し、Silhouette認証フレームワークを使用しています。 ブラウザのUIからの定期的なリクエストに対してはCookieAuthenticatorを使用し、REST APIリクエストに対してはJWTAuthenticatorを使用します。オーセンティケータDAOがある場合シルエットJWTトークンはステートレスモードでどのように有効ですか?

/** 
* The service that handles the JWT authenticator. 
* 
* If the authenticator DAO is deactivated then a stateless approach will be used. But note 
* that you will loose the possibility to invalidate a JWT. 
* 
* @param settings The authenticator settings. 
* @param dao The DAO to store the authenticator. Set it to None to use a stateless approach. 
* @param idGenerator The ID generator used to create the authenticator ID. 
* @param clock The clock implementation. 
* @param executionContext The execution context to handle the asynchronous operations. 
*/ 
class JWTAuthenticatorService(
    settings: JWTAuthenticatorSettings, 
    dao: Option[AuthenticatorDAO[JWTAuthenticator]], 
    idGenerator: IDGenerator, 
    clock: Clock)(implicit val executionContext: ExecutionContext) 
    extends AuthenticatorService[JWTAuthenticator] 
    with Logger { 

お知らせDOC

のこの部分:ここで は、私は完全にこの事が実際にどのように動作するか理解していない感じさせるドキュメントとシルエットのソースコードの一部であり、非アクティブ化された場合は、ステートレスな方法で を使用します。ただし、JWTを に無効にする可能性が失われることに注意してください。

したがって、彼らは言うとおり正確に動作します。 パラメータの値としてNoneを渡すと、アプリケーションをシャットダウンしても生成されたトークンが有効なままになります。しかし、これらのトークンがどのように有効であるかを裏づけ店なしでは?私は再びアプリケーションを起動し、同じトークンを使用すると、ユーザーを認証します。そして、私はそれがどのようにこれを行うのか分かりません。あなたは説明できますか?

+1

非常に簡単です。トークンの内容を既知のソルトとアルゴリズムのコンボでエンコードします。 JWTトークンは、HMACまたはRSAでコード化された既知の構造を持っています。サーバは、例えば、暗号化キー(HMACの秘密鍵)とRSAの鍵ペアを知っている限り、トークンをステートレスに復号化することができます。 – flavian

+0

私はちょっと考えていれば、トークンにリンクされたアカウントに関する情報が埋め込まれているはずです。 サーバーがトークンを簡単に解読できるという事実は私にとっては単純ではありませんでした。 私はそれを受け入れることができるように答えとしてあなたのコメントを入れていただけますか? –

答えて

2

非常に簡単です。トークンの内容を既知のソルトとアルゴリズムのコンボでエンコードします。 JWTトークンは、HMACまたはRSAでコード化された既知の構造を持っています。サーバは、例えば、暗号化キー(HMACの秘密鍵)とRSAの鍵ペアを知っている限り、トークンをステートレスに復号化することができます。

あなたは巧みになりたいし、内部をチェックしたい場合は、自分で作ることもできます。 JWTは標準化されており、アカウントは通常、慣習によりissフィールドの下で利用可能です。たとえば、Google Cloudでは、issがあなたのGoogleサービスアカウントの電子メールであるため、あなたが誰であるかを知ることができます。

さらに調べると、独自のsessionオブジェクトを作成し、それをトークンにエンコードすることができます。

case class Session(user: UUID, timestamp: String, email: String) 

// This is roughly the process used. 
object TokenEncoder { 
    val secret = Play.current.configuration.getString("encryption.key") 
    def encode(session: Session): String = { 
    // The below line is just to make a point. 
    AES.encrypt(Json.toJson(session), someSharedKey) 
    } 

    def decode(str: String): Option[Session] = { 
    Json.parse(AES.decrypt(str, someSharedKey)).asOpt[Session] 
    } 
} 

このトークンの文字列値は、次に、クロスサーバ要求の場合にはクッキーまたはヘッダー内で使用することができ、すべてのサーバは、ステートレストークンを検証し、そうであれば、値を知っているユーザー情報を抽出することができますsomeSharedKey、エンコーディングの実行に使用された秘密。

関連する問題