0

OmniAuth を使用して、Facebook からハッシュ データを正常にフェッチしました。「auth」に保存されています。

# extra=#] last_name="Jordan" link="http://www.facebook.com/michael" locale="en_US" middle_name="Ball" name="Michael Jordan" quotes="\"lalala\"\n\n\"lala\"" timezone=9 updated_time="2011-09-01T20:25:58+0000" username="mjordan82" verified=true>> info=# verified=true> provider="facebook" uid="123456879">

ユーザーモデルでは、次のようにします。

def self.create_with_omniauth(auth)
  create! do |user|
    user.provider = auth["provider"]
    user.uid = auth["uid"]
    user.name = auth["name"]
  end
end

データベースを確認したところ、プロバイダーとuidしか取得できませんでした。User.name 行が空でした。テストの結果、プロバイダーと uid 以外のデータを保存できないことがわかりました。たとえば、user.name = auth["provider"] または user.name = auth["uid"] は問題なく保存されましたが、user.name = auth["timezone"] または user.name = のようなものを試してみると、 auth["last_name"]、変数には何も格納されていませんでした。誰でもこれを修正する方法を知っていますか? user.name = auth["user_info"]["name"] も試しましたが、エラーが返されました。

user.name = auth["name"] が何も保存しない理由がわかりません。つまり、この場合、なぜ auth["name"] が "Michael Jordan" ではないのでしょうか?

4

1 に答える 1

2

キーはこれでした:私は間違った方法で認証ハッシュにアクセスしていました. 答えはあなたです

user.name = auth["info"]["name"]

認証ハッシュに関する詳細情報は次のとおりです。

:provider => 'facebook',
:uid => '1234567',

:info => {
 :nickname => 'jbloggs',
 :email => 'joe@bloggs.com',
 :name => 'Joe Bloggs',
 :first_name => 'Joe',
 :last_name => 'Bloggs',
 :image => 'http://graph.facebook.com/1234567/picture?type=square',
 :urls => { :Facebook => 'http://www.facebook.com/jbloggs' },
 :location => 'Palo Alto, California',
 :verified => true
},
:credentials => {
 :token => 'ABCDEF...', # OAuth 2.0 access_token, which you may wish to store
 :expires_at => 1321747205, # when the access token expires (it always will)
 :expires => true # this will always be true
},
:extra => {
  :raw_info => {
  :id => '1234567',
  :name => 'Joe Bloggs',
  :first_name => 'Joe',
  :last_name => 'Bloggs',
  :link => 'http://www.facebook.com/jbloggs',
  :username => 'jbloggs',
  :location => { :id => '123456789', :name => 'Palo Alto, California' },
  :gender => 'male',
  :email => 'joe@bloggs.com',
  :timezone => -8,
  :locale => 'en_US',
  :verified => true,
  :updated_time => '2011-11-11T06:21:03+0000'
}

ソース: https://github.com/mkdynamic/omniauth-facebook

これが、auth["provider"] だけで "provider" と "uid" にアクセスできる理由であり、そうする必要がありました。

auth["info"]["name"] 

名前情報にアクセスします。

同様に、ユーザーのタイムゾーンを取得するには、次のようにします。

auth["extra"]["timezone"]
于 2012-11-13T06:51:27.193 に答える