手动实施Oauth2授权代码授予流程

时间:2020-01-18 18:35:04

标签: java spring-boot oauth-2.0

我计划手动实施Oauth2授权代码授予流程(使用PKCE)。我的问题部分与this有关。我正在使用Java,Springboot。

我想用Oauth保护我的后端API。这些api由本机应用程序调用。大多数用于授权代码授予的Oauth实现都需要用户交互。我想知道是否有可能避免这种情况。由于我的应用程序在本机应用程序上运行,因此我不希望将用户重定向到浏览器进行身份验证。我的应用程序具有注册/登录功能。

我正计划实现一个过滤器,其中的逻辑看起来类似于此

if(uri contains authorize){
    get all details from request
    generate a uuid and store details in db with ttl
    return uuid as code.
}

else if(uri contains token){
    get all details from request
    extract code from request and check for validity in database.
    if(code valid) {
       generate a JWT with access_token with ttl and refresh_token
       return JWT
    }
}

else{
    check if JWT is present and valid
    if valid proceed
}

我还将有一个刷新令牌的逻辑。我想知道

  1. 这样做是否存在任何安全缺陷
  2. 还有没有其他方法可以在无需用户交互的情况下实现授权码授予流程。
  3. 关于PKCE。使用PKCE可以通过不创建/存储客户端密码来减轻授权码被拦截的威胁。但是,是什么阻止了用户使用自己的代码质询向授权端点发送请求呢?客户端ID在本机应用中的安全性如何?

1 个答案:

答案 0 :(得分:2)

首先

不要,我重复一次,不要尝试自己实现某种形式的自定义安全性

那是您最糟糕的事情之一。安全性很复杂,通常需要多个团队来实施。这就是为什么我们有标准库的原因。 使用Spring Security。

回答您的问题:

  1. 安全漏洞无处不在。安全性远不只是您发布的一小段代码。 oauth2是一个标准,其中包含有关验证和检查内容以及验证方式的确切规则。所以我的快速回答是,您未遵循标准。是的,这是不安全的。使用spring安全性。

  2. 不,当您说用户交互时,我不知道您在说什么。您需要遵循定义的流程,并且如果您选择是否自动执行流程,则取决于您。描述您实际上想要做什么。

  3. ClientIds或与此相关的任何事物在任何应用程序中都永远不安全。这完全取决于您要寻找的安全级别。如果我们在谈论企业安全性,那么通常会将所有机密存储在后端中,并为您的前端应用程序实现某种BFF,以保存所有客户端机密并执行交换。唯一存储在客户端中的是不同类型的安全cookie。

因此,如果您选择实际的本机应用程序进行交换,或者某种代理服务由您决定。但是不,对于任何客户来说,绝没有秘密是安全的。