LoginSignup
3
2

More than 1 year has passed since last update.

[Rails][Devise][Carrierwave]を使ってTwitter認証でprofile画像を取得する方法

Last updated at Posted at 2020-04-12

はじめに

(*注意:この記事は学習の一環として実装した物の一部を記事にしています。又、技術的に最適な方法ではない可能性があります。)

omniauth-twitter,devise,carrierwaveを使って
twitteのプロフィール情報(:name, :image)を取得する機能を実装しておりました。
twitter認証を使って取得する際にprofile画像(auth.info.image)nullで返ってきてしまい大変ハマってしまったのですが解決できたので解決方法を載せておきます。
画像が保存される先はuploads/tmpになております。

注意:twitter認証時に取得した画像はuploads/tmpに保存される構成です。
uploads/tmp以外のフォルダに保存されるような実装はしていませんのでご理解の程よろしくお願いします。

Userの[image]がnullで返ってくる

  • user.image = auth.info.image (nullが返ってくる。)
  • デフォルトでアイコン画像が入るようにしているのでimageにはpresence: trueにはしておりません。

環境

  • rails (5.2.4.1)
  • carrierwave (2.1.0)
  • devise (4.7.1)
  • omniauth-twitter (1.4.0)

omniauth-twitter+devise

Deviseomniauth-twitterの実装手順は省略します。

実装手順を確認したい方は
こちらを確認してください。

ハマった部分は少し載せます。、、
上記Linkのoverviewのコードではこのようになってます↓

app/model/user.rb

#アバター用のアップローダーをユーザーモデルに紐付け
  mount_uploader :image, AvatarUploader 

def self.from_omniauth(auth)
  where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
    user.email = auth.info.email
    user.password = Devise.friendly_token[0, 20]
    user.name = auth.info.name  
    user.image = auth.info.image #←ここ! nullが返ってきた。or #ActionDispatch::Cookies::CookieOverflow が返ってきた。
  end

private

  # メールアドレスはダミーのメールアドレスを作成します
  def self.dummy_email(auth)
    "#{auth.uid}-#{auth.provider}@example.com"
  end
end

解決方法

原因はcarrierwave,Overview
Uploading files from a remote location
に記載されている事の確認不足でした。
解決方法はいたって簡単でした。

user.image or image:user.remote_image_urlorremote_image_urlに変更すればいいだけです。
carrierwaveのアップローダーを:imageにマウントさせてるのでクロスドメインで情報を取得する場合は:imageの部分を変更してあげる必要があります

carrierwaveの使う時のkey:の書き方

def self.from_omniauth(auth)
  where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
    user.email = User.dummy_email(auth)
    user.password = Devise.friendly_token[0, 20]
    user.name = auth.info.name  
    user.image = auth.info.image #←ここを
    user.remote_image_url = auth.info.image #に変更してあげる
  end

key:に値を入れるパターンも一緒です。

def self.from_callback(auth)
  user = User.where(provider: auth.provider, uid: auth.uid).first
  unless user
    user = User.create(
      email:            User.dummy_email(auth),
      password:         Devise.friendly_token[0, 20],
      name:             auth.info.name,
      image:            auth.info.image #←ここを
      remote_image_url: auth.info.image #に変更する
  end
  user
end
)

これでクロスドメイン経由でtwitterのprofile画像が取得できました。

参考

3
2
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2