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 には、私が完全には理解していないことがたくさんあることを認めなければなりません。そのため、将来の読者に役立つかもしれないいくつかのメモまたは「事実」を保持しようとします.
- OpenID 属性のリスト
- 質問:すべてのスキーマ URL で 404 ( http://schemas.openid.net/ ) または奇妙なエラー ( http://axschema.org ) が発生するのはなぜですか?
- 追加の質問: レスポンシブ スキーマ URL を持つことは、仕様の実装にとって重要だと思いました。そうでない場合、そのような URL のポイントは何ですか?
- 一般的な OpenID プロバイダー URL のリスト