10

私はauthlogic-example-appで遊んでいますが、ユーザーを登録するときに OpenID プロバイダー (私の場合は Google と Yahoo) からメールアドレスを取得できません。電子メール アドレスではなく、空の応答が返されます (以下のコードのコメントを確認してください)。

これが私のユーザー モデルの外観です (他のすべては、上記の authlogic-example-app の「with_openid」ブランチのように見えます)。「email」がないことに加えて、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

これを解決する方法はありますか?authlogicを使用する前にこれを行った人はいますか? またはさらに良い: 実際の例はありますか?

更新: Google アカウント認証 APIを確認し、 authlogicによって送信された要求( ruby​​-openid-gemおよびopenid-authentication-plugin を使用) を、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-authentication-pluginが openid プロバイダーから受信した応答で電子メールを受信しないことがわかりました。これは、少なくともregistrationユーザーモデルのハッシュが空である理由を説明しています...

更新: authlogic と openid で遊んでいる場合は、この件に関する最新の Railscastをチェックすることを忘れないでください!

4

5 に答える 5

10

誰も私を助けてくれなかったので、私は自分自身を助けました。:-)

私の質問に対する短い答えは次のとおりです。

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

この行を使用して、アプリケーションは sreg と ax を使用して電子メール アドレスを要求します (Google がサポートする要求タイプ)。

ここで、 Javascript OpenID-Selectorを使用した authlogic-openid のより詳細な回答と実用的な実装を見つけることができます。

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

于 2009-04-30T23:14:09.350 に答える
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で指定されているように、複数の値をフェッチします

まだ国名を取得できませんが...名前、メールアドレス、言語は完璧に機能します!

于 2009-10-04T22:56:04.070 に答える
0

OpenID シーケンスのすべての部分をデバッグできるため、制御する OpenID サーバーに対してテストします。Google の OpenID プロバイダーが正しいことを行っているという保証はありません。openid.sreg.required=emailVerisign のサーバーをチェックしてみてください。少なくとも 1 つがフィールドに対して正しいことを行う必要があると確信しているためです。

あなたのコード スニペットは私にはぴったりです。

于 2009-04-29T13:26:11.643 に答える
0

問題は、プロバイダーからパラメーターをフェッチすることはできますが、応答からそれらを抽出することはできません...応答を保持するオブジェクトとして OpenID::AX::FetchResponse.from_success_response(open_id_response) を使用しました.. . メール、ニックネーム、国などを抽出するためにどのような方法を使用しますか...

于 2010-02-04T03:12:09.623 に答える