質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

4476閲覧

【ローカル】 rails+OmniauthでTwitterログインの実装の際のルーティングエラーが解決できません

kurohane3536

総合スコア10

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2018/10/02 03:00

rails+OmniauthでTwitterログインの実装

railsとOmniauthでTwitterログイン機能を実装しようとしています。
ルーティングエラーが解決せず、困っています。アドバイスなどよろしくお願いします。

Userモデル作成済み。

rails、sqlite3 最新のバージョンを使用しています。
ローカルで開発中です。

発生している問題・エラーメッセージ

No route matches [GET] "/auth/twitter"

該当のソースコード

ruby

1gem 'omniauth' 2gem 'omniauth-twitter' 3 4$bundle install 5 6#/config/initializers/omniauth.rb 7Rails.application.config.middleware.use OmniAuth::Builder do 8 provider :twitter, 'API key', 'API secret' 9end 10 11 12#/app/models/user.rb 13def self.find_or_create_from_auth(auth) 14 provider = auth[:provider] 15 uid = auth[:uid] 16 username = auth[:info][:name] 17 userimage = auth[:info][:image] 18 19 User.find_or_create_by(provider: provider, uid: uid) do |user| 20 user.username = username 21 user.userimage = userimage 22 end 23 end 24 25 26#/app/controllers/users_controller.rb 27def create 28 user = User.find_or_create_from_auth(request.env['omniauth.auth']) 29 session[:current_uid] = user.uid 30 flash[:notice] = "ログインしました" 31 redirect_to("/#{@user.uid}") 32 end 33 34 35#/config/routes.rb 36get 'auth/:provider/callback' => 'users#create' 37 38 39#view 40<%= link_to("ログイン", "/auth/twitter") %> 41

試したこと

Twitter DevelopersのコールバックURLは
http://127.0.0.1:3000/auth/twitter/callback
http://127.0.0.1:3000/auth/twitter
を設定してあります。
WebsiteのURLは127.0.0.1:3000やlocalhost:3000を入力すると、Invalidとなるため適当なURLにしてあります。

users/auth/.....
user/auth/....
でも試してみましたが、変わらずルーティングエラーになります。

リンクを/auth/twitter/callbackとすると

NoMethodError in UsersController#create
undefined method `[]' for nil:NilClass
Extracted source (around line #17):

16 def self.find_or_create_from_auth(auth)
17 provider = auth[:provider]
18 uid = auth[:uid]
19 username = auth[:info][:name]
20 userimage = auth[:info][:image]

と出てきました。

これはローカルなこと、ドメインを取得していないこと、そしてWebsiteURLの設定がローカルで使っているURLと違うことと関係しているのでしょうか?
検索してみたところ、データベースに保存うんぬんはおいといて、Twitterと連携自体は成功している、と書いていた方もいたのですが、ローカルでもエラーなしで実装することはできないのでしょうか。

今回初めてRailsとTwitter APIで開発している初心者です。
アドバイスよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

試しにHerokuにデプロイしてみるとTwitterのログイン認証画面につながり、無事ログインさせることができました。
やはりWebsiteのURLがローカルで動かしているアドレスと違ったためと思われます。

あとで試しに、ローカルに戻ってやり直してみると依然としてルーティングエラーになりました。

投稿2018/10/04 04:18

kurohane3536

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ルーティングエラーが解決せず、困っています

コードが載っていないようなのでわかりませんが、routes.rbが設定できていないとかではないですか?
僕も今年5月末くらいに触ってみたんですが、$ rails routesがこんな感じになってます。
ただdeviceと併用してたので差異があるかもしれないです。

bash

1$ rails routes 2user_twitter_omniauth_authorize GET|POST /users/auth/twitter(.:format) users/omniauth_callbacks#passthru 3user_twitter_omniauth_callback GET|POST /users/auth/twitter/callback(.:format) users/omniauth_callbacks#twitter

WebsiteのURLは127.0.0.1:3000やlocalhost:3000を入力すると、Invalidとなるため適当なURLにしてあります。

僕がやってた頃はできたんですが...変わったんですかね...?

リンクを/auth/twitter/callbackとすると ~

リンクってURLってことですかね、request.env['omniauth.auth']が取得できなかったからじゃないですか?

投稿2018/10/02 04:10

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kurohane3536

2018/10/02 05:12

お早い回答ありがとうございます。 routes.rb内のログインに関するコードは記載したつもりなのですが、 get 'auth/:provider/callback' => 'users#create' ではないという意味でしょうか? ログイン実装に関してはネットの情報だけを頼りにやっているもので、データベースにユーザー情報を格納するのになぜルーティングをgetだけでpostも作らないのか疑問に感じています。 それともAPIを介して取得したユーザー情報は自分のデータベースに格納されるわけではなくて、外部のデータベースから取ってくる?参照する?だけにとどまるからgetだけで十分なのでしょうか? ルーティングのエラーということでコンソール内でルーティングを確認しましたが、やはりパスがありませんでした。 本来なら、提示いただきましたようなルーティングがリターンされるはずなのまではわかっているのですが、ならどうしたら通るようになるかがわからずじまいです。 ログイン実装に関するコードは上記に書きましたコードがすべてです。 twitter developersの仕様は7月末から変更されたそうです。 またリンクは #view <%= link_to("ログイン", "/auth/twitter/callback") %> と変更してみたこと意味しています。困惑させたようで失礼しました。
退会済みユーザー

退会済みユーザー

2018/10/02 05:20

> routes.rb内のログインに関するコードは記載したつもりなのですが ~ あぁすみません見落としてました。POSTはないのですね。 GETでもURLの後ろにパラメータを付与して渡すことができるので Twitterのコールバックの仕様がそうであるのならこれでも問題ないです。 確認はしてないのでTwitterのコールバックの仕様を確認してみては? > ルーティングのエラーということでコンソール内でルーティングを確認しましたが、やはりパスがありませんでした。 そういったものは提示していただかないとこれ以上何も言えることがありません。 > またリンクは ~ GETリクエストで何か渡す時はURLの後ろにパラメータを付与する必要があるのでやはりry
kurohane3536

2018/10/02 05:34

ご返信ありがとうございます。 $ rails routes|grep auth GET /auth/:provider/callback(.:format) users#create と表示されます。 Twitterのコールバックの仕様を確認してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問