2009-04-25 10 views
10

私はauthlogic-example-appで遊んでいますが、私はOpenIDプロバイダ(私の場合はGoogleとYahoo)から電子メールアドレスを取得できません。 resp。私は電子メールアドレスの代わりに空の応答を得ます(下記のコードのコメントを確認してください)。Ruby-OpenID:OpenIDプロバイダの電子メールアドレスを要求しています

これは、私のユーザーモデルがどのように見えるか(他のすべては上記のauthlogic-example-appの "with_openid"ブランチのように見えます)です。不足している「電子メール」以外に、openid認証プロセスは期待通りに機能します。

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 

これを解決する方法はありますか? authlogicを使用する前に誰でもこれを行っていますか?またはそれ以上:あなたは実例がありますか?

更新:私はGoogleアカウント認証APIドキュメントにexample requestsGoogle Account Authentication APIをチェックしauthlogicが提出した要求を比較した(ruby-openid-gemopenid-authentication-pluginを使用して):


認証し、フェッチする例要求を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 
私appliationが提出した

要求:全体のセットアップをデバッグしている間

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-authentication-pluginは、少なくとも、それはOpenIDプロバイダからの受信応答にこのメールを受け取らないことが判明しました私のユーザーモデルでregistrationハッシュが空である理由を説明する...

UPDATE:あなたはauthlogicとのOpenIDで遊んでいる場合は、latest railscast on this subjectをチェックアウトすることを忘れないでください!

答えて

10

誰も助けなかったので、私は自分自身を手伝った。 :-)

私の質問への短い答えは:この行を使用して

c.required_fields = [:email,"http://axschema.org/contact/email"] 

は、アプリケーションがSREGと斧(Googleがサポートリクエスト型)を使用して電子メール・アドレスを要求します。

あなたはここJavascript OpenID-Selectorと、より詳細な回答とauthlogic-openidのの作業の実装を見つけることができます:

http://github.com/vazqujav/authlogic_openid_selector_example/

+0

これらのフィールドが有効なときにエラーが発生します...未定義メソッド 'required_fields = 'for# ...なし: #c.required_fields = ["http://axschema.org/contact/email"] #sregでメールを取得 #c.optional_fields = ["email"]それが動作します。 – holden

+0

@holden:あなたが提出したgithub-issueへの返信としてこれを扱った。 – Javier

+0

このフォークに興味があるかもしれません。READMEによると、いくつかのSRegとAXの選択を扱うことになっています:https://github.com/binaryfeed/open_id_authentication - 私は実際に質問、それだけでは、それはトピックに関連するようです。 – lindes

0

あなたがコントロールするOpenIDサーバーに対してテストすると、OpenIDシーケンスのすべての部分をデバッグできるようになるためです。 GoogleのOpenIDプロバイダが正しいことをしているという保証はありません。フィールドで少なくとも正しいことをする必要があることを確かめているので、Verisignのサーバーと照合してみてください。

あなたのコードスニペットが私に似ています。

3

これは正しい方向に私を指摘している間、私は必要なことだった。

c.openid_required_fields = [:email,"http://axschema.org/contact/email"] 

これは電子メールを取り込んで設定しました。

2
# 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

@指定されたとおり、私はまだ国の名前にフェッチすることができないんだけどこれは複数の値にフェッチ...名前、電子メール、言語が完璧に動作します!

0

事は、私はOpenIDを使用しているプロバイダからパラメータを取得することができていますが、応答からそれらを抽出することはできませんよ... です:: AX :: FetchResponse.from_success_response(open_id_response) を対象としてどのような方法で電子メール、ニックネーム、国などを抽出するのですか?

関連する問題