在POSTMAN中获取Firebase访问令牌

Far*_*han 4 firebase postman firebase-authentication

在我的Web应用程序中,我使用Firebase进行身份验证,要访问任何API,都必须从firebase进行身份验证。

问题: 如何在Postman中获取firebase的访问令牌?

我有2个解决此问题的方法:

1)从邮递员的firebase中获取访问令牌,并将该访问令牌存储在邮递员全局环境中。变量,然后我可以执行其他API请求。(这里我不知道如何在邮递员中获取访问令牌)

2)在浏览器中进行登录,从网络请求中复制访问令牌,将其存储bash_profile在邮递员中,然后使用它。(这里我不知道如何读取操作系统环境变量)

小智 62

当您只想使用 Postman 而不想构建前端时,您可以在 Postman 中使用此身份验证请求: POST https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword?key={API_KEY}

在正文中,您应该发送以下 JSON 字符串:

{"email":"{YOUR_EMAIL_ADDRESS}","password":"{PASSWORD}","returnSecureToken":true}
Run Code Online (Sandbox Code Playgroud)

内容类型是 application/json(将在 Postman 中自动设置)。您可以在 Firebase 项目设置中找到 Firebase API_KEY(它是 Web-API 密钥)。

作为响应,您将获得一个 JSON 对象,这idToken是您的所有 API 请求所需的令牌作为不记名令牌。

要对此令牌进行自动设置,您可以在身份验证请求的“测试”选项卡中添加以下代码:

var jsonData = JSON.parse(responseBody);
postman.setGlobalVariable("id_token", jsonData.idToken);
Run Code Online (Sandbox Code Playgroud)

对于您的所有 API 请求,您应该将授权设置Bearer Token为 并且令牌的值为{{id_token}}

现在,一旦您执行身份验证请求并获得响应,将自动使用令牌。

  • 我想在 `"email":"{YOUR_EMAIL_ADDRESS}","password":"{PASSWORD}"` 字段中添加这一点,使用用户帐户,而不是 Firebase 登录帐户,哈哈。愚蠢的错误 (2认同)
  • 我已成功获得 idToken,但当我使用不记名令牌集访问 API 时,收到“401 未经授权”和“您的客户端无权访问所请求的 URL”。 (2认同)

Leo*_*Leo 9

转到预请求脚本并添加此代码(使用您的API_KEY, USER_EMAIL, USER_PASSWORD

  const reqObject = {
    url: "https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword?key={API_KEY}", // API_KEY -> your API key from firebase config 
    method: 'POST',
    header: 'Content-Type:application/json',
    body: {
        mode: 'raw',
        raw: JSON.stringify({ "email": {USER_EMAIL}, "password": {USER_PASSWORD}, "returnSecureToken": true })
    }
};

pm.sendRequest(reqObject, (err, res) => {
    const idToken = res.json().idToken;  // your idToken
    pm.environment.set("FIREBASE_TOKEN", idToken ); // set environment variable FIREBASE_TOKEN with value idToken 
});
Run Code Online (Sandbox Code Playgroud)

这段代码将添加环境变量FIREBASE_TOKEN,但你可以用 idToken 做任何你想做的事=)


Alb*_*lio 6

从Firebase检索访问令牌的简单方法是:

  1. 在目录中创建一个html文件
  2. 在html文件中复制firebase auth quickstart的内容
  3. 按照Firebase 网络设置中的说明替换firebase-app.js和firebase-auth.js,以将其指向网络上的正确CDN位置
  4. 用控制台上的应用程序中的初始化代码替换firebase.init脚本,如下所示:

var config = {apiKey:“我的秘密api密钥”,authDomain:“ myapp.firebaseapp.com”,databaseURL:“ https://myapp.firebaseio.com ”,projectId:“ myapp-bookworm”,storageBucket:“ myapp。 appspot.com”,messagementSenderId:“ xxxxxxxxxxxxx”};firebase.initializeApp(config);

  1. 在浏览器中打开html文件,然后登录或注册。应该显示Firebase auth currentUser对象值。

    1. 检查html并展开quickstart-account-details元素。这应该显示json对象。

    2. 复制accessToken的内容

    3. 在邮递员去授权中,选择承载令牌并将复制的令牌粘贴到令牌值字段中。

您现在应该可以调用受Firebase身份验证保护的api。请记住,这只会获取和传递访问令牌,因此一旦令牌过期,您可能需要请求一个新的令牌(步骤5至8)

您也可以看看这个
希望对您有所帮助!


Vol*_*xim 6

另外naptoon的帖子

var jsonData = JSON.parse(responseBody);
postman.setGlobalVariable("id_token", jsonData.idToken);
Run Code Online (Sandbox Code Playgroud)

这是“旧风格”,已被 Postman 弃用。“新风格”是:

pm.environment.set("id_token", pm.response.json().idToken);
Run Code Online (Sandbox Code Playgroud)


And*_*odt 5

我遇到了需要执行此操作的情况,其中登台和生产环境需要不同的 Firebase idToken,但本地不使用 Firebase。我扩展了naptoon和leo的答案,以使用identitytoolkit的verifyPassword端点作为预请求的一部分:

const apiKey = pm.environment.get('api_key');

if ( ! apiKey) {
    return
}

const tokenEnv = pm.environment.get('token_env')

if (tokenEnv && tokenEnv === pm.environment.name) {
    const tokenTimestamp = Number.parseInt(pm.environment.get('token_timestamp'), 10)
    const elapsed = Date.now() - tokenTimestamp
    if (elapsed < 20 * 60000) {
        return
    }
}

pm.sendRequest({
    url: `https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword?key=${apiKey}`,
    method: 'POST',
    header: {
        'Content-Type': 'application/json',
    },
    body: {
        mode: 'raw',
        raw: JSON.stringify({
            email: pm.environment.get('auth_username'),
            password: pm.environment.get('auth_password'),
            returnSecureToken: true,
        }),
    },
}, function (err, res) {
    let json
    if ( ! err) {
        json = res.json()
        if (json.error) {
            err = json.error
        }
    }
    if (err) {
        pm.environment.unset('auth_token')
        pm.environment.unset('token_env')
        pm.environment.unset('token_timestamp')
        throw err
    }
    pm.expect(json.idToken).to.not.be.undefined
    pm.environment.set('auth_token', json.idToken)
    pm.environment.set('token_env', pm.environment.name)
    pm.environment.set('token_timestamp', Date.now())
})
Run Code Online (Sandbox Code Playgroud)

给定环境的访问令牌最多可缓存 20 分钟(我尚未实现刷新令牌)。如果环境与上次请求不同或发生错误,则清除令牌。