在 firebase 中 - 如何在服务器上生成 idToken 以用于测试目的?

问题描述 投票:0回答:4

我想测试一个创建用户的云功能。

在正常情况下,在浏览器内我生成一个

idToken
并通过标头将其发送到服务器:
Authorization : Bearer etcIdToken

但是我想在没有浏览器的情况下测试这个功能。在我的摩卡测试中,我有:

before(done => {
   firebase = require firebase.. -- this is suppose to be like the browser lib.
   admin = require admin.. 

    idToken = null;
    uid = "AY8HrgYIeuQswolbLl53pjdJw8b2";
    admin.auth()
        .createCustomToken(uid)               -- admin creates a customToken
        .then(customToken => {
            return firebase.auth()            -- this is like browser code. customToken get's passed to the browser.
                .signInWithCustomToken(customToken)     -- browser signs in.
                .then(signedInUser => firebase.auth()             -- now i want to get an idToken. But this gives me an error.
                    .currentUser.getIdToken())
        })
        .then(idToken_ => {
            idToken = idToken_
            done();
        })
        .catch(err => done(err));
})

我收到的错误是:

firebase.auth(...).currentUser.getIdToken is not a function
- 像这样在客户端上获取 idToken - 并且记录在此处。

我直接用

signedInUser.getIdToken()
尝试过。同样的问题:

signedInUser.getIdToken is not a function
- 未记录。只是一个测试。

我认为这是因为

firebase
对象不适合像我在这里所做的那样
node.js
使用。登录时 - 内容会保存在浏览器本地存储中 - 也许这就是原因。

但问题仍然存在。我如何在 node.js 中获取 idToken 以便能够进行测试:

return chai.request(myFunctions.manageUsers)
    .post("/create")
    .set("Authorization", "Bearer " + idToken)   --- i need the idToken here -  like would be if i'm getting it from the browser.
    .send({
          displayName: "jony",
          email: "[email protected]",
          password: "123456"
    })

我这样做是错误的吗?我知道如果我能得到

idToken
它就会起作用。我需要浏览器吗?谢谢:)

javascript node.js firebase firebase-authentication google-cloud-functions
4个回答
47
投票

将自定义令牌交换为 ID 和刷新令牌,您可以使用 api 将自定义令牌转换为 id 令牌。因此,您只需首先从 uid 生成自定义令牌,然后将其转换为自定义令牌。这是我的样本:

const admin = require('firebase-admin');
const config = require('config');
const rp = require('request-promise');

module.exports.getIdToken = async uid => {
  const customToken = await admin.auth().createCustomToken(uid)
  const res = await rp({
    url: `https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyCustomToken?key=${config.get('firebase.apiKey')}`,
    method: 'POST',
    body: {
      token: customToken,
      returnSecureToken: true
    },
    json: true,
  });
  return res.idToken;
};

9
投票

L。迈耶的答案对我有用。

但是,

rp
npm 包已被弃用并且不再使用。 这是使用 axios 修改后的工作代码。

const axios = require('axios').default;
const admin = require('firebase-admin');
const FIREBASE_API_KEY = 'YOUR_API_KEY_FROM_FIREBASE_CONSOLE';

const createIdTokenfromCustomToken = async uid => {
  try {
    const customToken = await admin.auth().createCustomToken(uid);

    const res = await axios({
      url: `https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyCustomToken?key=${FIREBASE_API_KEY}`,
      method: 'post',
      data: {
        token: customToken,
        returnSecureToken: true
      },
      json: true,
    });

    return res.data.idToken;

  } catch (e) {
    console.log(e);
  }
}

3
投票
curl 'https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword?key=<FIREBASE_KEY>' -H 'Content-Type: application/json'--data-binary '{"email": "[email protected]","password":"test","returnSecureToken":true}'

如果此curl 未运行,请尝试在Postman 上运行相同的操作。有效!


0
投票

注意:API 端点已从

https://googleapis.com
更改为
https://identitytoolkit.googleapis.com
,当您尝试调用旧端点时,您将收到 404 错误。

API 规范仍然保持不变,因此您所要做的就是在原始主机名之前插入

identitytoolkit.

这是使用

ky
的最新示例代码:

const res = await ky
    .post(
        'https://identitytoolkit.googleapis.com/identitytoolkit/v3/relyingparty/verifyCustomToken',
        {
            searchParams: {
                key: FIREBASE_API_KEY,
            },
            json: {
                token: customToken,
                returnSecureToken: true,
            },
        },
    )
    .json();
© www.soinside.com 2019 - 2024. All rights reserved.