クロスドメイン認証にJWTを使用するシングルサインオンフロー


112

WebにはJson Web Token、認証にJWT()を使用することに関する多くの情報があります。しかし、マルチドメイン環境でシングルサインオンソリューションに JWTトークンを使用する場合のフローの明確な説明はまだわかりませんでした。

私は、さまざまなホスト上に多数のサイトがある会社で働いています。example1.comexample2.comを使用してみましょう。シングルサインオンソリューションが必要です。つまり、ユーザーがexample1.comで認証された場合、そのユーザーもexample2.comで自動的に認証されるようにします。

OpenId Connectフローを使用して、example1.comで認証するユーザーが最初に認証サーバー(またはOP「OpenIdプロバイダー」)にリダイレクトされることを理解しています。ユーザーはそのサーバーで認証され、署名されたJWTトークンを使用して元のexample1.comサイトにリダイレクトされます。(後でそれ自体が実際のJWTトークンと交換できる中間トークンを返す別のフローがあることを理解していますが、これは私たちには必要ではないと思います)...

これで、ユーザーはexample1.comに戻り、認証されました。AuthenticationヘッダーでJWTトークンを渡して要求を出すことができ、サーバーは署名されたJWTを検証できるため、ユーザーを識別できます。いいね!

最初の質問:

JWTトークンはどのようにクライアントに保存する必要がありますか?繰り返しになりますが、これについては多くの情報があります。人々Web Storageは、古き良き時代というよりは、使用することが道のりであることに同意しているようですcookies。JWTをブラウザーの再起動間で永続的にしたいのでLocal Storage、ではなくを使用しましょうSession Storage...

これで、ユーザーはブラウザを再起動でき、JWTトークンの有効期限が切れていない限り、example1.comで認証されます。

また、example1.comが別のドメインにAjaxリクエストを行う必要がある場合、CORSを構成するとそれが可能になることを理解しています。ただし、主な使用例はクロスドメインリクエストではなく、シングルサインオンソリューションです。

したがって、主な質問:

ここで、ユーザーがexample2.comにアクセスして、すでに持っているJWTトークンを使用して認証されるようにした場合、フローはどうなりますか?Local Storageはクロスドメインアクセスを許可していないようです。そのため、この時点ではブラウザはJWTトークンを読み取ってexample2.comにリクエストを送信できません。

する必要があります:

  • ユーザーは再び認証サーバーにリダイレクトされますか?ユーザーがexample1.comに対して認証されると、 認証サーバーはユーザーにCookieを設定している可能性があるため、example2.comに対するこの新しい認証要求はそのCookieを使用して、ユーザーがすでに認証されていることを確認し、すぐにexample2.comにリダイレクトします 同じJWTトークンで?
  • または、ブラウザがexample2.comで、認証サーバーに再度アクセスすることなくJWTトークンにアクセスできますか?私はそこにある参照クロスストレージ・ソリューションは、しかし、それらの広く使用されていますか?それらは、クロスドメインSSO環境の推奨ソリューションですか?

私たちは空想したいものは何もありません、私たちは主に使用されるソリューションで満足します!

回答:


28

ユーザーは認証サーバーに再度リダイレクトされ、example2.comを対象とした新しいトークン(JWT)を取得する必要があります。これがOpenID Connectと他のクロスドメインフェデレーテッドSSOプロトコルの仕組みです。


15
しかし、SSOなので、ユーザーは認証資格情報(ユーザー名/パスワードなど)を再送信する必要がありません。それで、それはどのように行われますか?認証サーバーは最初にユーザーに標準Cookieを設定し、このユーザーが新しいドメインから戻ったときに自動的に認証できるようにする必要がありますか?
電気式

7
しかし、ユーザーがすべてのCookieをブロックするようにブラウザーを構成した場合はどうでしょうか。
Christiaan Westerbeek

