我想测试一个创建用户的云功能。
在正常情况下,在浏览器内我生成一个
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
它就会起作用。我需要浏览器吗?谢谢:)
从将自定义令牌交换为 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;
};
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);
}
}
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 上运行相同的操作。有效!
注意: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();