我知道这个问题在这里有很多问题,但我似乎无法找到可以解决问题的确切答案。
我希望通过添加access_token参数来使用REST调用访问Firebase。
使用Node.js Admin SDK创建access_token,使用以下代码:
const ldap = require('ldapjs');
const ldapOptions = {
url: 'ldaps://example.com',
port: '363'
};
const client_admin = ldap.createClient(ldapOptions);
let searchUser = () => {
client_admin
.bind('cn=admin,dc=example,dc=com', 'secret', (err) => {
if (err) return console.log('Error is', err);
});
let opts = {
filter: 'cn=admin'
}
client_admin.search('dc=example,dc=com', opts, (err, res) => {
res.on('searchEntry', (entry) => {
console.log('Entry', JSON.stringify(entry.object));
});
res.on('searchReference', (referral) => {
// console.log('Referral', referral);
});
res.on('error', (err) => {
// console.log('Error is', err);
});
res.on('end', (result) => {
console.log('Result is', result);
})
})
};
问题是,如果我使用从Node.js创建的令牌并将其用于我的REST调用,则会出现var admin = require("firebase-admin");
var serviceAccount = require("./pk.json");
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://XXX.firebaseio.com"
});
var uid = "1234";
admin.auth().createCustomToken(uid)
.then(function(customToken) {
// Send token back to client
console.log("Token: "+customToken);
})
.catch(function(error) {
console.log("Error creating custom token:", error);
});
错误。
我已经读过一些问题,人们在发布令牌时添加了范围参数,但是没有找到使用Node.js Admin SDK的方法。
Google的文档在此问题上并不那么详细。知道我可以尝试解决这个问题吗?
答案 0 :(得分:9)
您用于对Firebase REST API进行身份验证的令牌不是正确的令牌类型。您正在使用Firebase Auth自定义令牌,该令牌只能用于signInWithCustomToken()
方法中Sign in using custom tokens on clients中所述的https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyCustomToken?key=<API_KEY>
方法对其中一个Firebase客户端SDK进行身份验证。
要对Firebase REST API进行身份验证,您有两种选择:Firebase ID令牌(用于基于用户的访问)或Google OAuth2访问令牌(用于管理员访问)。
使用Firebase ID令牌进行身份验证
有关如何在各种Firebase客户端SDK中检索访问令牌的说明,请参阅Retrieve ID tokens on the client。您还可以通过未记录的REST API交换Firebase自定义令牌以获取ID令牌和刷新令牌对:
终点: POST
方法: { "token": <CUSTOM_TOKEN>, "returnSecureToken": true }
请求正文: <API_KEY>
<CUSTOM_TOKEN>
与您在Firebase客户端中使用的Firebase控制台获得的API密钥相同。 https://securetoken.googleapis.com/v1/token?key=<API_KEY>
是Firebase自定义令牌。
由于ID令牌在一小时后过期,您将需要使用刷新令牌通过其他未记录的REST API刷新它们:
终点: POST
方法: { "refresh_token": <REFRESH_TOKEN>, "grant_type": "refresh_token" }
请求正文: <API_KEY>
<REFRESH_TOKEN>
与之前的API密钥相同。 auth
是以前API调用的刷新令牌。
获得ID令牌后,您可以通过access_token
查询参数将其传递给REST API以验证请求。该请求尊重Firebase安全规则,就像登录客户端的最终用户正在发出请求一样。
使用Google访问令牌进行身份验证
要使用Google OAuth2访问令牌进行身份验证,您需要做的第一件事就是获取一个。有关如何执行此操作的说明,请参阅Retrieving an access token。它目前只包含一个Java示例,但这可以用于许多语言,包括Node.js.获得ID令牌后,可以通过MyContract.at("0x...").MyFunctionName(parameters,{from:"x0..."});
查询参数将其传递给REST API以验证请求。该请求将通过管理员访问权限进行,覆盖所有Firebase安全规则并授予完整的读写权限。