1
「ブラウザがcookieをブロックするとサイトが正しく機能しない可能性がある」というcookieに関する警告が表示されると思います
AnBisw

シングルサインオンは、必ずしもユーザーがCookieによって追跡されている継続中のセッションを持っていることを意味しません。その定義上の特徴は、同じアイデンティティプロバイダーに対して同じ資格情報を再利用して、異なるサードパーティアプリケーションにアクセスすることです。つまり、Cookieは不要です。同じクレジットの再利用
ハンスZ.

35

ユーザーがログインしていないときにユーザーを中央認証サービスにリダイレクトして資格情報を要求し、新しい認証トークンを発行することは、oauth2やOpenId Connectなどのよく知られたプロトコルを使用するシングルサインオンシステムの一般的なシナリオです

ただし、このスキーマをドメイン間で使用する場合の主な欠点は、同じ生成元のポリシーにより、ユーザーが他のドメインに移動するたびにリダイレクトおよび認証されることです。アクセストークンはドメイン間で共有example2.comできません(データにアクセスできません)example1.com)、そのターゲットドメインは、中央のSSOサービスに彼をリダイレクトし、認証されていないように、ユーザーを扱います。

認証サービスが資格情報を再要求しないようにするために、セッションCookie(アクセストークンではない)を用意するのが一般的ですが、ブラウザーのlocalStorage / cookieと中間ドメインを指すiframeを使用してドメイン間でデータを共有する方法があります。 sso.example.com

  1. でユーザーを認証するには、ユーザーをでexample1.com認証サーバーにリダイレクトし、認証sso.example.com後にJWTを発行して、このドメインのlocalStorageに保存します。この後、ユーザーをオリジンドメインexample1.comにリダイレクトします。

  2. でiframeを作成する example2.com指すようにsso.example.com。sso.example.comのiframeがJWTトークンを読み取り、メッセージを親ページに送信します

  3. 親ページはメッセージを受信し、SSOフローを続行する添付トークンを取得します

同一生成元ポリシーには問題がないため、 sso.example.comローカルストレージにアクセスでき、起点ドメインとターゲットドメインが相互に認識していれば、iframeと親ページ間の通信が許可されます(http://blog.teamtreehouse.com/cross-domain-を参照)。メッセージング付きポストメッセージ

開発を簡素化するために、最近リリースした https://github.com/Aralink/ssojwtでJWTを使用しクロスドメインSSOを

この方法は、SSOフローと完全に互換性があります。これは、リダイレクトなしで認証トークンを共有し、ドメインが統合されたときに不要なログインを回避するための単なる方法です


3
このソリューションは標準に準拠していませんが、通常、クロスドメインSSOでは、一方が管理の境界を越えます。その場合、両方のドメインにまったく同じJWTを使用すると、一方のドメインのアプリケーション所有者が他方のユーザーになりすます可能性が開かれます。ドメイン
ハンスZ.16年

6
@HansZに感謝します。私たちは実際にこのソリューションを実装して、何十ものアプリケーションと同じユーザーがいる複数のドメインを1回管理できるようにしています。操作はグーグルシステムに似ています(比較的言えば)
pedrofb

2

これがあなたの質問に答えるかどうかはわかりませんが、主な目標がシングルサインオンである場合は、単純なリバースプロキシだと思います問題を解決できるます(少なくともクロスドメインストレージの問題)。

つまり、example1.com example2.com

のようなものになるでしょう

example.com/example1

example.com/example2

(そして、ユーザー側から、これは通常よりきれいです)

それがオプションではない場合、ユーザーが1つのドメインで認証するときに、AJAX /非表示のiframeを使用して他のドメインとの認証も作成するように設定する必要がある場合があります(必要な場合は、URLを介して1回のトークンを送信します) )。

それが選択肢でない場合は、ブラウザーがクロスドメインの相互作用についてより厳しくなっているため、ユーザー名とピンの組み合わせに頼る必要があるかもしれません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.