Java - 带有代码的令牌流 OAuth 2 E2E

Posted

技术标签:

【中文标题】Java - 带有代码的令牌流 OAuth 2 E2E【英文标题】:Java - Token flow OAuth 2 E2E with code 【发布时间】:2017-11-18 10:08:58 【问题描述】:

我是安全和 JAVA 新手,我需要实现 OAuth2 的令牌跟踪,这是我需要实现的确切流程(如果有一些库可以帮助它很棒)

http://tutorials.jenkov.com/oauth2/authorization-code-request-response.html

如何用 JAVA 实现它,我想使用一些提供此功能的库。令牌流应该反对 UAA,但任何其他类似的例子都会非常有帮助。 我找到了这个例子,但不确定如何使用/测试它与 UAA 的 E2E Postman 对模拟它会很有帮助...

https://developers.google.com/api-client-library/java/google-oauth-java-client/oauth2

UAA 上下文

https://github.com/cloudfoundry/uaa

【问题讨论】:

【参考方案1】:

https://github.com/spring-projects/spring-security-oauth/tree/master/samples/oauth2 包含使用 Spring Security 执行 oauth2 的示例代码。

【讨论】:

【参考方案2】:

这是 Google API 客户端库示例。如果有帮助,试试这个

    public class ServletSample extends AbstractAuthorizationCodeServlet 

  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws IOException 
    // do stuff
  

  @Override
  protected String getRedirectUri(HttpServletRequest req) throws ServletException, IOException 
    GenericUrl url = new GenericUrl(req.getRequestURL().toString());
    url.setRawPath("/oauth2callback");
    return url.build();
  

  @Override
  protected AuthorizationCodeFlow initializeFlow() throws IOException 
    return new AuthorizationCodeFlow.Builder(BearerToken.authorizationHeaderAccessMethod(),
        new NetHttpTransport(),
        new JacksonFactory(),
        new GenericUrl("https://server.example.com/token"),
        new BasicAuthentication("s6BhdRkqt3", "7Fjfp0ZBr1KtDRbnfVdmIw"),
        "s6BhdRkqt3",
        "https://server.example.com/authorize").setCredentialDataStore(
            StoredCredential.getDefaultDataStore(
                new FileDataStoreFactory(new File("datastoredir"))))
        .build();
  

  @Override
  protected String getUserId(HttpServletRequest req) throws ServletException, IOException 
    // return user ID
  


public class ServletCallbackSample extends AbstractAuthorizationCodeCallbackServlet 

  @Override
  protected void onSuccess(HttpServletRequest req, HttpServletResponse resp, Credential credential)
      throws ServletException, IOException 
    resp.sendRedirect("/");
  

  @Override
  protected void onError(
      HttpServletRequest req, HttpServletResponse resp, AuthorizationCodeResponseUrl errorResponse)
      throws ServletException, IOException 
    // handle error
  

  @Override
  protected String getRedirectUri(HttpServletRequest req) throws ServletException, IOException 
    GenericUrl url = new GenericUrl(req.getRequestURL().toString());
    url.setRawPath("/oauth2callback");
    return url.build();
  

  @Override
  protected AuthorizationCodeFlow initializeFlow() throws IOException 
    return new AuthorizationCodeFlow.Builder(BearerToken.authorizationHeaderAccessMethod(),
        new NetHttpTransport(),
        new JacksonFactory(),
        new GenericUrl("https://server.example.com/token"),
        new BasicAuthentication("s6BhdRkqt3", "7Fjfp0ZBr1KtDRbnfVdmIw"),
        "s6BhdRkqt3",
        "https://server.example.com/authorize").setCredentialDataStore(
            StoredCredential.getDefaultDataStore(
                new FileDataStoreFactory(new File("datastoredir"))))
        .build();
  

  @Override
  protected String getUserId(HttpServletRequest req) throws ServletException, IOException 
    // return user ID
  

【讨论】:

【参考方案3】:

有关 OAuth 2.0 流程的详细说明,请访问RFC 6749 Specification。关于一步一步的解决方案,你应该看一些教程,比如this article explaining how to create a Spring REST API using OAuth 2.0。本文介绍了代码以及创建 Postman 请求。关于模拟/测试,我之前使用 TestNG 和 Mockito 为 OAuth 2.0 创建了一个测试套件。

您开发和研究的越多,您就越能找到改进或改变您设计代码的方式的方法。也就是说,如果您真的想遵守 OAuth 2.0 流程,您应该正确理解 RFC 6749 链接中的流程(有时可能相对模糊)。

【讨论】:

【参考方案4】:

我建议您将 Spring 作为用 Java 构建 Web 应用程序的最流行的框架。它具有 Spring Security 模块,可以方便地开发 OAuth 2.0 客户端以及资源服务器,如 here 或 here 所示。

【讨论】:

感谢您的回答,我需要的是一步一步的代码解决方案,以及如何测试它?这就是我放赏金的原因:) OAuth 2.0 中有 4 种不同的流程。您需要哪种流量? UAA 附带支持授权代码流的示例应用程序 - 您是否需要指导如何设置它? 我需要支持这个流程 tutorials.jenkov.com/oauth2/… ,使用 uaa ....谢谢 那么我应该如何编写代码来实现它,你能提供你提供的链接的例子吗?

以上是关于Java - 带有代码的令牌流 OAuth 2 E2E的主要内容,如果未能解决你的问题,请参考以下文章

从客户端 JS 代码中使用 OAuth 授权代码流令牌是不是安全?

授权代码流后,Spring OAuth2 服务器没有响应刷新令牌

如何使用代码授权流在 Spring 应用程序中提取 Oauth2 访问令牌?

OAuth 2 中的不记名令牌和 token_type 是啥?

在带有 PKCE 的 OAuth 授权流中使用时如何在 Azure 应用注册中启用 CORS?

带有 OAuth2 令牌的 AFNetworking 2.0