多くのオンラインサービスを提供しています。あるサービス(domain1.com
上の)から別のサービス(domain2.com
上の)に転送された場合、ユーザーに迅速でシンプルなエクスペリエンスを提供するシステムを開発する必要があります。
新しいサービスに転送されたユーザーを自動的にログインする安全で安全な方法はありますか?
以下の解決策が完全に安全でない/間違っている場合は、私に怒鳴ってください。
私たちは、パスワードを回復するための多くのオンラインサービスで提供されているものと同様のシステムを検討していました。有効期限が切れてパスワードを変更できる一意のハッシュを含むリンクがメールで送信されます。
domain1.com
サイトは、一意のハッシュを生成し、有効期限日時フィールドとともにユーザーにリンクされたハッシュとともにデータベースに保存します。
ユーザーはdomain2.com/auto/?hash=d41d8cd98f00b204e9800998ecf8427e
に転送されます
次に、domain2.com
は、ハッシュを使用してdomain1.com
にリクエストを送信し、ユーザーに関する情報を取得します。 domain1.com
は、データベースからハッシュを削除します。 domain2.com
は、ユーザーをログインさせ、Cookieを設定します。
OpenIDまたはOAuthに基づく何かが同じ結果を達成できますか?
シングルサインオン(SSO)は概念的には非常に単純です。
domain1.com
を押します。domain1.com
は、セッションCookieがないことを確認します。domain1.com
はsso.com
にリダイレクトしますsso.com
はログインページを表示し、認証情報を取得しますsso.com
は、ユーザーのセッションCookieを設定しますsso.com
はdomain1
にリダイレクトし、特別な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ソリューションの基礎となる重要な基盤です。
誰かが真ん中で男を演じてそのハッシュをつかむことができた場合、彼らはクロスドメイン転送を盗むことができますか?明らかに、使用する前に生成してクライアントに送信する必要があります。たとえば、次のようにします。
ジャックをスパイしている最中の男を演じている。ジャックがdomain1.com
にアクセスすると、ハッシュが準備されて送信され、domain2.com
にアクセスすると、そのハッシュを認証として送信できるようになります。彼がdomain1.com
にアクセスすると、彼のリクエストが私を通して届きます。あなたはページを返し、ハッシュを取得して彼に続けさせます。私はハッシュを使用してdomain2.com
にアクセスします。これでdomain2.com
にアクセスしてハッシュを削除できました。彼がdomain2.com
にログインしようとして、資格情報が無効であると通知されるまで、彼は賢明ではありません。
それをどのように克服しますか?
セッション全体にSSLを使用しない限り、クロスドメインログインにSSLを使用しても意味がありません。セッションCookieを盗むのは、URLでハッシュを使用するのと同じくらい簡単です。セッションの残りの部分が安全でない場合、SSLでハッシュを非表示にするポイントは何ですか。
最初に示した方法は、ほぼ標準的な方法です。安全なプロトコルを使用するかどうかはまったく別の問題ですが、セッションの一部のみを暗号化しても意味がありません。
これは良い解決策です。考慮すべき2つの点を次に示します。
「ハッシュ」という用語を使用しますが、どのデータをハッシュするかは明確ではありません。代わりに、「ノンス」を使用してください。これは、暗号品質のRNGによって生成された大きな(128ビット)数です。
また、これを指定しませんでしたが、ユーザーと両方のドメイン間、およびドメイン自体間の通信は安全でなければなりません。 SSLを使用してサーバーを認証し、ナンスの機密を保持します。
SEOはどうですか?成功したログインが他のドメインにリダイレクトされて戻る前のすべてのリクエストのように見えます。これは非常に醜いと言えます。どのヘッダーを送信する必要がありますか? 301をSSOにしてから、301を元のページに戻しますか?それで、検索ボットはそのページのインデックスを2回変更するように「要求された」のですか?