3

OpenID ライブラリ LightOpenID を使用して、ユーザーがお気に入りのプロバイダーにログインし、システムに情報を渡すようにしています。

LightOpenID を使用すると、次のようになります。

$openid = new LightOpenID('localhost');
if(!$openid->mode) {
    $openid->identity = 'https://www.google.com/accounts/o8/id';
    $openid->required = array(
        'country' => 'contact/country/home',
        'email' => 'contact/email',
        'firstname' => 'namePerson/first',
        'language' => 'pref/language',
        'lastname' => 'namePerson/last',
    );
    header('Location: ' . $openid->authUrl());
} elseif($openid->mode == 'cancel') {
    echo 'User has canceled authentication!';
} else {
    echo 'User ' . ($openid->validate() ? $openid->identity . ' has ' : 'has not ') . 'logged in.';
    echo '<pre>'.print_r($openid->data, true).'</pre>';
}

プロパティを設定するrequiredことで、OpenID プロバイダー (Google など) にユーザーの詳細を尋ねることができます。私の調べが正しければ、これを「属性交換」と呼んでいます。

さて、ここで私は問題を抱えています(これを短くするために):

1. 2、3 のプロバイダだけが、サポートする属性をリストしています。私はここで何かが欠けていると思います.プロバイダーがこれらの属性をリストすることは明らかだと思いました. ひょっとして、プロトコルを通じてこれらの属性を「発見」する方法はありますか?

2.これが私が直面している主な問題です。基本的に、要求した情報 (属性) は、ユーザーが正常にログインして承認した後にサーバーに渡されます。これは問題なく正常です。システムがそうしない限り、このデータの永続的なストレージはありません。ただし、問題は、ユーザーがログインしてからしばらくてからこのデータを取得する必要があることです。

Facebook でこれを行う必要がある場合は、$fb->api('/me');. 興味深いことに、ログインしているユーザーをログイン ページにリダイレクトすると、必要な情報を含む私の Web サイトにリダイレクトされます。しかし、このプロセスはサーバー上で行う必要があり、プロバイダーへの単純な CURL 要求ではこれらのフィールドを取得できないと思います。おそらく、元のログイン応答パラメーターの何かが役立つでしょうか?

TL:DR; ユーザーがログインした、永続ストレージなしで属性交換フィールドを取得するにはどうすればよいですか?

PS:セッションを永続ストレージとして使用しています。今のところ、openid ID URL を保存しているだけですが、必要に応じてさらに追加できます。ただし、openid ログイン応答で指定されたすべてのフィールド (名前、姓、電子メールなど) を保存することはできません。

その他のリンク/メモ

OpenID には、私が完全には理解していないことがたくさんあることを認めなければなりません。そのため、将来の読者に役立つかもしれないいくつかのメモまたは「事実」を保持しようとします.

4

2 に答える 2

3

OpenID は、OpenID+OAuth もサポートしない限り、そのようには機能しません。その場合、Facebook と同じことを行うことができます。API を呼び出して、ポジティブ アサーションで与えられたアクセス トークンを使用してユーザーの詳細を取得するだけです。

AX スキームは非常に柔軟です。たとえば、2 つの異なる URI を使用してフィールドを要求できます。一部のプロバイダーはサポートaxschemaし、他のプロバイダーはサポートしschema.openid.netます。

メールを求めるには 2 つの方法があります。さまざまなエイリアスを使用して含めるだけです。たとえば、次のようになります。

email1 = http://axschema.org/contact/email
email2 = http://openid.net/schema/contact/internet/email

この方法では、プロバイダーがサポートする属性の種類を事前に知る必要はありません。

編集

すべてのスキーマ URI が 404 になるのはなぜですか?

これは、実際にドキュメントとして存在する必要がないためです。これは単なる慣例です。

レスポンシブ スキーマ URL を持つことは、仕様の実装にとって重要であると考えました。そうでない場合、そのような URL のポイントは何ですか?

OpenID の実装者は、1 つの統一された属性タイプのセットに同意できませんでした。ここで読むことができるように、これは採用には悪いです。

于 2012-10-12T13:53:40.520 に答える
0

ユーザー情報の収集に関する情報を何とか見つけました(ログオン後、永続性なし)。

ここで最もよく説明されているようです:http://blogs.gnome.org/jamesh/2007/11/26/openid-ax/

于 2012-10-13T01:19:33.373 に答える