10

ユーザーが各ドメインでフォームを送信しなくても、1つのドメインにログインして、他のドメインに自動的にログインできるようにするにはどうすればよいですか?

4

1 に答える 1

16

クッキーはセキュリティ上のリスクをもたらすため、クロスドメインでアクセスできないことは誰もが知っています。ただし、いくつかのトリックを使用して、これを回避する方法があります。基本的に、中央ドメインのユーザーに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、ユーザーは事実上ログアウトされます。

ノート

  1. 手順4central.com/checkから、キャッシュされないように正しいヘッダーを設定することが重要です。

  2. ユーザーがログインしているときの手順3〜5により、わずかな遅延が発生する場合があります。更新して、ログインしていること示す何らかのJavaScriptアラートを表示することをお勧めします。ステップ3のスクリプトを、ページの上部にできるだけ近づけることも重要です。

  3. 手順5では、オプションで各ドメインに一意のCookie値を保存できます。

  4. 別のcentral.comドメインは実際には必要ありません。必要に応じて、他のドメインの1つを中央ドメインとして使用できます。そのドメインのロジックは明らかに異なります。

  5. これをInternetExplorerで機能させるには、CookieにP3Pポリシーを添付する必要があります。

  6. IvanGusevがコメントで指摘しているように、このアプローチの1つの欠点は、ユーザーがデバイスAからログアウトすると、他のすべてのデバイスからもログアウトすることです。

  7. これが人々に役立つことを願っています。特にこの方法にセキュリティ上の欠陥がある場合は、フィードバックを受け取ることに非常に興味があります。ハッカーが行う可能性のある最悪の事態は、手順3〜5を複製してmydomain.com、知らないうちにログインすることだと思いますが、それは無害です。

于 2012-06-08T21:57:39.627 に答える