【问题标题】:OAuth storing client id and secret in databaseOAuth 在数据库中存储客户端 ID 和密码
【发布时间】:2019-05-17 01:37:46
【问题描述】:

我正在阅读关于 OAuth 2.0jwt 令牌的 article。有趣的部分是当作者描述client_secret时,他说:

在一个重要的实现中,客户端 ID 和密码将安全地存储在数据库中,并可通过客户端应用程序在部署期间访问的单独 API 进行检索。

现在假设我有一个 Angular 前端应用程序和一个带有 MySQL db 的 Spring 后端应用程序。

我的问题是作者所说的上述引用是什么意思。是那个吗 客户端(在这种情况下为前端应用程序)使用client_id 拨打电话 和secret(这里没有变化),但后端正在检查 提供“凭据”不是通过与存储在纯文本中的值进行比较(在 application.properties 在这种情况下),但是从收到的值和 与 db 中的哈希版本比较?


已编辑

  1. 用户john doe 打开log in 页面。提供凭据:username:john.doepassword:john1。点击sign in
  2. Angular-frontend 拦截请求,并执行一个方法(例如obtainTokenForUser())以便为用户获取一个短期有效的 jwt 令牌。因此,angular-app 向authorization server 发送符合OAuth2.0 的请求。在发送 contant AWS KMS 以获取其 client_idsecret 以附加到请求之前。最后,从角度到身份验证服务器的请求如下所示:curl front-app-sp3:frnt4pP@<auth_server_ip_addr>:<auth_server_port>/oauth/token -d grant_type=password -d username=john.doe -d password=john1
  3. Authorization server 联系人 AWS KMS 收到 client_id:front-app-sp3client_secret:frnt4pP。它发现条目、密码匹配、验证正确。 Auth server 生成一个 JWT 令牌有效 f.e. 5 minutes。令牌由服务器使用AS_pr1v4t3 私钥签名。 Authorization server 向 Angular 应用返回一个令牌。
  4. 用户已登录。用户在主应用程序中请求资源(春季),因此 Angular 添加获得的令牌并将请求发送到“Main-web 应用程序”。
  5. “主网络应用程序”中的 Resource server 验证令牌。令牌正确有效。资源被退回。

【问题讨论】:

    标签: oauth-2.0 spring-security-oauth2


    【解决方案1】:

    我不认为这就是作者所指的。他正在谈论而不是在您的 application.properties 中使用 client_idclient_secret ,它们将存储在您的后端可以通过不同 API 访问的数据库中。我认为client_id 更多地属于 application.properties 而不是秘密管理服务。 您的前端(在本例中为 Angular 应用程序)不应访问客户端 ID 或密钥。 Angular 应用程序连接到的服务器(通过我想象的一些 REST 服务)也不应该直接访问机密,它应该通过单独的机密管理 API。 您的服务器可以拥有 @ 987654326@ 在应用程序属性中,但机密应存储在非常安全的地方。

    虽然这是一个已经实现的模式。而不是直接在 app.config / application.properties 文件中包含秘密值,您应该将它们放在类似的位置:

    这些将允许您存储/更新/检索和轮换您的秘密。

    【讨论】:

    • 确保我明白了:1) 文章的作者(Nouhoun 先生)正在谈论通过后端访问 client_idsecret,而您正在考虑通过前端访问它们 2) Nouhoun 先生说:您可以将client_idsecret 保存在app.properites(后端直接访问)或数据库中——通过单独的API 访问。 3)你说:当涉及到通过前端访问这些信息时,它应该是通过“密钥管理服务”。我做对了吗?
    • 编辑了我的答案以更好地反映
    • 1.如果您在 Angular 应用程序中谈论前端,那是不行的。您应该只有令牌,而不是 client_id 或 client_secret。如果您正在谈论直接与角度应用程序通信的服务器端的前端(因此您的 REST 端点等),那么是的,我指的是那个。 2. 正确 - 他这么说。 3. 你不应该通过你的前端访问这些信息。
    • 我创建了一张小图片和一个示例/简单的用例。如果您能看一下并给我一些反馈,我会非常高兴。
    • @user3529850 您的“主要网络应用程序”应该调用以检索 client_id 和 client_secret - 而不是您的 Angular 应用程序。您的 Angular 应用程序在任何阶段都无法知道客户端密码是什么,这是一个重大的安全问题。
    猜你喜欢
    • 2018-04-25
    • 1970-01-01
    • 2017-10-18
    • 2017-05-09
    • 2016-03-22
    • 2019-12-04
    • 2020-09-19
    • 1970-01-01
    • 2011-08-28
    相关资源
    最近更新 更多