web-dev-qa-db-ja.com

クロスドメインログイン-あるドメインから別のドメインに移管されたときにユーザーを自動的にログインさせる方法

多くのオンラインサービスを提供しています。あるサービス(domain1.com上の)から別のサービス(domain2.com上の)に転送された場合、ユーザーに迅速でシンプルなエクスペリエンスを提供するシステムを開発する必要があります。

新しいサービスに転送されたユーザーを自動的にログインする安全で安全な方法はありますか?

以下の解決策が完全に安全でない/間違っている場合は、私に怒鳴ってください。

私たちは、パスワードを回復するための多くのオンラインサービスで提供されているものと同様のシステムを検討していました。有効期限が切れてパスワードを変更できる一意のハッシュを含むリンクがメールで送信されます。

domain1.comサイトは、一意のハッシュを生成し、有効期限日時フィールドとともにユーザーにリンクされたハッシュとともにデータベースに保存します。

ユーザーはdomain2.com/auto/?hash=d41d8cd98f00b204e9800998ecf8427eに転送されます

次に、domain2.comは、ハッシュを使用してdomain1.comにリクエストを送信し、ユーザーに関する情報を取得します。 domain1.comは、データベースからハッシュを削除します。 domain2.comは、ユーザーをログインさせ、Cookieを設定します。

OpenIDまたはOAuthに基づく何かが同じ結果を達成できますか?

48
smashedmercury

シングルサインオン(SSO)は概念的には非常に単純です。

  • ユーザーはdomain1.comを押します。
  • domain1.comは、セッションCookieがないことを確認します。
  • domain1.comsso.comにリダイレクトします
  • sso.comはログインページを表示し、認証情報を取得します
  • sso.comは、ユーザーのセッションCookieを設定します
  • sso.comdomain1にリダイレクトし、特別なURL(domain1.com/ssologinなど)に戻します。
  • ssologin URLには、基本的にsso.comによって「署名」されたパラメーターが含まれています。共有秘密鍵を使用してloginidを暗号化するbase64と同じくらい簡単です。
  • domain1.comは暗号化されたトークンを受け取り、それを復号化し、新しいログインIDを使用してユーザーにログインします。
  • domain1は、ユーザーのセッションCookieを設定します。

さて、次のケース。

  • ユーザーはdomain2.comを押し、domain1の後にsso.comにリダイレクトします
  • sso.comにはすでにユーザーのCookieがあるため、ログインページは表示されません
  • sso.comは暗号化された情報とともにdomain2.comにリダイレクトされます
  • domain2.comユーザーにログインします。

これが、これがどのように機能するかの基本です。より堅牢で機能豊富にすることができます(たとえば、これはSSOnですがSSOffではありません。ユーザーはdomain1から「ログアウト」できますが、まだdomain2にログインしています)。資格情報の署名には公開キーを使用できます。SSOサーバーからより多くの情報(承認権限など)を転送するように要求できます。ドメインが定期的にユーザーがまだSSOサーバーからの権限を持っているかどうかをチェックするなど、より緊密な統合を行うことができます。

ただし、リダイレクトを使用してブラウザー経由でcookie handshakeを行うことは、これらすべてのSSOソリューションの基礎となる重要な基盤です。

124
Will Hartung

誰かが真ん中で男を演じてそのハッシュをつかむことができた場合、彼らはクロスドメイン転送を盗むことができますか?明らかに、使用する前に生成してクライアントに送信する必要があります。たとえば、次のようにします。

ジャックをスパイしている最中の男を演じている。ジャックがdomain1.comにアクセスすると、ハッシュが準備されて送信され、domain2.comにアクセスすると、そのハッシュを認証として送信できるようになります。彼がdomain1.comにアクセスすると、彼のリクエストが私を通して届きます。あなたはページを返し、ハッシュを取得して彼に続けさせます。私はハッシュを使用してdomain2.comにアクセスします。これでdomain2.comにアクセスしてハッシュを削除できました。彼がdomain2.comにログインしようとして、資格情報が無効であると通知されるまで、彼は賢明ではありません。

それをどのように克服しますか?

8
BenAlabaster

セッション全体にSSLを使用しない限り、クロスドメインログインにSSLを使用しても意味がありません。セッションCookieを盗むのは、URLでハッシュを使用するのと同じくらい簡単です。セッションの残りの部分が安全でない場合、SSLでハッシュを非表示にするポイントは何ですか。

最初に示した方法は、ほぼ標準的な方法です。安全なプロトコルを使用するかどうかはまったく別の問題ですが、セッションの一部のみを暗号化しても意味がありません。

7
Paul

これは良い解決策です。考慮すべき2つの点を次に示します。

「ハッシュ」という用語を使用しますが、どのデータをハッシュするかは明確ではありません。代わりに、「ノンス」を使用してください。これは、暗号品質のRNGによって生成された大きな(128ビット)数です。

また、これを指定しませんでしたが、ユーザーと両方のドメイン間、およびドメイン自体間の通信は安全でなければなりません。 SSLを使用してサーバーを認証し、ナンスの機密を保持します。

6
erickson

SEOはどうですか?成功したログインが他のドメインにリダイレクトされて戻る前のすべてのリクエストのように見えます。これは非常に醜いと言えます。どのヘッダーを送信する必要がありますか? 301をSSOにしてから、301を元のページに戻しますか?それで、検索ボットはそのページのインデックスを2回変更するように「要求された」のですか?

2
pixo