如何在没有 oauth 但使用 angular 和 dotnet 自定义实现的情况下安全地发送 clientid 和 clientsecret
Posted
技术标签:
【中文标题】如何在没有 oauth 但使用 angular 和 dotnet 自定义实现的情况下安全地发送 clientid 和 clientsecret【英文标题】:How to securely send clientid and clientsecret without oauth but custom implementation with angular and dotnet 【发布时间】:2021-07-06 05:17:10 【问题描述】:我有一个问题试图解决几天,仍然没有得到任何严格的解决方案。
我有一个 Angular 应用程序,该应用程序将公开可用,因此无需登录或凭据即可打开网站,并且用户 ID 是从当前登录用户获取的。 jwt 令牌是由 www.mysite.com/subscribe 获取的,方法是在正文中使用来自 Angular 前端的 get 动词传递 clientid 和 clientsecret。
我有一个后端,需要使用 clientId 和 clientSecret 进行身份验证,以获取 access_token,然后使用 access_token 调用 api 来发布/放置/删除信息。
如果我将 clientId 和 clientSecret 放入代码中,黑客可以窃取并使用它。
有人建议在后端启用 CORS,以确保只处理来自我网站的请求。我已经这样做了,但是知道 clientId 和 clientSecret 即使启用了 CORS,黑客也可以通过添加 origin 和 referrer 作为标头来从 postaman 发送请求。
前端:角度 后端:点网 我们不使用 oauth 提供程序,因为该应用对用户公开内部
问题:通过 get 正文传递这些 clientid 和 clientsecret。这真的是不安全的。
我刚刚进入这个项目,我意识到以前的开发人员的这种不安全的实现。
【问题讨论】:
【参考方案1】:听起来您正在将 OpenID Connect/OAuth 2.0 的 Client Credentials Flow
用于公共客户端,但它是供机密客户端使用的,例如用于机器到机器的通信,例如服务器到服务器。 ClientSecret 应该只用于机密客户端,毕竟它实际上是一个秘密,因此将其嵌入到 Angular 应用等公共客户端中没有任何意义。
您应该实现另一个流而不是Client Credentials Flow
,更适合公共客户端。例如,它可能是Authorization Code Flow with PKCE
(首选)或Resource Owner Password Credentials
(最容易实现)。
【讨论】:
以上是关于如何在没有 oauth 但使用 angular 和 dotnet 自定义实现的情况下安全地发送 clientid 和 clientsecret的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Angular 2 发送 OAuth2 的客户端 ID 和秘密 ID?
Angular 问题和“没有 'Access-Control-Allow-Origin' 标头” - 使用 OAuth 2、Passport、Express 和 Node
如何使用 Spring Boot + Angular 处理外部 OAuth2 身份验证