Ruby-OpenID: запрос адреса электронной почты от провайдера OpenID

Я играю с приложением 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-authentication никогда не получает электронное письмо в ответе, полученном от провайдера openid, это как минимум объясняет, почему registration хеш в моей пользовательской модели пуст...

ОБНОВЛЕНИЕ: Если вы играете с authlogic и openid, не забудьте проверить последнюю версию Railscast на эту тему!

5 ответов

Решение

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

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

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/

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

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

Это вытащил в электронной почте и установить его.

# 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

Хотя я все еще не могу найти название страны... имя, адрес электронной почты, язык работает отлично!

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

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

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

Другие вопросы по тегам