Oauth 2.0 OAuth在数据库中存储客户端id和密码

Oauth 2.0 OAuth在数据库中存储客户端id和密码,oauth-2.0,spring-security-oauth2,Oauth 2.0,Spring Security Oauth2,我正在读一篇关于oauth2.0的文章,里面有jwt标记。有趣的是,当作者描述客户的秘密时,他说: 在一个非平凡的实现中,客户端ID和密码将安全地存储在数据库中,并可通过客户端应用程序在部署期间访问的单独API进行检索 现在让我们假设我在angular中有一个前端应用程序,在spring中有一个后端应用程序和MySQL db 我的问题是作者上述引用的意思。是吗? 客户端(本例中为前端应用程序)使用client\u id 和secret(此处没有更改),但后端正在检查 提供的“凭据”不是通过与以纯

我正在读一篇关于
oauth2.0
的文章,里面有
jwt
标记。有趣的是,当作者描述客户的秘密时,他说:

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

现在让我们假设我在angular中有一个前端应用程序,在spring中有一个后端应用程序和MySQL db

我的问题是作者上述引用的意思。是吗? 客户端(本例中为前端应用程序)使用
client\u id
secret
(此处没有更改),但后端正在检查 提供的“凭据”不是通过与以纯文本形式存储的值进行比较(在
application.properties(在这种情况下为
),但从收到的值和 与数据库中的哈希版本相比


已编辑

  • 用户
    johndoe
    打开
    登录
    页面。提供凭据:
    用户名:john.doe
    密码:john1
    。单击
    登录
  • Angular前端截取请求,并执行一个方法(例如,obtainTokenForUser()),以便为用户获取一个短期有效的jwt令牌。因此,angular应用程序向授权服务器发送符合OAuth2.0的请求。在发送contant
    AWS KMS
    以获取其
    client_id
    secret
    以附加到请求之前。最后,angular向auth server发出的请求如下:
    curl front-app-sp3:frnt4pP@:/oauth/token-d grant_type=password-d username=john.doe-d password=john1
  • Authorization server
    contacts
    AWS KMS
    for received
    client\u id:front-app-sp3
    client\u secret:frnt4pP
    。它发现条目、密码匹配、验证正确<代码>身份验证服务器生成有效的JWT令牌,即
    5分钟
    。服务器使用
    作为\u pr1v4t3
    私钥对令牌进行签名<代码>授权服务器向应用程序返回令牌
  • 用户已登录。用户在主应用程序中请求一个资源(在spring中),从而添加一个获得的令牌并将请求发送到“主web应用程序”
  • “主web应用程序”中的资源服务器验证令牌。令牌正确有效。返回资源

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

    这是一个已经实现的模式。与直接在app.config/application.properties文件中保存秘密值不同,您应该将它们保存在如下内容中:


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

    当然我明白了:1)这篇文章的作者(努霍恩先生)正在谈论通过后端访问
    客户id
    机密
    ,而你正在考虑通过前端访问它们2)努霍恩先生说:你可以在
    应用程序中保留
    客户id
    机密
    (可通过后端直接访问)或在数据库中-可通过单独的API访问。3)您说:当涉及到通过前端访问这些信息时,应该通过“密钥管理服务”。我做对了吗?编辑了我的答案以反映更好的情况1。如果你说的是angular应用程序中的前端,那就是否定的。你应该只有令牌,而不是客户id或客户机密。如果你说的是服务器端的前端,它直接与angular应用程序通信(你的REST端点等等),那么是的,我指的是这个。2.没错,他是这么说的。3.您永远不应该通过前端访问这些信息。我创建了一个小图片,并提供了一个示例/简单用例。如果您能看一看并给我一些反馈,我会非常高兴。@user3529850您的“主web应用程序”应该打电话来检索客户端id和客户端机密,而不是您的angular应用程序。你的angular应用程序在任何阶段都无法知道客户端的秘密是什么,这是一个严重的安全问题。