מנוחה - איך אני יכול לרענן אסימון OAuth2? האם אני צריך לחכות שהאסימון יפוג? (API של Patreon)
אני מנסה את OAuth באמצעות ה-API של Patreon. אני חדש מאוד בתהליך ה-OAuth והייתי משתמש בחבילת Javascript של Patreon כדי לעזור לנהל את הבקשה בשבילי.
- 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 בקשה רעה:
patreonOAuthClient.refreshToken(tokenResponse).then(response => {
console.log(response, 'success!');
}).catch(err => {
console.log(err, ':(');
});
זה לא מופיע בתיעוד של npm אבל אתה יכול למצוא את refreshToken() בקוד המקור של Patreon ב-GitHub.
לפי כאן במסמכי ה-API שלהם:
אם אתה מעוניין לקבל מידע עדכני לאחר שהאסימון פג תוקפו, ייתכן שיונפק אסימון חדש שישמש לחודש הבא. כדי לרענן אסימון, בצע בקשת POST לנקודת הקצה של האסימון עם סוג ההענקה refresh_token, כפי שמוצג בדוגמה. ניתן גם לרענן את האסימון באופן ידני בלקוח המתאים בדף הלקוחות שלך.
אז האם הסיבה שאני מקבל 400 היא כי אני צריך לחכות חודש כדי לרענן את הטוקן או שאני פשוט מיישם את ה-API בצורה לא נכונה? אני מקווה שמישהו עם יותר ניסיון ב-OAuth יוכל להגיד לי אם אנחנו צריכים לבצע רענון טוקן לפני או לאחר שהטוקן פג תוקפו?
(אם תעדכן את זה לפני שפג התוקף, האם יש דרך מסוימת לכוון שרת Express לעשות זאת לפני שהחודש יפוג? כי אני חושב שהוספת timeout לכל אסימון תהיה ממש גרועה לזיכרון).
תשובה #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, ':(');
});
