2010-10-17 18 views

Répondre

0

request.env [ 'omniauth.auth'] devraient avoir ce que vous avez besoin. Pour Twitter, il retourne quelque chose comme

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

Inspectez-le pour openid.

+2

ce qu'il renvoie pour twitter et openid sont complètement différents. – cbrulak

2

Vous pouvez trouver this Railscast (towards the end) par Ryan Bates utile pour capturer une adresse e-mail lors de l'authentification via OpenID. Pour les autres champs disponibles, je suppose que vous pouvez ajouter quelque chose de ce qui suit à votre contrôleur authentifications lors de la demande d'authentification

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

puis se connecter via OpenID et voir quelles sont les options que vous avez. ['Omniauth.auth'] contiendra la réponse complète du rappel.

+1

Cela ne fonctionnera pas - pas beaucoup d'options sont disponibles par défaut avec openid. La question est de savoir comment les rendre disponibles, pas comment les récupérer depuis request.env. –

+0

Ah, ma mauvaise. Je suppose que j'ai mal compris: / – kbjerring

0

request.env Mais tous les fournisseurs ne renvoient pas l'email de l'utilisateur (Twitter ne le fera pas). OpenID via google ou yahoo devrait avoir un email dans le hash 'user_info'.

4

Demandez-vous comment demander ces données ou comment vous assurer de les obtenir? Vous pouvez demander des données en utilisant les attributs OpenID AX, mais un fournisseur OpenID n'est pas obligé de répondre à ce que vous demandez. Cela devrait être d'une aide si:

Retrieve OpenID AX attributes from Google/Yahoo in Rails

Il semble que Google répondra avec un e-mail uniquement à

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

alors que Yahoo répondra à

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

Il y a quelques instructions pour cela sous la section "Google" openID dans les documents d'intégration Devise omniauth:

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

Rechercher la méthode de classe find_for_open_id dans le modèle de l'utilisateur et la sous-classe de contrôleur Users::OmniauthCallbacksController pour la façon dont les données sont transmises par le hachage request.env["omniauth.auth"]. Cela concerne toute stratégie OpenID, pas seulement Google.

En ce qui concerne la personnalisation exacte des attributs que vous demandez au fournisseur OpenID, il est préférable de créer votre propre clone de la gemme omniauth_openid ou de la sous-classer et de modifier le options. (Voir: https://github.com/intridea/omniauth-openid/blob/master/lib/omniauth/strategies/open_id.rb)

0

Lorsque vous configurez omniauth dans votre bloc d'initialisation, vous pouvez remplacer toutes les options, y compris les champs obligatoires et facultatifs. Selon les docs, utilisez le Builder pour obtenir ce dont vous avez besoin configuré. 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