Ruby-OpenID: требуется адрес электронной почты от поставщика OpenID

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

Вот как выглядит моя пользовательская модель (все остальное выглядит как "with_openid" -страница приложения authlogic-example, упомянутого выше). Помимо отсутствующего "сообщения электронной почты", процесс 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) с примерными запросами в аккаунте 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

При отладке всей установки я обнаружил, что openid-authentication-plugin никогда не получает письмо в ответ, который он получает от провайдера openid, это по крайней мере объясняет, почему хэш registration в моей пользовательской модели пуст...

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

Ответ 1

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

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

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/

Ответ 2

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

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

Это потянуло электронное письмо и установило его.

Ответ 3

# 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

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

Ответ 4

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

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

Ответ 5

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