2010-10-17 2 views
6

Я использую рельсы gem: OmniAuth для входа в систему.OmniAuth & openid: получение определенных полей у провайдера openid

При использовании поставщика OpenId я хотел бы получить определенное поле, например, электронную почту и псевдоним, но я не вижу никакой документации по этому вопросу.

Любые идеи?

благодаря

ответ

0

request.env [ 'omniauth.auth'] должны иметь то, что вам нужно. Для Twitter он возвращает что-то вроде

{ 
    'uid' => '12356', 
    'provider' => 'twitter', 
    'user_info' => { 
    'name' => 'User Name', 
    'nickname' => 'username', 
    # ... 
    } 
} 

Просто осмотрите его для openid.

+2

то, что он возвращает для twitter и openid, совершенно разные. – cbrulak

2

Вы можете найти this Railscast (towards the end) от Ryan Bates, который полезен при регистрации адреса электронной почты при аутентификации через OpenID. Для других доступных полей, я думаю, вы можете добавить что-то из следующих действий к контроллеру авторизаций при выполнении запроса на аутентификацию

# authentications_controller.rb 
... 
def create 
    omniauth = request.env["omniauth.auth"] 
    raise omniauth.to_yaml 
    ... 
end 
... 

, а затем войти через OpenId и посмотреть, какие варианты у вас есть.

+1

Это не сработает - по умолчанию с openid доступны не многие опции. Вопрос заключается в том, как сделать их доступными, а не как их получить из request.env. –

+0

Ах, мой плохой. Думаю, я неправильно понял: / – kbjerring

0

request.env ['omniauth.auth'] будет содержать весь ответ от обратного вызова. Но не все провайдеры возвращают пользовательскую электронную почту (твиттер не будет). OpenID через google или yahoo должен иметь электронную почту как часть хеша «user_info».

4

Вы спрашиваете, как запросить эти данные или как обеспечить их получение? Вы можете запрашивать данные, используя атрибуты OpenID AX, но поставщик OpenID не обязан отвечать на запрос. Это должно иметь некоторую помощь, хотя:

Retrieve OpenID AX attributes from Google/Yahoo in Rails

Похоже, Google ответит по электронной почте только

http://schema.openid.net/contact/email 

а Yahoo будет отвечать на

http://axschema.org/contact/email 
1

Там какая-то инструкции для этого в разделе openID «Google» в документах интеграции Integration omniauth:

https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview

Посмотрите на метод класса find_for_open_id в модели пользователя и подкласс Users::OmniauthCallbacksController контроллера для того, как передаются данные через от request.env["omniauth.auth"] хэша. Это относится к любой стратегии OpenID, а не только к Google.

С точки зрения настройки, какие именно атрибуты вы запрашиваете у поставщика OpenID, вам может быть лучше сделать собственный клон жемчужины или подкласса omniauth_openid и изменить options. (См.: https://github.com/intridea/omniauth-openid/blob/master/lib/omniauth/strategies/open_id.rb)

0

При настройке omniauth в вашем блоке инициализации вы можете переопределить любые параметры, включая обязательные и необязательные поля. В соответствии с документами используйте Builder, чтобы получить то, что вам нужно настроить. EG:

config.middleware.use OmniAuth::Builder do 
     provider :open_id, :name => 'my_provider', 
       :identifier => 'https://myprovider.com/openid/xrds', 
       :required => ['http://axschema.org/namePerson/first','http://axschema.org/namePerson/last','http://axschema.org/contact/email','http://axschema.org/my_provider/some_field'] 
    end 
Смежные вопросы