可以从客户端安全地将Oauth用于后端服务吗?

时间:2019-06-02 06:33:29

标签: oauth oauth-2.0

我有一个Web应用程序(C#/ Javascript),我想在其中调用自己拥有的后端服务。我想保护该服务,以便只有我的应用可以调用它。好像我在客户端使用Oauth一样,秘密就暴露出来了吗?我阅读的有关Oauth的所有文档都在应用程序的用户拥有资源时(而不是在应用程序本身拥有资源时)给出解决方案。我正在查看google api的工作方式,而JavaScript库似乎在客户端公开了密钥,不是吗?

2 个答案:

答案 0 :(得分:1)

是的,您可以使用OAuth来完成此操作,但是如何进行取决于具体如何组织通过后端服务访问的数据。如果数据实际上是特定于用户的,则您的用户确实是资源所有者。在这种情况下,您将使用典型的授权码授予。使用此授予类型,您可以在OAuth身份验证服务器上注册客户端,并接收client_id和client_secret。实际上,client_id已在浏览器中公开,但是client_secret位于您的Web应用服务器中,并且从不公开。它仅在反向通道(非浏览器)请求上发送到您的身份验证服务器。这里的主要内容是只有您自己的客户端Web应用程序将被注册并接收client_id / client_secret。您只需要不提供任何公共注册端点即可,因此没有其他客户端可以注册。使用这种授予类型,为了使您的Web应用获得访问后端服务上的用户数据的授权,作为该过程的一部分,用户需要在浏览器中批准该授权。

另一方面,如果您在后端服务上访问的数据不是特定于用户的,则可以使用OAuth客户端凭据授予。使用此授予类型,您可以像以前一样注册客户端,并接收client_id和client_secret。机密安全地存储在Web应用程序服务器上,并且仅在反向通道请求中传递。您将避免允许任何其他客户端进行注册。这样,您的Web应用就可以获得对后端服务的授权,甚至不需要浏览器中的任何用户授权。

答案 1 :(得分:0)

恐怕没有办法限制仅由应用程序的代码调用API。具有公共代码的浏览器应用程序不能保存任何可以识别它们的秘密(例如证书),因为任何人都可以从代码中提取它。编译成字节码的台式机和移动应用程序不太容易阅读,但是通过一些努力,攻击者才能找到秘密数据。这也是这些应用程序(所谓的公共客户端)充当OAuth2客户端时不持有client_secret的原因。他们改用一次性机密-PKCE

您可以做的是检查从前端应用程序发送到后端的访问令牌的访问者(该令牌为其发出的客户端ID)。您可以从token introspection endpointaud属性)或JWT attributes获取此信息,如果令牌是JWT类型的话。