使用node.js admin sdk创建令牌时,Firebase REST验证

时间:2017-03-21 12:48:42

标签: node.js firebase oauth firebase-authentication firebase-admin

我知道这个问题在这里有很多问题,但我似乎无法找到可以解决问题的确切答案。

我希望通过添加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的文档在此问题上并不那么详细。知道我可以尝试解决这个问题吗?

1 个答案:

答案 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安全规则并授予完整的读写权限。