Code-for-SAKE / Sakepedia-Nuxt

日本酒オープンデータSakepediaのNuxt版
https://sakepedia.code4sake.org
20 stars 15 forks source link

登録していない人がGithubシングルサインオンできない #190

Closed tadanet3 closed 2 years ago

tadanet3 commented 2 years ago

一部の環境でGithubシングルサインオンに失敗する。 callback. Please Wait と表示されて、その状態から先に進まない。 image

GithubにはSakepedia Nuxtが追加されている。 image

デベロッパーツールで確認してみると、callback?code=***時に401エラーが発生している。 「サーバーからの応答に時間がかかっています。(786 ms)推奨される限界値は500msです。」 と出てるのが関係しているかも。 image

tadanet3 commented 2 years ago

GithutのSakepedia Nuxtを一旦Revokeしたり OSとブラウザを色々変えて(Ubuntu, Windows, Android, Firefox, Edge, Chrome)試してみましたが、解決しませんでした。

kaizumaki commented 2 years ago

ここ↓は、b-buttonのイベントにmethodsを割り当てるべきでは...?

https://github.com/Code-for-SAKE/Sakepedia-Nuxt/blob/b456fa77ec031a40afbce54e550eed96605c0ed9/pages/auth/login.vue#L15

nichesuch commented 2 years ago

ありがとうございます!

@click="githublogin" だと、CORSエラーになります!

nichesuch commented 2 years ago

envファイルが読み込めてない可能性がありそうなので、そこを確認中です。

kaizumaki commented 2 years ago

@click="githublogin" だと、CORSエラーになります!

なるほど。とするとプロキシ? StackOverflowで、似たような質問があがっています。 https://stackoverflow.com/questions/42150075/cors-issue-on-github-oauth

kaizumaki commented 2 years ago

githubloginのmethodsって、使ってないんですよね?ただ /api/auth/login に遷移しているだけだと、promise的なところでうまくいかないような気がします。

kaizumaki commented 2 years ago

あ、じゃなくて、むしろcallbackがうまくいっていないのか。

nichesuch commented 2 years ago

/api/auth/login ↓ api/route/auth.js内でpassport.authenticate('github')なのでgithubのログインが走る ↓ /page/callback.vue ここでplease wait ↓ /api/auth/callback ここで401

nichesuch commented 2 years ago

うまくいくと /api/auth/callback でuser情報もらって ↓ $storeにuser情報入れて /auth/account に遷移してます。

kaizumaki commented 2 years ago

/api/auth/callback ここで401

ここ↑で「Unauthorized」になるので、やっぱり何かしらのpromise的なやりとりがうまくいっていないんでしょうね。

kaizumaki commented 2 years ago

これは参考になるかな? https://github.com/jaredhanson/passport-github/issues/3#issuecomment-5608296

nichesuch commented 2 years ago

GitHub側のOAuth Appsの設定では以下になっています。 https://sakepedia.code4sake.org/callback

kaizumaki commented 2 years ago

素朴な疑問。 ここでgetする先は '/callback' では...? https://github.com/Code-for-SAKE/Sakepedia-Nuxt/blob/b456fa77ec031a40afbce54e550eed96605c0ed9/api/routes/auth.js#L59

nichesuch commented 2 years ago

router.getは、設定で、getしているわけではないはず。

/api/auth/callbackをここで処理しますよ。 の意味だったと思います。

nichesuch commented 2 years ago

passport.authenticate('github') の部分がpassportで認証させようとしているところです。

callbackの方はもしかして要らない?

nichesuch commented 2 years ago

だいたい以下と同じことをしているはず。 https://qiita.com/reireias/items/2bc1b33dfb0e63f31517

nichesuch commented 2 years ago

StrategyにcallbackURLが設定されてないのが原因かも!

kaizumaki commented 2 years ago

お? router.get の第一引数にアクセスして、第二引数を処理するのかと思ってました。

router.get(
  '/auth/login',
  passport.authenticate('github', { scope: ['user:email'] })
);
router.get('/auth/callback', passport.authenticate('github'), (req, res) => {
  res.json({ user: req.user });
});
router.get('/auth/logout', (req, res) => {
  req.logout();
  res.json({});
});
nichesuch commented 2 years ago

User作る時に、unique設定されているnameがないのが原因でした。 結構前からこの状態なので、なぜ今まで動いていたのか。。。

nichesuch commented 2 years ago

本番環境は手修正済み。 整理してからPR出す予定。

tadanet3 commented 2 years ago

Githubシングルサインオンできる事を確認しました。