ユーザーが各ドメインでフォームを送信しなくても、1つのドメインにログインして、他のドメインに自動的にログインできるようにするにはどうすればよいですか?
1 に答える
クッキーはセキュリティ上のリスクをもたらすため、クロスドメインでアクセスできないことは誰もが知っています。ただし、いくつかのトリックを使用して、これを回避する方法があります。基本的に、中央ドメインのユーザーにCookieを設定し、スクリプトを使用してそのCookieの存在を確認してから、JSON-Pコールバックを使用してそのCookieを他のドメインにコピーします。さらに詳細に:
ログイン
ステップ1
に<form>
表示されるmydomain.com
(またはmyotherdomain.com
など)にPOSTする必要がありますcentral.com/login
ステップ2
central.com/login
で、ユーザー名とパスワードが確認され、そのユーザーの一意の値を含むCookieがドメインに設定されますcentral.com
。その後、ユーザーはにリダイレクトされますmydomain.com
SELECT unique_value FROM users WHERE username = $username
set cookie on central.com containing unique_value
ステップ3
に戻ってmydomain.com
、へのjavascript呼び出しを埋め込みcentral.com/check
ます。
<script type="text/javascript" src="http://central.com/check"></script>
ステップ4
central.com/check
で、ユーザーに一意のCookieが設定されているかどうかを確認します。mydomain.com
次に、ユーザーがログインしていることを通知するJavaScriptコールバック(JSON-P)を埋め込みます。機密性の高いユーザーデータは含まれていません。そうでない場合hacker.com
、このスクリプトを埋め込んでユーザーの情報を取得する可能性があります。(検証済みドメインのみを許可するように適切なAccess-Controlヘッダーを設定すると、このリスクを軽減できます。)代わりに、タイムスタンプに基づいて使い捨てハッシュを作成しmydomain.com
、認証を検証できるようにします。
if cookie on central.com is valid
user_data = array(
'success' => true,
'uid' => $uid,
'time' => time_stamp,
'hash' => disposable_salted_hash( $uid, time_stamp )
)
echo 'setDomainCookie(' . json_encode(user_data) . ')'
ステップ5
次に、コールバック関数が実行され、Cookieがに設定されmydomain.com
ます。最後に、ページを更新するか、JavaScriptを使用してユーザーにログインしていることを警告することができます(できれば両方)。
function setDomainCookie( user_data ) {
if( user_data.success ) {
$.post('/setcookie', user_data, function() {
location.reload(true);
}
}
}
mydomain.com/setcookie
手順2と同様です。もちろん、これは両方のサイトが同じデータベース(およびコード)にアクセスできることを前提としています
if hash = disposable_salted_hash( $uid, time_stamp )
SELECT unique_value FROM users WHERE uid = $uid
set cookie on mydomain.com containing unique_value
ステップ6
次回ユーザーがページを更新するときに、JSON-Pコールバックをバイパスできます
if cookie on mydomain.com is valid
loggedin = true
else
delete cookie on mydomain.com
proceed to Step 3
ログアウト
ステップ7
上のリンクmydomain.com
はに行く必要がありますcentral.com/logout
ステップ8
central.com/logout
で、Cookieが削除されるだけでなく、そのユーザーの一意の値がリセットされます。ユーザーはにリダイレクトされますmydomain.com
delete cookie on central.com
UPDATE users SET unique_value = new_random_value() WHERE username = $username
ステップ9
一意の値がリセットされたため、上記の手順6は失敗し、Cookieもから削除されmydomain.com
、ユーザーは事実上ログアウトされます。
ノート
手順4
central.com/check
から、キャッシュされないように正しいヘッダーを設定することが重要です。ユーザーがログインしているときの手順3〜5により、わずかな遅延が発生する場合があります。更新して、ログインしていることを示す何らかのJavaScriptアラートを表示することをお勧めします。ステップ3のスクリプトを、ページの上部にできるだけ近づけることも重要です。
手順5では、オプションで各ドメインに一意のCookie値を保存できます。
別の
central.com
ドメインは実際には必要ありません。必要に応じて、他のドメインの1つを中央ドメインとして使用できます。そのドメインのロジックは明らかに異なります。これをInternetExplorerで機能させるには、CookieにP3Pポリシーを添付する必要があります。
IvanGusevがコメントで指摘しているように、このアプローチの1つの欠点は、ユーザーがデバイスAからログアウトすると、他のすべてのデバイスからもログアウトすることです。
これが人々に役立つことを願っています。特にこの方法にセキュリティ上の欠陥がある場合は、フィードバックを受け取ることに非常に興味があります。ハッカーが行う可能性のある最悪の事態は、手順3〜5を複製して
mydomain.com
、知らないうちにログインすることだと思いますが、それは無害です。