Ruby-OpenID:OpenID プロバイダーからの電子メール アドレスの要求
-
16-09-2019 - |
質問
で遊んでます 認証ロジックの例-アプリ OpenID プロバイダーから電子メール アドレスを取得できません (私の場合:Google と Yahoo) ユーザーを登録するとき、それぞれ電子メール アドレスの代わりに空の応答が返されます (以下のコードのコメントを確認してください)。
私のユーザー モデルは次のようになります (他はすべて、上記の authlogic-example-app の "with_openid" ブランチのように見えます)。「電子メール」が欠落していることに加えて、openid-authentication-process は期待どおりに動作します。
class User < ActiveRecord::Base
acts_as_authentic do |c|
# not needed because I use OpenID
c.validate_login_field = false
# avoid failed validation before OpenID request
c.validate_email_field = false
# this one sets 'openid.sreg.required=email'
c.required_fields = [:email]
end
private
# overwriting the existing method in '/lib/authlogic_openid/acts_as_authentic.rb'
def map_openid_registration(registration)
# this is my problem: 'registration' is an empty hash
self.email ||= registration[:email] if respond_to?(:email) && !registration[:email].blank?
end
end
これを解決する方法はありますか?ここで使用する前にこれを行った人はいますか 本物の論理?あるいはさらに良いのは:実用的な例はありますか?
アップデート:を確認しました Googleアカウント認証API によって提出されたリクエストを比較しました 本物の論理 (使用して ルビー-openid-gem そして openid認証プラグイン) とともに リクエストの例 Google アカウント認証 API のドキュメント:
Google によるメールアドレスの認証と取得のリクエストの例:
https://www.google.com/accounts/o8/ud
?openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0
&openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select
&openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select
&openid.return_to=http%3A%2F%2Fwww.example.com%2Fcheckauth
&openid.realm=http%3A%2F%2Fwww.example.com%2F
&openid.assoc_handle=ABSmpf6DNMw
&openid.mode=checkid_setup
&openid.ns.ext1=http%3A%2F%2Fopenid.net%2Fsrv%2Fax%2F1.0
&openid.ext1.mode=fetch_request
&openid.ext1.type.email=http%3A%2F%2Faxschema.org%2Fcontact%2Femail
&openid.ext1.required=email
私のアプリケーションによって送信されたリクエスト:
https://www.google.com/accounts/o8/ud
?openid.assoc_handle=AOQobUcdICerEyK6SXJfukaz8ygXiBqF_gKXv68OBtPXmeafBSdZ6576
&openid.ax.mode=fetch_request
&openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select
&openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select
&openid.mode=checkid_setup
&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0
&openid.ns.ax=http%3A%2F%2Fopenid.net%2Fsrv%2Fax%2F1.0
&openid.ns.sreg=http%3A%2F%2Fopenid.net%2Fextensions%2Fsreg%2F1.1
&openid.realm=http%3A%2F%2Flocalhost%3A3000%2F
&openid.return_to=http%3A%2F%2Flocalhost%3A3000%2Faccount%3Ffor_model%3D1%26_method%3Dpost%26open_id_complete%3D1
&openid.sreg.required=email
セットアップ全体をデバッグしているときに、次のことがわかりました。 openid認証プラグイン openid プロバイダーから受け取る応答に電子メールが含まれることはありません。これは、少なくとも理由を説明しています。 registration
ユーザーモデルのハッシュが空です...
アップデート:authlogic と openid をいじっている場合は、必ずチェックしてください。 このテーマに関する最新のレールキャスト!
解決
誰も助けてくれなかったので、自分で助けました。:-)
私の質問に対する簡単な答えは次のとおりです。
c.required_fields = [:email,"http://axschema.org/contact/email"]
この行を使用すると、アプリケーションは sreg と ax (Google がサポートするリクエスト タイプ) を使用して電子メール アドレスをリクエストします。
より詳細な答えと、authlogic-openid の実用的な実装を見つけることができます。 Javascript OpenID セレクター ここにあります:
http://github.com/vazqujav/authlogic_openid_selector_example/
他のヒント
これは私を正しい方向に導きましたが、私が必要としていたのは次のことでした。
c.openid_required_fields = [:email,"http://axschema.org/contact/email"]
これはメールを取得して設定しました。
# fetch email by ax
c.openid_required_fields = [
"http://axschema.org/contact/email",
"http://axschema.org/namePerson/first",
"http://axschema.org/namePerson/last",
"http://axschema.org/contact/country/home",
"http://axschema.org/pref/language"
]
これは @ で指定されたとおりに複数の値を取得します。 http://code.google.com/apis/accounts/docs/OpenID.html#Parameters
国名はまだ取り込めませんが…。名前、メールアドレス、言語は完璧に機能します。
OpenID シーケンスのすべての部分をデバッグできるため、管理する OpenID サーバーに対してテストします。Google の OpenID プロバイダーが正しいことを行っているという保証はありません。Verisign のサーバーと照合してみてください。少なくとも、Verisign のサーバーは正しい動作をするはずだと確信しています。 openid.sreg.required=email
分野。
あなたのコードスニペットは私には正しいように見えます。
問題は、プロバイダーからパラメーターをフェッチすることはできますが、応答からパラメーターを抽出することはできないということです...OpenID :: ax :: fetchResponse.from_success_response(open_id_response)をオブジェクトとして使用して、応答を保持しました...メールアドレス、ニックネーム、国などを抽出するにはどのような方法を使用すればよいですか...