Ruby-OpenID: запрос адреса электронной почты от провайдера OpenID - PullRequest
10 голосов
/ 25 апреля 2009

Я играю с authlogic-example-app , и мне не удается получить адрес электронной почты от поставщика OpenID (в моем случае: Google и Yahoo) при регистрации пользователя, соответственно , Я получаю пустой ответ вместо адреса электронной почты (см. Комментарии в приведенном ниже коде).

Вот так выглядит моя пользовательская модель (все остальное похоже на ветвь with_openid вышеупомянутого приложения authlogic-example-app). Помимо отсутствующего «email», процесс openid-authentication работает как положено:

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 ? Или еще лучше: у вас есть рабочий пример?

Обновление : я проверил API аутентификации аккаунта Google и сравнил запрос, отправленный authlogic (используя ruby-openid-gem и openid-authentication-plugin ) с примером запросов в документах API аутентификации аккаунта 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

Запрос, поданный моей заявкой :

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 на эту тему !

Ответы [ 5 ]

10 голосов
/ 01 мая 2009

Поскольку никто не мог мне помочь, я помог себе. : -)

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

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

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

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

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

3 голосов
/ 11 июля 2009

Хотя это указывало мне в правильном направлении, мне нужно было:

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

Это вытащил письмо и установил его.

2 голосов
/ 05 октября 2009
# 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 голосов
/ 04 февраля 2010

дело в том, что я могу получить параметры у провайдера, но не могу извлечь их из ответа ... я использовал OpenID :: AX :: FetchResponse.from_success_response (open_id_response) как объект для хранения ответа ... какой метод я использую для извлечения электронной почты, псевдонима, страны и т. д. ...

0 голосов
/ 29 апреля 2009

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

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

...