0

独自のログイン関数を作成したくないので、代わりに openId を使用したいと思います。ライブラリ lightopenid が見つかりました。google-example ファイルをいくつか変更すると、次のようになります。

<?php
session_start();
# Logging in with Google accounts requires setting special identity, so this example shows how to do it.
require 'openid.php';
try {
    # Change 'localhost' to your domain name.
    $openid = new LightOpenID('127.0.0.1');
    if(!$openid->mode) {
        if(isset($_GET['login'])) {
            $openid->identity = 'https://www.google.com/accounts/o8/id';
            header('Location: ' . $openid->authUrl());
        }
?>
<form action="?login" method="post">
    <button>Login with Google</button>
</form>
<?php
    } elseif($openid->mode == 'cancel') {
        echo 'User has canceled authentication!';
    } else {
        echo 'User ' . ($openid->validate() ? $openid->identity . ' has ' : 'has not ') . 'logged in.';
        if ($openid->validate()) {
            $_SESSION['auth'] = true;
        }
    }
} catch(ErrorException $e) {
    echo $e->getMessage();
}

だから私はそこに $_SESSION のものを追加しました...今度は、次のように、保護された各ページの上部にいくつかのコードを使用できると思います:

<?php session_start(); 
if (!$_SESSION['auth']) { exit; } ?>

私はこれが正しい方法で行われ、すべてが安全であることなどを望んでいます。あなたはこのようにしましたか、それとも私は何か間違ったことをしていますか? 代わりにクッキーを使用するかもしれません...

4

1 に答える 1

1

私はあなたのコードを試していませんが、バンドルされている Googleの例に基づいている場合は問題ありません。もちろん、このコードを使用すると、あなたのサイトは OpenID 所有者には公開されず、Google ユーザーだけに公開されます。

ただし、すでにお気づきのように、LightOpenID は認証プロセスのみを処理するため、アプリケーションは必要な認証の詳細を収集して保存する必要があります。ページ リクエストごとに再度認証するのは面倒だからです。最も重要なのはアイデンティティです。ID は URL であり、「ログイン」または「ユーザー名」に相当する OpenID です。"Configuracion" wiki ページで説明されているように、検証が成功した$openid->identity直後https://www.google.com/accounts/o8/id、 Google がユーザーに割り当てた一意の URL に変更されるときに、それを取得する必要があります。あなたはおそらくそれを知りたいと思うでしょう:

  • ユーザーごとに異なる権限を割り当てることができます。
  • さまざまなセッションでユーザーを識別できます。

では、ID をどのように保存すればよいでしょうか。

  • Cookie を使用してユーザーが認証されているかどうかを判断することは、考えられる最悪の解決策です。これを破るためにハッカーである必要はありません。最新のブラウザーにはすべて、Cookie を編集するための使いやすい GUI ツールが含まれています。

  • サーバー側セッションは業界標準です。アイデンティティに関する私の発言に続いて、少なくともこれを保存します。

    $_SESSION['openid'] = $openid->identity;
    
  • 生成したユーザー データをセッション間で維持する必要がある場合は、セッションに加えてデータベースが必要になります。(それはあなたのニーズに依存します。)

編集:

リクエストの有効期限が切れているため、2 回検証することはできません。これはセキュリティ機構です。再利用する必要がある場合は、変数に格納します。

$is_valid = $openid->validate();
echo 'User ' . ($is_valid ? $openid->identity . ' has ' : 'has not ') . 'logged in.';
if ($is_valid) {
    $_SESSION['auth'] = true;
}
于 2013-04-11T16:00:02.313 に答える