我正在玩authlogic-example-app,而且当我注册用户时,我无法从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
知道如何解决这个问题吗?有没有人在使用authlogic之前完成此操作?甚至更好:你有一个有效的例子吗?
更新:我检查了Google Account Authentication API,并将authlogic(使用ruby-openid-gem和openid-authentication-plugin)提交的请求与{{3}进行了比较在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
在调试整个设置时,我发现example requests在从openid提供程序收到的响应中从未收到过电子邮件,这至少解释了为什么我的用户使用registration
哈希-model是空的......
更新:如果您正在使用authlogic和openid,请不要忘记查看openid-authentication-plugin!
答案 0 :(得分: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/
答案 1 :(得分:3)
虽然这指向了正确的方向,但我需要的是:
c.openid_required_fields = [:email,"http://axschema.org/contact/email"]
这引入了电子邮件并进行了设置。
答案 2 :(得分: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
获取多个值虽然我仍然无法获取国家名称...姓名,电子邮件,语言完美无缺!
答案 3 :(得分:0)
针对您控制的OpenID服务器进行测试,因为它可以让您调试OpenID序列的每个部分。无法保证Google的OpenID提供商正在做正确的事情。尝试检查Verisign的服务器,因为我非常确定至少应该使用openid.sreg.required=email
字段做正确的事情。
您的代码段对我来说很合适。
答案 4 :(得分:0)
问题是我能够从提供者处获取参数但是无法从响应中提取它们... 我使用过OpenID :: AX :: FetchResponse.from_success_response(open_id_response) 作为保持回复的对象...我用什么方法来提取电子邮件,昵称,国家等...