【问题标题】:How to secure ClientID in OAuth2?如何在 OAuth2 中保护 ClientID?
【发布时间】:2016-10-26 18:43:46
【问题描述】:

我们想开发一个带有外部 OAuth2 服务器 (IdentityServer4) 的 Angular 2 应用程序。

我们还希望识别每个客户的唯一性。但是如何保护 Angular 2 / Javascript 源代码中的 ClientID? 我们是否必须在这里与 CORS 合作并检查请求的来源?我们是否必须为身份验证构建服务器端应用程序?

我们的移动应用应使用 ClientID 12345 我们的 Angular 应用应该使用 ClientID 99999

但如果其他人尝试使用 ClientID 12345,它应该被拒绝。

这里的最佳做法是什么? - 直接使用 Angular 进行身份验证? - 为每个 Angular App 使用一个 Serverapp 进行身份验证?

【问题讨论】:

    标签: angularjs authentication angular oauth2 identityserver4


    【解决方案1】:

    您无法验证公共客户端 - 没有安全的方法可以做到这一点。

    特别是对于基于浏览器的客户端,您只能使用公共返回 URL 的所有权来标识客户端。

    这是不可能的——OAuth2 不会改变这种情况。

    【讨论】:

      【解决方案2】:

      OAuth2 使用一对重要的密钥。

      ClientID 和 ClientSecret 都是用来识别一个应用的。 ClientID 可以是公开的,这是需要保密的秘密:)。

      由于您的代码将是客户端的,因此会出现问题。我很确定有一个仅适用于客户端的 OAuth2 实现。老实说,我不相信它的安全性,因为无论您做什么,客户端所做的一切都是可见的。

      在这种情况下我所做的是有一个小后端,它是客户端应用程序和 OAuth2 服务器之间的额外层。它可能是一个非常简单的 MVC 或一个非常简单的 WebApi2,它只会提供前端使用的端点,但它的主要职责是从前端接听调用,添加密钥并创建 OAuth2 调用以供使用由实际的资源服务器。这样一来,您的密钥就不会存储在前端,您可以使用任何机制来确保它们在后端的安全。

      只需让您始终在身份验证标头中传递这些内容,并且您始终通过 https 连接使用身份验证/资源服务器。

      【讨论】:

      • 所以隐藏客户端密码的最佳实践是始终将 Angular 与运行身份验证的 ASP.NET Core 之类的服务器端应用程序一起提供?我不仅可以在 CDN 上运行 Angular 并与 OAuth 2 服务器交互并保护数据吗?这……不是压倒性的。
      • 有一个你可以查看的节点包:npmjs.com/package/node-oauth2-server。无论哪种方式,您都需要一个后端,无论是节点还是其他东西。您无法摆脱需要 id 和 secret 才能获得令牌的事实。如果您能找到一种方法将它们安全地存储在前端,那么您就解决了问题。