有了新的firebase云功能,我决定将我的一些HTTP端点移动到firebase。一切都很好...但我有以下问题。我有两个由HTTP触发器构建的端点(云函数)
- API端点,用于创建用户并返回Firebase Admin SDK生成的自定义令牌。
1.用于获取某些用户详细信息的API端点。
虽然第一个端点是好的,但对于我的第二个端点,我希望只为经过身份验证的用户保护它。也就是说拥有我之前生成的令牌的人。
我该如何着手解决这个问题?
我知道我们可以在云函数中使用Header参数
request.get('x-myheader')
但是有没有一种方法可以像保护真实的数据库一样保护端点呢?
9条答案
按热度按时间nhn9ugyo1#
有一个官方的code sample来说明你要做的事情。它演示了如何设置HTTPS函数,以要求使用客户端在身份验证期间接收到的令牌的Authorization头。该函数使用firebase-admin库来验证令牌。
此外,如果您的应用能够使用Firebase客户端库,您可以使用“callable functions”来使许多模板更容易。
rsl1atfo2#
正如@Doug所提到的,您可以使用
firebase-admin
来验证令牌。我举了一个简单的例子:在上面的示例中,我还启用了CORS,但这是可选的。首先,获取
Authorization
报头并找出token
。然后,您可以使用
firebase-admin
来验证该令牌。您将在响应中获得该用户的解码信息。否则,如果令牌无效,它将抛出一个错误。zaqlnxep3#
正如@Doug所提到的,您可以使用Callable Functions来从您的客户端和服务器获取exclude some boilerplate code。
示例可调用函数:
它可以直接从客户端调用,如下所示:
3yhwsihp4#
上面的方法使用函数内部的逻辑对用户进行身份验证,因此必须仍然调用函数来进行检查。
这是一个很好的方法,但为了全面起见,还有一个替代方案:
你可以将一个函数设置为“私有”,这样除了注册用户之外,它就不能被调用(权限由你决定)。在这种情况下,未经验证的请求在函数的上下文之外被拒绝,并且函数根本不会被调用。
下面是对(a)将函数配置为public/private,然后(b)authenticating end-users to your functions的引用。
请注意,上面的文档是针对Google Cloud Platform的,实际上,这是可行的,因为每个Firebase项目也是GCP项目。与此方法相关的一个警告是,截至撰写本文时,它仅适用于基于Google帐户的身份验证。
67up9zun5#
在Firebase中,为了简化您的代码和工作,只需架构设计:
1.对于公共访问站点/内容,请使用HTTPS triggers with
Express
。要仅限制同一站点或仅特定站点,请使用CORS
来控制这方面的安全性。这是有意义的,因为Express
由于其服务器端渲染内容而对SEO非常有用。1.对于需要用户认证的应用,使用HTTPS Callable Firebase Functions,然后使用
context
参数来保存所有麻烦。这也是有道理的,因为例如用AngularJS构建的单页应用程序- AngularJS对SEO不利,但由于它是一个受密码保护的应用程序,因此您也不需要太多的SEO。至于模板,AngularJS有内置的模板,所以不需要Express
的服务器端模板。那么Firebase Callable Functions就足够了。考虑到上述情况,没有更多的麻烦,使生活更容易。
btxsgosb6#
你可以把它当作函数返回布尔值。如果用户验证与否,您将继续或停止您的API。此外,您可以从变量decode返回声明或用户结果
tyky79it7#
这里有很多很棒的信息,对我很有帮助,但我认为为第一次使用Angular尝试的人分解一个简单的工作示例可能会很好。Google Firebase文档可在www.example.com找到https://firebase.google.com/docs/auth/admin/verify-id-tokens#web。
dldeef678#
有一个很好的官方示例,使用Express -将来可能会很方便:https://github.com/firebase/functions-samples/blob/master/authorized-https-endpoint/functions/index.js(粘贴在下面只是为了确定)
请记住,
exports.app
使您的函数在/app
slug下可用(在本例中,只有一个函数在<you-firebase-app>/app/hello
下可用)。为了摆脱它,实际上需要重写Express部分(用于验证的中间件部分保持不变-它工作得非常好,并且由于注解而非常容易理解)。我的重写摆脱
/app
:wooyq4lh9#
我一直在努力在golang GCP功能中获得适当的firebase身份验证。实际上没有这样的例子,所以我决定建立这个小库:https://github.com/Jblew/go-firebase-auth-in-gcp-functions
现在你可以很容易地使用firebase-auth对用户进行身份验证(这与gcp-authenticated-functions不同,并且不直接由identity-aware-proxy支持)。
下面是使用该实用程序的示例:
只要记住部署函数时要使用
--allow-unauthenticated
标志(因为firebase身份验证发生在函数执行过程中)。“我希望这能帮助你,就像它帮助我一样。出于性能原因,我决定使用golang作为云函数 * -Jđdrzej