簡體   English   中英

Firebase currentUser.getIdToken() 在 signInWithCustomToken 之后返回自定義令牌

[英]Firebase currentUser.getIdToken() returns custom token after signInWithCustomToken

我正在調試 Next.js WEB/Node 應用程序上的 session 超時問題,該應用程序使用 Firebase Auth 進行登錄。我正在利用自定義令牌進行粒度 Firestore 安全規則在調試時,我發現在初始客戶端調用之后,我發送到后端以創建自定義令牌的 idToken 本身似乎是一個自定義令牌。 至少它包含我的自定義聲明,據我從文檔中了解到,服務器只能根據https://firebase.google.com/docs/auth/admin/verify 上的明顯紅色通知處理 idToken -id-令牌 我不知道這是否是超時錯誤的根源,但這似乎很奇怪。

更新

在調查為什么解碼后的令牌上不存在picture字段時,我發現createCustomToken的第一個參數錯誤地是用戶集合文檔的 firestore doc id,而不是 id 令牌的uid字段。 所有相同的澄清問題仍然適用。 但是,我希望這個失誤能解決問題。 它使picture字段在令牌的后續解碼中返回。 但是,令牌仍然有我的自定義聲明,這可能仍然是問題,也可能不是問題。

初始登錄

Web 客戶端代碼

signInResult = await firebase.auth().signInWithPopup(googleProvider);
//... exception handling ...
const { user } = signInResult;
const fbToken = await user.getIdToken();
// axios POST request to backend with fbToken in data payload

使用 FB Admin 客戶端的后端代碼

decodedToken = await adminClient.auth().verifyIdToken(data.fbIdToken);
//... validation and exception handling ...
// . If I log out decodedToken:
{ name: 'Blaine Garrett',
  picture: '...',
  iss: '...',
  aud: '...',
  auth_time: 1569160850,
  user_id: '...',
  sub: '...',
  iat: 1569160850,
  exp: 1569164450,
  email: '...',
  email_verified: true,
  firebase:
   { identities: { 'google.com': [Array], email: [Array] },
     sign_in_provider: 'google.com' },
  uid: '...' }
{ issued: 2019-09-22T14:00:50.000Z,
  expires: 2019-09-22T15:00:50.000Z }


let userId = decodedToken.uid; // As per update, this was not the case originally

// Build custom claims
customToken = await adminClient.auth().createCustomToken(userId, additionalClaims);
// return customToken in a 200 response

在來自服務器的響應中的客戶端

...
await firebase.auth().signInWithCustomToken(customToken);
...

后續調用如果我再調用const firebaseIdToken = await firebase.auth().currentUser.getIdToken(); 在上述signInWithCustomToken並將結果發送到后端並記錄令牌之后,解碼的令牌是:

{ email: '...',
  user_roles: [ 'admin', 'support' ], // <-- my custom claims
  iss: '...',
  aud: '...',
  auth_time: 1569161153,
  user_id: '...',
  sub: '...',
  iat: 1569161163,
  exp: 1569164763,
  firebase: { identities: {}, sign_in_provider: 'custom' },
  uid: '...' }
{ issued: 2019-09-22T14:06:03.000Z,
  expires: 2019-09-22T15:06:03.000Z }
// Note: not everything is present on this token, including `picture` property and `email_verified`, etc

因此,即使我在客戶端調用currentUser.getIdToken() ,它似乎是我的自定義令牌 - 或者至少有我的自定義聲明和一些原始 id 令牌字段丟失。

  1. 這是預期的行為嗎? 即如果之前調用了signInWithCustomToken,getIdToken 將返回自定義令牌。

  2. 如果給定令牌是自定義令牌,嘗試在服務器上使用 verifyIdToken 是否有效?

  3. 這實際上是一個 customToken 還是 FB 只是保留了聲明。 (缺少的個人資料字段讓我感到困惑)。

  4. 有沒有辦法區分自定義令牌和 idToken?

  5. 根據上述更新,能夠為 createCustomToken 的第一個參數發送任意值的目的是什么? 例如。 我通過了asdf並且令牌被很好地鑄造並且隨后被很好地解碼。 這會影響 session 超時嗎?

感謝您的任何見解。 同樣,我不知道這是否是我的超時問題的根源,但我在嘗試調試時遇到了這個問題,這讓我質疑我對文檔的理解。

當您向 Firebase 身份驗證用戶帳戶添加自定義聲明時,它們不會立即對客戶端“可見”,直到它們的 ID 令牌以某種方式刷新。 這種行為記錄在案

在通過管理員 SDK 對用戶修改新聲明后,它們會通過 ID 令牌以下列方式傳播到客戶端的經過身份驗證的用戶:

  • 修改自定義聲明后,用戶登錄或重新驗證。 結果頒發的 ID 令牌將包含最新的聲明。
  • 現有用戶 session 在舊令牌過期后刷新其 ID 令牌。
  • 通過調用 currentUser.getIdToken(true) 強制刷新 ID 令牌。

因此,如果您需要客戶立即開始使用新的聲明,您應該使用第三個要點強制刷新。 true傳遞給 getIdToken。

最終,答案是不要僅僅使用自定義令牌來為您的 firebase 規則添加自定義聲明。 它們是完全不同的概念。

除了那些 Fb 支持之外,自定義令牌還用於實現不受支持的身份驗證提供程序 - 即 Google、Microsoft 等。自定義聲明是您可以在安全規則中以及通過 user.getIdTokenResult() object 上的聲明屬性利用的鍵/值對在客戶端。

我正在調試的超時問題是由於嘗試重新使用自定義令牌,它不需要刷新,因為它不是目的。 getIdToken() 返回使用原始自定義令牌鑄造時的任何聲明編碼的 Id 令牌。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM