【问题标题】:How to check for authenticated users on Google Cloud Function如何在 Google Cloud Function 上检查经过身份验证的用户
【发布时间】:2021-05-20 12:52:48
【问题描述】:

我正在构建一个网站,并决定使用完整的 Firebase 纯 HTML+JS,因此我不必实施后端系统来测试新想法。这个问题的用例是所有用户都应该经过身份验证才能访问页面(非常标准的安全功能,对吧?)。

为此,我利用 Google Cloud Functions 在允许访问页面之前检查用户是否已登录。 这是在 firebase.json 上实现的代码:

"hosting": {
  "rewrites": [ {
    "source": "/home.html",
    "function": "home"
  } ]
}

在 home 函数中,我运行以下代码来检查 Id Token 是否有效:

admin.auth().verifyIdToken(idToken).then((decodedToken) => {
    const userId = decodedToken.uid;
})

我面临的问题是 idToken 的值无效:

Firebase ID 令牌的算法不正确。预期“无”但得到 "RS256"

我尝试从 result.credential.accessToken 中复制并粘贴该值,但仍然收到相同的错误消息。

firebase.auth().getRedirectResult().then(function(result) {
if (result.credential) {
          var token = result.credential.accessToken;
}
});

任何帮助将不胜感激。 谢谢!

【问题讨论】:

    标签: firebase firebase-authentication google-cloud-functions


    【解决方案1】:

    我了解到您将 HTTPS 请求定向到您的 home HTTPS 云函数。

    您应该将 Firebase ID 令牌作为 HTTP 请求的 Authorization 标头中的 Bearer 令牌传递,如下面的官方 Cloud Function sample 中解释和演示的那样。

    【讨论】:

    • 谢谢,雷诺塔内克!我猜想使用会话 cookie 而不是 HTTP 标头将允许我的用户返回页面而无需再次进行身份验证(只要 cookie 未过期)。由于第一次点击(直接从浏览器)到云功能不会包含授权标头,因此用户每次尝试运行“家庭”受保护的云功能时都需要进行身份验证。
    • 不,您不需要为每个呼叫进行身份验证。看样例中JS文件的下面line:它调用了getIdToken方法,如果没有过期则返回当前token。 否则,它会刷新令牌并返回一个新令牌。
    • 我觉得官方的示例代码和我的用例还是有区别的。当用户在浏览器中点击 URL MY_DOMAIN/dashboard.html 时,HTTP 请求将被重定向到云函数,因此无法通过 JS 在 HTTP 请求中附加 Authorization 标头。结果,该函数将始终为第一次点击返回“UNAUTHORIZED”,并将用户重定向到登录页面。登录后,这是我可以将身份验证标头附加到 HTTP 请求的唯一时刻,因此对函数的以下调用具有正确的 Firebase ID 令牌。
    • 好的,这与第一次命中的这一方面不同,但如果我没记错的话,从全局上讲,它是你需要实现的相同机制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    • 2012-04-16
    • 2019-06-01
    • 1970-01-01
    • 2017-06-08
    • 2018-01-27
    相关资源
    最近更新 更多