0

ログインシステムにopenidを使用するWebサイトを作成しています(gmail / yahooアカウントでログイン)。許可されたユーザー(情報が既にDBに保存されているユーザー)のみがサイトにアクセスする必要があります。openid を使用すると、誰でも gmail/yahoo アカウントでログインできますが、DB に対して現在のユーザー情報を確認し、承認されたユーザーのみにアクセスを許可する方法がわかりません。openid の実装に lightopenid を使用しています。

安全な提案があれば教えてください。前もって感謝します。

4

4 に答える 4

3

ユーザーの OpenID 識別子をユーザー アカウントにリンクする必要があります。次に、ユーザーがログインしたときに、識別子がアカウントにリンクされているかどうかを確認します。その場合は、ログインを許可してください。そうでない場合は、ログインを拒否するか、識別子をアカウントにバインドできるようにします。

識別子は、OpenID プロバイダー (Gmail や MyOpenID など) によって返される一意の URL である必要があります。

于 2012-01-02T13:19:08.170 に答える
0

User-Case によると、そのような組み込みメカニズムはありません。あなたが目指しているのは、OpenId や OAuth プロトコルの一部ではないと考えています。

これらのプロトコルは、エンド ユーザーから提供されたユーザー ID/パスワードに基づいて、その側で認証を提供することに基づいて機能します。つまり、ユーザーにこれらのプロバイダーで自分自身を確認するように依頼でき、これらのプロバイダーは、ユーザーが認証されているかどうかを通知します。そこのシステムごとに1つかどうか。

サービスへのアクセスを誰に許可するかは、設計上の決定です。あなたの場合のように、あなたのデータベースに電子メールIDを持つユーザーにアクセスを許可したいのですが、あなたの側からサーバー側のコードを必要とするだけです。

ユーザーが OpenID システムからリダイレクトされたら、応答から電子メール ID を抽出し、DB に対してチェックを行い、このチェックに基づいてやりたいことを実行するだけです。

ただし、前進する前に、いくつかの側面を指摘したいと思います。

  1. 一部の OpenId システムはユーザーの電子メールを提供しないため、アプリケーションを設計する際にはこの事実を考慮してください。
  2. 別のケースでは、によって提案されているように、OpenID 識別子を使用して回避できます。bouke
于 2012-01-04T02:13:54.843 に答える
0

私は lightopenid のみの Hybridauthを使用していません

しかし、誰かが Google から私の openid を介してログインすると、その人のメール アドレスが提供されます。次に、その電子メールをデータベースに既に保存されているデータと比較し、それらをリンクします。

あなたが見つけるかもしれない問題は、一部のプロバイダーで電子メールアドレスが返されず、ユーザー名のみが返されることです. たとえば、私の Twitter ユーザーの一部は、ユーザー名のみで電子メール アドレスを持っていませんが、Google と Yahoo のみを使用している場合、これは問題にならない可能性があります。

于 2012-01-02T13:16:38.137 に答える
0

LightOpenID は例を提供します (ダウンロードしたファイルを見てください)。がインスタンスの場合$openidは、after returns にLightOpenID保存されている URL でユーザーを識別します。その文字列をデータベースにある文字列と照合し、結果を (たとえば) PHP セッションに保存します。ユーザーが検証されたら、必要がなければ URL を使用する必要はありません。必要に応じて、ローカル ユーザーの ID を使用できます。$openid->identity$openid->validate()TRUE

<?php
require 'openid.php';
try {
    # Change 'localhost' to your domain name.
    $openid = new LightOpenID('localhost');
    if(!$openid->mode) {
        if(isset($_POST['openid_identifier'])) {
            $openid->identity = $_POST['openid_identifier'];
            # The following two lines request email, full name, and a nickname
            # from the provider. Remove them if you don't need that data.
            $openid->required = array('contact/email');
            $openid->optional = array('namePerson', 'namePerson/friendly');
            header('Location: ' . $openid->authUrl());
        }
?>
<form action="" method="post">
    OpenID: <input type="text" name="openid_identifier" /> <button>Submit</button>
</form>
<?php
    } elseif($openid->mode == 'cancel') {
        echo 'User has canceled authentication!';
    } else {
        echo 'User ' . ($openid->validate() ? $openid->identity . ' has ' : 'has not ') . 'logged in.';
    print_r($openid->getAttributes());
    }
} catch(ErrorException $e) {
    echo $e->getMessage();
}
于 2012-01-10T11:21:29.063 に答える