概要
SorceryのExternalを使ってTwitterログイン機能を実装中のエラー解消。
とりあえずこの記事を参考に解消しようとしたけど無理だったのでデバッグしていくことにした。
ブラウザのエラー画面
ログインボタンでOauthsController/oauth
へリクエスト、コールバックで401 Authorization Required
ログをみる
log/development.log
うまくリダイレクトできてないようだが原因がわからない
Unpermitted parameters: :oauth_token, :oauth_verifier
があるのでOauthsController/auth_paramsへ追加してみるもエラーは変わらず。
binding.pryで止めてみる
login_from(provider)
ここでtrueでもfalseでもnilでもなくエラーが入っている?
最終行にfrom/Users/...consumer.rb:236
とあるのでgemの中を見に行く。
consumer.rbでpry
1回目
Twitter側に行く際の挙動?
response
200
response.body
oauth_tokenとoauth_token_secretが格納されている
問題なさそうなのでexit
で抜ける
2回目
Twitter側で認証処理をする?
response
200
response.body
oauth_tokenとoauth_token_secretが格納されている
1回目と全く同じ
exit
で抜ける
3回目
アプリ側に戻ってくる(コールバック)時の処理?
response
401 Authorization Required
response.body
Error processing your OAuth request: Invalid oauth_verifier parameter
やっと検索できそうなエラーメッセージが出てきたので検索。
Error processing your OAuth request: Invalid oauth_verifier parameter
片っ端から見ていったけどどれもうまくいかない。
コールバック処理っぽい時にエラー出てたのでそこら辺を見ていくことに。
コールバックあたりをごにょごにょ
[Twitter Developerに登録してるコールバックURL]
クエリがついてるかついてないかだけでURLの整合性は取れている。
ここで詰みかける。
他のURLでも試そうと思いngrok
なるものを使ってみた。
ngrokでローカル環境を外部に公開
この記事を参考にセットアップする。
一時的にドメインを取得できる?感じのツールだと認識している。
$ brew cask install ngrok
$ ngrok http 3000
ngrok by @inconshreveable (Ctrl+C to quit)
Session Status online
Session Expires 5 hours, 17 minutes
Version 2.3.35
Region United States (us)
Web Interface http://127.0.0.1:4040
Forwarding http://377716c9.ngrok.io -> http://localhost:3000
Forwarding https://377716c9.ngrok.io -> http://localhost:3000
サーバー再起動を忘れずに
ctrl + c
$ rails s
http://377716c9.ngrok.io
へアクセス
ログインしてみると・・・成功した!!!!!!!!!!!!
なんで?
解決
2つの違いを比べてみるとコールバックURLが完全一致してるかどうかだけ。
試しにhttp://localhost:3000/
ではなくhttp://127.0.0.1:3000/
にアクセスしてログインすると成功した。
127.0.0.1
はIPアドレスでそのドメインがlocalhost
なので同じ意味だろうと高を括っていたのが原因でした。
※ SorceryのGithubだとコールバックURLがhttp://0.0.0.0:3000/oauth/callback?provider=facebook
になってるから、この設定でhttp://localhost:3000
にアクセスするとエラーでるから気をつけて。