Firebase身份验证:管理员自定义令牌在一小时后无法刷新

时间:2018-03-14 20:32:10

标签: firebase firebase-authentication

我认为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令牌的刷新令牌您可以刷新Firebase ID   令牌,通过发出HTTP POST请求   securetoken.googleapis.com端点。

但是,不接受从此API调用获得的access_token(JWT)。 JWT的格式甚至不相似。以下是检索(解码)的两个自定义令牌样本: 一世。使用Admin SDK的admin.auth()。createCustomToken(uid)方法

{
  "uid": "9N5veUXXXXX7eHOLB4ilwFexQs42",
  "iat": 1521047461,
  "exp": 1521051061,
  "aud": "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit",
  "iss": "XXX@appspot.gserviceaccount.com",
  "sub": "XXX@appspot.gserviceaccount.com"
}

II。 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": "jabbar@gmail.com",
  "email_verified": false,
  "firebase": {
    "identities": {
      "email": [
        "jabbar@gmail.com"
      ]
    },
    "sign_in_provider": "password"
  }
}

关于这个话题提出了很多问题。也许来自Firebase团队的人可以一劳永逸地回答这个问题。请参阅以下链接

感谢您的时间!!

3 个答案:

答案 0 :(得分:1)

您需要为Id令牌和刷新令牌交换自定义令牌,这称为here。该调用应该包括自定义令牌和属性" returnSecureToken"是的。如果未添加此属性或为false,则只能获取ID令牌。

执行此操作后,您可以使用刷新令牌在过期后获取新的ID令牌。请参阅documentation

自定义令牌和ID令牌都是短暂的(1小时),但目的不同,这就是格式不同的原因。您使用Id令牌进行经过身份验证的调用,而自定义令牌仅用于启动会话并获取ID令牌和刷新令牌。

请记住,如果您使用的是SDK,那么整个工作都由SDK处理。

答案 1 :(得分:0)

您不会刷新现有的自定义令牌,而是创建新的并将其交换为访问或刷新令牌。这是我在当前正在使用的工作项目中所做的事情

从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(身份和访问管理)并设置服务帐户凭据。 Check the Troubleshooting


交换自定义令牌以获取刷新和访问令牌

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
}

祝你好运

答案 2 :(得分:0)

如何使用Admin SDK刷新自定义令牌?

答案:如果您使用的是Android SDK for Firebase,则永远不必这样做。如果您问这个问题,并且正在使用iOS或Android SDK,则可能存在设置问题。如果正确设置,则SDK将处理所有令牌刷新。我正在使用FirebaseAuth的signInWithCustomToken,并且遇到了同样的问题。

An overview of Firebase tokens
The SDK has 1 hour to USE THE CUSTOM TOKEN如果您阅读了整个对话,而忽略了抱怨,则说明问题所在。请参阅7月6日左右的samtstern评论

一旦调用FirebaseAuth的signInWithCustomToken函数,如果您设置正确,SDK将负责使令牌保持最新状态。 For more info

ANDROID应用中的SHA1证书必须位于Firebase管理控制台中。添加SHA1证书后,您需要下载google-services.json文件并将其添加到您的应用中。 我接管了仍在开发中的应用程序的Firebase帐户,遇到了这个问题。