2009-04-25 6 views
10

Я играю с 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!

ответ

10

Как никто не мог мне помочь, я сам помог. :-)

Короткий ответ на мой вопрос:

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

Используя эту строку, приложение запрашивает электронный-адрес, используя Sreg и топор (запрос типа поддерживается Google).

Вы можете найти более подробный ответ и рабочую реализацию authlogic-OpenID с Javascript OpenID-Selector прямо здесь:

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

+0

Я получаю ошибки, когда эти поля включены ... undefined method 'required_fields = 'для # <Класс : 0x2643d84> ... без них: # c.required_fields = ["http://axschema.org/contact/email"] # извлечение электронной почты по sreg # c.optional_fields = ["email"] это работает. – holden

+0

@holden: Я рассматривал это как ответ на представленный вами github-вопрос. – Javier

+0

Вы также можете быть заинтересованы в этой вилке, которая (согласно README) предназначена для решения некоторых вариантов SReg по сравнению с AX: https://github.com/binaryfeed/open_id_authentication - я не уверен, что это на самом деле отвечает вашим вопрос, сам по себе, это просто похоже на тему. – lindes

0

Тест на сервер OpenID, которым вы управляете, поскольку он позволит вам отлаживать каждую часть последовательности OpenID. Нет никаких гарантий, что поставщик OpenID Google делает все правильно. Попробуйте проверить сервер Verisign, так как я уверен, что, по крайней мере, он должен поступить правильно с полем openid.sreg.required=email.

Ваш фрагмент кода выглядит правильно для меня.

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) в качестве объекта чтобы удержать ответ ... какой метод я использую для извлечения электронной почты, псевдонима, страны и т. д.

 Смежные вопросы

  • Нет связанных вопросов^_^