Google APIにRefresh Tokenを返してもらうようにするには、acces-type=offline
、approval-prompt=force
でトークンを要求すると良いよって日本語・英語問わずそこかしこに書いてあります。
たとえば、Passportを使っていたらこんな感じにってね。
.get('/', passport.authorize('google-authz', {
failureRedirect: '/',
scope: [
'https://www.googleapis.com/auth/calendar',
'profile'
],
accessType: 'offline',
approvalPrompt: 'force',
session: false
}))
これでテストすると実際にRefresh Tokenを取得できて、「やったー!」って思うんだけど、2回目以降はRefresh Tokenが帰ってこないんです。しょぼーん。。。
あーでも無いこーでも無いと悩んだ挙句、見つけました。
Get refresh token google apiの中の小さなコメント
Edited answer to something that is working as this answer is old and no longer seems to work. I spent significant time trying this as there are multiple places saying to use this method. I finally read the documentation (which I should have done first) and it says you must use prompt=consent. Reference: developers.google.com/identity/protocols/… – Goblinlord Jan 5 at 0:49
Goblinlordさん、ありがとう!
分かってからよく見ると、Shahadat Hossain Khanさんも答えてました。
ということで、上の例は次のようにするのが正解みたい。
.get('/', passport.authorize('google-authz', {
failureRedirect: '/',
scope: [
'https://www.googleapis.com/auth/calendar',
'profile'
],
accessType: 'offline',
prompt: 'consent',
session: false
}))
こうすると、ちゃんと毎回Refresh Tokenを取得できました。
今日の教訓
I finally read the documentation (which I should have done first) ...
which I should have done first, which I should have ...
(゚◇゚)ゞ
ではまたね。