【问题标题】:Get Firebase Access Token in POSTMAN在 POSTMAN 中获取 Firebase 访问令牌
【发布时间】:2018-09-30 18:16:23
【问题描述】:

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

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

我有两个解决这个问题的方法:

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

2) 在浏览器中登录,从网络请求中复制访问令牌,将其存储在bash_profile 中,然后在 Postman 中使用。 (这里不知道怎么读取OS env.variable)

【问题讨论】:

  • 我不明白这个问题。如果您的目标是访问任何 API,为什么需要来自 firebase 的访问令牌?你的意思是任何firebase API?而且,在您的网络应用程序中,您如何使用身份验证。你使用 SDK 还是 firebase REST api?
  • @DauleDK 我正在使用 firebase SDK。从服务器端生成 Cookie 需要 Firebase 访问令牌。仅当请求中存在有效的 cookie 时,API 才会返回响应。

标签: firebase firebase-authentication postman


【解决方案1】:

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

  1. 在目录中创建 html 文件
  2. firebase auth quickstart的内容复制到html文件中
  3. 按照firebase web setup 中的说明替换 firebase-app.js 和 firebase-auth.js,将它们指向网络上正确的 cdn 位置
  4. 将 firebase.init 脚本替换为控制台上应用的初始化代码,如下所示:
var config = {
    apiKey: "my secret api key",
    authDomain: "myapp.firebaseapp.com",
    databaseURL: "https://myapp.firebaseio.com",
    projectId: "myapp-bookworm",
    storageBucket: "myapp.appspot.com",
    messagingSenderId: "xxxxxxxxxxxxx"
};
firebase.initializeApp(config);
  1. 在浏览器中打开 html 文件,然后登录或注册。应显示 Firebase auth currentUser 对象值。

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

    2. 复制accessToken的内容

    3. 在 postman 中转到授权,选择不记名令牌并将复制的令牌粘贴到令牌值字段中。

您现在应该能够调用由 firebase auth 保护的 API。请记住,这只会获取并传递访问令牌,因此一旦令牌过期,您可能需要请求一个新令牌(步骤 5 到 8)

你也可以看看this
希望这会有所帮助!

【讨论】:

    【解决方案2】:

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

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

    {"email":"{YOUR_EMAIL_ADDRESS}","password":"{PASSWORD}","returnSecureToken":true}
    

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

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

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

    var jsonData = JSON.parse(responseBody);
    postman.setGlobalVariable("id_token", jsonData.idToken);
    

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

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

    【讨论】:

    • 令牌过期怎么办?
    • 我能够通过 POST 将预期的响应返回到您建议的端点,但是当我尝试在我的 Node 应用程序中通过 firebase admin sdk 验证 ID 令牌时,我得到 Error: Decoding Firebase ID token failed. Make sure you passed the entire string JWT which represents an ID token .有什么建议吗?
    • 糟糕,当我将身份验证类型设置为“Bearer Token”时,Postman 正在将“Bearer”添加到令牌字符串的开头
    • 我想在 "email":"{YOUR_EMAIL_ADDRESS}","password":"{PASSWORD}" 字段中添加,使用用户帐户,而不是 Firebase 登录帐户哈哈。愚蠢的错误
    • 有没有人设法使用身份验证模拟器来解决这个问题?
    【解决方案3】:

    除了naptoon's post

    var jsonData = JSON.parse(responseBody);
    postman.setGlobalVariable("id_token", jsonData.idToken);
    

    这是“旧式”,即deprecated by Postman。 “新风格”是:

    pm.environment.set("id_token", pm.response.json().idToken);
    

    【讨论】:

      【解决方案4】:

      转到预请求脚本并添加此代码(使用您的 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 
      });
      

      此代码将添加环境变量FIREBASE_TOKEN,但您可以使用 idToken =) 做任何您想做的事情

      【讨论】:

        【解决方案5】:

        我遇到了这样做的需要,其中登台和生产环境需要不同的 Firebase idToken 但本地不使用。我扩展了 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())
        })
        

        访问令牌为给定环境缓存长达 20 分钟(我还没有实现刷新令牌)。如果环境与上次请求不同或发生错误,则清除令牌。

        【讨论】:

        • 如果我选择了电话登录方法,使用电话号码和 OTP,请求正文应该是什么?我在 Firebase 控制台中添加了测试电话号码和 OTP,但请求正文属性是什么?
        • @ShubhamA。你有解决办法吗
        • 是的,我确实找到了解决方案。
        【解决方案6】:

        复制以下代码块并将其放在 Postman 请求的“请求前脚本”选项卡中。每次您发出请求时,它都会自动获取一个令牌并将其作为“授权”标头。您无需手动添加任何标头或授权。您甚至无需担心令牌过期。

        显然,替换app api key、用户名和密码占位符。

        const postRequest = {
          url: 'https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword?key={APP_API_Key}',
          method: 'POST',
          header: {
            'Content-Type': 'application/json'
          },
          body: {
            mode: 'raw',
            raw: JSON.stringify({
            "email": "{Your_Email}",
            "password": "{Your_Password}",
            "returnSecureToken": true
        })
          }
        };
        
        pm.sendRequest(postRequest, (error, response) => {
          var jsonData = response.json();
          pm.globals.set("id_token", jsonData.idToken)
        });
        
        pm.request.headers.add({key: 'Authorization', value: '{{id_token}}'})
        

        【讨论】:

          【解决方案7】:

          如果您在此处使用 Node 是我的解决方案,

          使用 firebase admin SDK 将其导入您的文件,然后按照 @naptoon 说明在 PostMan 中设置路线。

          在您的文件中的 Nodejs 中放入以下内容 const user = admin.auth().verifyIdToken(req.headers.authorization)

          我尝试使用 const auth = getAuth() const user = auth.currentUser

          这种方式对我不起作用,所以我选择了 firebase 管理路线,该路线用最少的代码运行良好

          【讨论】:

            【解决方案8】:

            Firebase 身份验证不响应访问令牌只是 idToken。您必须与您的身份验证系统进行验证/交换才能获得它。

            【讨论】:

            • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
            猜你喜欢
            • 2019-05-15
            • 2018-09-09
            • 2019-12-05
            • 1970-01-01
            • 1970-01-01
            • 2017-11-10
            • 1970-01-01
            • 2014-07-09
            相关资源
            最近更新 更多