Я играю с authlogic-example-app, и я не получаю адрес электронной почты от провайдера OpenID (в моем случае: Google и Yahoo), когда я регистрирую пользователя, соответственно Я получаю пустой ответ вместо адреса электронной почты (проверьте комментарии в коде ниже).Ruby-OpenID: Требуется адрес электронной почты от провайдера OpenID
Как выглядит моя пользовательская модель (все остальное выглядит как «with_openid» -страница приложения authlogic-example, упомянутого выше). Кроме того, не хватает «электронной почты», то 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? Или еще лучше: у вас есть рабочий пример?
Update: Я проверил Google Account Authentication API и сравнил запрос, представленный authlogic (с использованием ruby-openid-gem и openid-authentication-plugin) с example requests по API Docs аутентификации учетной записи Google:
Пример запроса аутентификации и выборки адрес электронной почты от 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!
Я получаю ошибки, когда эти поля включены ... undefined method 'required_fields = 'для # <Класс : 0x2643d84> ... без них: # c.required_fields = ["http://axschema.org/contact/email"] # извлечение электронной почты по sreg # c.optional_fields = ["email"] это работает. – holden
@holden: Я рассматривал это как ответ на представленный вами github-вопрос. – Javier
Вы также можете быть заинтересованы в этой вилке, которая (согласно README) предназначена для решения некоторых вариантов SReg по сравнению с AX: https://github.com/binaryfeed/open_id_authentication - я не уверен, что это на самом деле отвечает вашим вопрос, сам по себе, это просто похоже на тему. – lindes