ウェブサイト検索

rest - OAuth2トークンをどのようにリフレッシュできますか?トークンが期限切れになるのを待つ必要がありますか?(Patreon API)


私はPatreonのAPIを使ってOAuthを試しています。私はOAuthのプロセスに非常に不慣れで、リクエストの管理を手助けするためにPatreonのJavascriptパッケージを使っていました。

  • NPM: https://www.npmjs.com/package/patreon
  • Patreon ドキュメンテーション: https://docs.patreon.com/#introduction

これまでのところ、次の方法でトークンを正常に取得することができました:

import * as patreon from 'patreon';
const patreonOAuthClient = patreon.oauth(clientId, clientSecret);
patreonOAuthClient.getTokens(oauthGrantCode, redirectURL).then((tokenResponse) => { 
     console.log(tokenResponse);
})

私が受け取るトークンはこのように出力されます:

   // Example Token from getTokens()'s then()-response
   tokenResponse = {
        access_token: "UbHYT3H51GpeYueBeBuvBj1fnEFzv5A5870s_rYeMHo",
        expires_in: 2678400,
        refresh_token: "AP5aAw-gJbVf35tWxQb74rmJJz2MhwIYq660m0jiZQ4",
        scope: "my-campaign pledges-to-me users",
        token_type: "Bearer",
        version: "0.0.1"
    }

ローカルサーバーで、毎月ユーザーに許可を求め続ける必要がないように、リフレッシュトークンを動作させようとしています。

ただし、リフレッシュトークンの方法を使用すると、400 Bad Request が返されます:

patreonOAuthClient.refreshToken(tokenResponse).then(response => {
      console.log(response, 'success!');
}).catch(err => {
      console.log(err, ':(');
});

npmのドキュメントには表示されていませんが、patreonのGitHubのソースコードでrefreshToken()を見つけることができます。

彼らのAPIドキュメントによると:

トークンが期限切れになった後、最新の情報を取得したい場合は、翌月に使用するための新しいトークンが発行されることがあります。トークンを更新するには、例のように refresh_token の grant type を使用してトークンエンドポイントに POST リクエストを送信してください。また、クライアントページの該当するクライアントで手動でトークンを更新することもできます。

では、私が400エラーを受け取っている理由は、トークンをリフレッシュするために1か月待つ必要があるからでしょうか、それとも単にAPIの実装を間違えているのでしょうか?OAuthの経験が豊富な方に、トークンが期限切れになる前に、または期限切れ後にトークンリフレッシュを行うべきか教えてもらえると助かります。

(有効期限が切れる前に更新する場合、月が切れる前に実行するように Express サーバーをタイミング設定する方法はありますか?各トークンにタイムアウトを追加すると、メモリ的に非常に悪いと思うのですが)。

回答 #1

ようやくSDKを動かすことができました。ソースコードからは、トークンはレスポンスから受け取ったオブジェクトだと考えていました。しかし、実際にはトークンは文字列の値であることがわかりました。

だから:

// Using tokenResponse.refresh_token instead of just tokenResponse
patreonOAuthClient.refreshToken(tokenResponse.refresh_token).then(response => {
      console.log(response, 'success!');
}).catch(err => {
      console.log(err, ':(');
});