Firebase Auth:一小时后无法刷新管理员自定义令牌

7vhp5slm  于 2023-11-21  发布在  其他
关注(0)|答案(4)|浏览(159)

我认为Firebase Admin SDK缺少了一个非常重要的功能(或者可能是它的文档)。
TL; DR:您如何使用Admin SDK刷新自定义令牌?
文档(https://firebase.google.com/docs/auth/admin/manage-sessions)说:
Firebase身份验证会话是长期有效的。每次用户登录时,用户凭据都会发送到Firebase身份验证后端,并交换为Firebase ID令牌(JWT)和刷新令牌。Firebase ID令牌的有效期很短,持续一个小时;刷新令牌可用于检索新的ID令牌。
好吧。但是怎么做?没有提到如何用新的自定义令牌替换刷新令牌。有很多关于如何撤销刷新令牌等的文档。
然而,有一个REST API函数说,(https://firebase.google.com/docs/reference/rest/auth/#section-refresh-token)
将刷新令牌交换为ID令牌您可以通过向securetoken.googleapis.com端点发出HTTP POST请求来刷新Firebase ID令牌。
然而,您从这个API调用中获得的access_token(JWT)也不被接受。JWT的格式甚至不相似。下面是检索(解码)的自定义令牌的两个示例:i.使用Admin SDK的admin.auth(). admin CustomToken(uid)方法

{
  "uid": "9N5veUXXXXX7eHOLB4ilwFexQs42",
  "iat": 1521047461,
  "exp": 1521051061,
  "aud": "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit",
  "iss": "[email protected]",
  "sub": "[email protected]"
}

字符串
二、https://securetoken.googleapis.com/v1/token?key=[API_KEY]调用

{
  "iss": "https://securetoken.google.com/XXX",
  "aud": "XXX",
  "auth_time": 1521047461,
  "user_id": "9N5veUXXXXX7eHOLB4ilwFexQs42",
  "sub": "9N5veUXXXXX7eHOLB4ilwFexQs42",
  "iat": 1521051719,
  "exp": 1521055319,
  "email": "[email protected]",
  "email_verified": false,
  "firebase": {
    "identities": {
      "email": [
        "[email protected]"
      ]
    },
    "sign_in_provider": "password"
  }
}


关于这个主题有很多问题。也许Firebase团队的某个人可以一劳永逸地回答它。请参阅下面的链接
谢谢你的时间!!

sirbozc5

sirbozc51#

您需要将自定义令牌交换为ID令牌和Refresh令牌,这在这里提到。调用应包含自定义令牌和属性“returnSecureToken”为true。如果此属性未添加或为false,则仅获得ID令牌。
完成此操作后,您可以使用刷新令牌在ID令牌过期后获取新的ID令牌。请参阅文档。
自定义令牌和ID令牌都是短暂的(1小时),但用途不同,这就是格式不同的原因。您使用ID令牌进行身份验证呼叫,而自定义令牌仅用于启动会话并获取ID令牌和刷新令牌。
请记住,如果您使用的是SDK,则整个工作都由SDK处理。

htrmnn0y

htrmnn0y2#

您不刷新已经存在的自定义令牌,而是创建新令牌并将其交换为访问令牌或刷新令牌。

通过Firebase云函数生成自定义令牌

假设你有你的firebase项目和Cloud Functions for Firebase都设置好了。
这就是Cloud Functions index.ts文件的样子:

import * as functions from 'firebase-functions';
import * as admin from "firebase-admin";

// Start writing Firebase Functions
// https://firebase.google.com/docs/functions/typescript

export const getCustomToken = functions.https.onRequest((request, response) => {
  if (admin.apps.length < 1) {   //Checks if app already initialized
    admin.initializeApp();
  }
  const uid = "USER_UUID"; //e.g. GVvCdXAC1FeC4WYTefcHD8So3q41

  admin.auth().createCustomToken(uid)
    .then(function(customToken) {
      console.log(customToken.toString);
      response.send(customToken);
    })
    .catch(function(error) {
      console.log("Error creating custom token:", error);
    });
});

字符串
HTTP GET请求看起来像这样:

https://us-central1-<ProjectID>.cloudfunctions.net/getCustomToken


响应如下所示:

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJodHRwczovL2lkZW50aXR5dG9vbGtpdC5nb29nbGVhcGlzLmNvbS9nb29nbGUuaWRlbnRpdHkuaWRlbnRpdHl0b29sa2l0LnYxLklkZW50aXR5VG9vbGtpdCIsImlhdCI6MTU0MTMwOTY3MiwiZXhwIjoxNTQxMzEzMjcyLCJpc3MiOiJlbWFsbC02OWU3MEBhcHBzcG90LmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzdWIiOiJlbWFsbC02OWU3MEBhcHBzcG90LmdzZXJ2aWNlYWNjb3VudC5jb20iLCJ1aWQiOiJHVnZDZFhBQzFGZUMyV1lUZWZjSEQ4U28zcTQzIn0.hsazo6ELKbLHwPfP2d9rEykKXsBB1CdB1pCQKIVX8_Xo7tnJ0S80LQbE17ktOJ_FTr4MIllVjOLhS3kpWtKYX6Ju4kNMZ2ROLJz1bvwwgcw5unrRdQHEa3SLuyW1HvaOwKiDeYpTx2lwhZnkuBEvcoo1VcbllfYfFLIR_Y47eticONO572EL4GcIuw-RGRx1AXJR-rigRE3bj6_Ohc-PLIVXdH5v1z8fpctM2MA4NxoOZXsBDGH_ZW2Kn4NRBZYo_IT99VJU8Ypsbi_6eJguhDlbl5oWp5_NEEIEuZrN9oLaHL-PUvB8_h10lvQ6c5yP-aFKwC_EHaKBnkz7vXt8Gw


最有可能的是,如果没有启用IAM(身份和访问管理),您将不得不启用并设置服务帐户凭据。

用自定义代币兑换充值和访问代币

HTTP POST请求看起来像这样:

https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyCustomToken?key=<Firebase Project Web API Key>


身体就像:

{"token":"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJodHRwczovL2lkZW50aXR5dG9vbGtpdC5nb29nbGVhcGlzLmNvbS9nb29nbGUuaWRlbnRpdHkuaWRlbnRpdHl0b29sa2l0LnYxLklkZW50aXR5VG9vbGtpdCIsImlhdCI6MTU0MTMwOTY3MiwiZXhwIjoxNTQxMzEzMjcyLCJpc3MiOiJlbWFsbC02OWU3MEBhcHBzcG90LmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzdWIiOiJlbWFsbC02OWU3MEBhcHBzcG90LmdzZXJ2aWNlYWNjb3VudC5jb20iLCJ1aWQiOiJHVnZDZFhBQzFGZUMyV1lUZWZjSEQ4U28zcTQzIn0.hsazo6ELKbLHwPfP2d9rEykKXsBB1CdB1pCQKIVX8_Xo7tnJ0S80LQbE17ktOJ_FTr4MIllVjOLhS3kpWtKYX6Ju4kNMZ2ROLJz1bvwwgcw5unrRdQHEa3SLuyW1HvaOwKiDeYpTx2lwhZnkuBEvcoo1VcbllfYfFLIR_Y47eticONO572EL4GcIuw-RGRx1AXJR-rigRE3bj6_Ohc-PLIVXdH5v1z8fpctM2MA4NxoOZXsBDGH_ZW2Kn4NRBZYo_IT99VJU8Ypsbi_6eJguhDlbl5oWp5_NEEIEuZrN9oLaHL-PUvB8_h10lvQ6c5yP-aFKwC_EHaKBnkz7vXt8Gw","returnSecureToken":true}


响应如下所示:

{
    "kind": "identitytoolkit#VerifyCustomTokenResponse",
    "idToken": "eyJhbGciOiJSUzI1NiIsImtpZCI6Ijk4Njk0NWJmMWIwNDYxZjBiZDViNTRhZWQ0YzQ1ZWU0ODMzMjgxOWEiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL3NlY3VyZXRva2VuLmdvb2dsZS5jb20vZW1hbGwtNjllNzAiLCJhdWQiOiJlbWFsbC02OWU3MCIsImF1dGhfdGltZSI6MTU0MTMxMDkzOSwidXNlcl9pZCI6IkdWdkNkWEFDMUZlQzJXWVRlZmNIRDhTbzNxNDMiLCJzdWIiOiJHVnZDZFhBQzFGZUMyV1lUZWZjSEQ4U28zcTQzIiwiaWF0IjoxNTQxMzEwOTM5LCJleHAiOjE1NDEzMTQ1MzksImVtYWlsIjoiYUBhLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwiZmlyZWJhc2UiOnsiaWRlbnRpdGllcyI6eyJlbWFpbCI6WyJhQGEuY29tIl19LCJzaWduX2luX3Byb3ZpZGVyIjoiY3VzdG9tIn19.KnMU0SHoMkMOwGBOfwnwMYCyFAGZycC1zA5pva47i4TylGdZyz-93h3KyWA_EYHGZtI29YWfarUG0-6K_sLORttMzKy3t9jBcvhgWN8G9zE8DHg0DuOeaDxDfKY8-W-CBgh8wiTSOfz-CRTT9spXoP_9PigdWFKiwmgP_vvOGStONFjUMh2hSNaRhHAj_0nlFxQuBsoP9eV3uGm1ycC3z8e5AHVbvE7VgIxK27OcKY4z9n1IrBADp9gxM6ESlOYE2y_bfP2i_WIv_4ZQ3fA0aeKhSjhO7AhKUVvZ8FphqzlHF_q966QIglLf9vkVVzQCo-9YdD9j_GRea88tj3P5PQ",
    "refreshToken": "AEXAG-dZJD0zYr-RehU4qXLDRwf1SueYHPeQv6WHQ-w3SW8oFPU27EwdcrBcRP1p4hbTMIjeTTOub9buL20c3dxQvjpCzI4gda73jhHhigLFq6LZGU_S0VXW-9_gG_Vrcx25g2SAiMEt3WuLlP5h0R4h6Eo_DeX2F15vGQMxqplqcOSNGptN-r0",
    "expiresIn": "3600",
    "isNewUser": false
}


祝你好运,

at0kjp5o

at0kjp5o3#

如何使用Admin SDK刷新自定义token?
答:如果你使用的是Firebase的Android SDK,你应该永远不必这样做。如果你问这个问题,并且使用的是iOS或Android SDK,你可能有一个设置问题。如果你正确设置,SDK将处理所有令牌的刷新。我使用FirebaseAuth的signInWithCustomToken,遇到了同样的问题。
An overview of Firebase tokens
The SDK has 1 hour to USE THE CUSTOM TOKEN如果你读了整个对话,忽略了抱怨,它列出了问题。
一旦FirebaseAuth的signInWithCustomToken函数被调用,SDK将负责保持令牌的最新状态(如果您设置正确的话)。For more info
您的Android应用程序的SHA1证书必须位于Firebase管理控制台中。添加SHA1证书后,您需要下载google-services.json文件并将其添加到您的应用程序中。我接管了一个仍在开发中的应用程序的Firebase帐户,并遇到了这个问题。

eoigrqb6

eoigrqb64#

你没有提到编程语言,但在Java中,这样的东西对我来说很有效:

// Use the user ID with the Firebase Admin SDK to generate a custom token
FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
String customToken = firebaseAuth.createCustomToken(userId);

// Now use the Firebase REST API to exchange the custom token for an ID and refresh token
JsonObject json = new JsonObject();
json.addProperty("token", customToken);
json.addProperty("returnSecureToken", true);
String postDataStr = GSON.toJson(json);
Map<String, String> headers = new HashMap<>();
headers.put("Content-Type", "application/json");

// Make a request to the Firebase client-side API to exchange the credentials for an ID token, Refresh Token, etc.
URI uri = new URI("https://identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken?key={API_KEY_HERE}");

. . .

字符串
发出POST请求等。请注意,响应应解析为JSON,然后ID令牌在“.idToken”中,刷新令牌在“.refreshToken”中。
然后,如果您需要手动使用刷新令牌,则可以按照此处找到的Google文档再次使用REST API。

相关问题