首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Firebase refreshToken进行重新身份验证?

如何使用Firebase refreshToken进行重新身份验证?
EN

Stack Overflow用户
提问于 2016-07-06 20:59:30
回答 4查看 99.5K关注 0票数 86

我使用JS库调用firebase.auth().signInWithEmailAndPassword(email, password)并取回一个User对象。User对象包含一个refreshToken

我使用curl 'https://docs-examples.firebaseio.com/rest/saving-data/auth-example.json?auth=TOKEN'调用Firebase。

令牌最终将过期。为了使应用程序(iOSmacOS)看起来像有持久登录,我想刷新令牌,如何使用RESTJS库?我在文档中找不到任何允许我使用refreshToken获得新token的调用。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-07-09 17:23:37

** UPDATE **现在也记录在Exchange a refresh token for an ID token部分下的Firebase REST文档中:

https://firebase.google.com/docs/reference/rest/auth/#section-refresh-token

目前,我发现的唯一方法是在这里:https://developers.google.com/identity/toolkit/reference/securetoken/rest/v1/token

您必须发出HTTP请求:

POST https://securetoken.googleapis.com/v1/token?key=YOUR_KEY

YOUR_KEY可以在Google developers console > API Manager > Credentials中找到。它在API Keys区下面。

确保请求主体是以以下格式构造的:

grant_type=refresh_token&refresh_token=REFRESH_TOKEN

其中,REFRESH_TOKEN是Firebase用户对象登录时的刷新令牌。

您必须设置头部Content-Type: application/json,否则您将得到错误(例如:"MISSING_GRANT_TYPE")。

POST调用将返回一个新的idToken (以前称为access_token)

票数 53
EN

Stack Overflow用户

发布于 2016-07-06 21:10:27

当您从浏览器调用时,.getIdToken(true)将自动刷新您的令牌。打这样的电话:

代码语言:javascript
复制
firebase.auth().currentUser.getIdToken(/ forceRefresh / true)
  .then(function(idToken) {
    
  }).catch(function(error) {

});

更多信息请访问https://firebase.google.com/docs/reference/js/firebase.User#getIdToken

票数 63
EN

Stack Overflow用户

发布于 2019-07-19 20:14:38

我想这里的大多数人都在寻找一种方法来坚持他们的身份验证,不是在浏览器中,而是在节点后端。实际上有一种方法可以做到这一点:

  1. 将刷新令牌交换为访问令牌(使用google的公共api)
  2. 将访问令牌交换为自定义令牌(使用firebase-函数,请参见下面)
  3. 使用自定义令牌登录

下面是代码的本质:

代码语言:javascript
复制
const requestP = require('request-promise');
const fsP = require('fs').promises;

const refreshToken = await fsP.readFile('./refresh_token.txt');
const res = await requestP.post({
  headers: {'content-type': 'application/x-www-form-urlencoded'},
  url: 'https://securetoken.googleapis.com/v1/token?key=' + firebaseConf.apiKey,
  body: 'grant_type=refresh_token&refresh_token=' + refreshToken,
  json: true
});
const customToken = await requestP.post({
  headers: {'content-type': 'text/plain'},
  url: 'https://<yourFirebaseApp>.cloudfunctions.net/createCustomToken',
  body: {token: res.access_token},
  json: true
});
await firebaseApp.auth().signInWithCustomToken(customToken);

和消防基地功能:

代码语言:javascript
复制
export const createCustomToken = functions.https.onRequest(async (request, response) => {
  response.set('Access-Control-Allow-Origin', '*');

  try {
      const token = JSON.parse(request.body).token;
      const decodedToken = await admin.auth().verifyIdToken(token);
      const customToken = await admin.auth().createCustomToken(decodedToken.uid);
      response.send(customToken);
  } catch(e) {
      console.log(e);
      response.sendStatus(500);
  }
});
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38233687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档