将用户重定向到oauth2授权服务器以获取令牌Spring Boot

时间:2017-07-21 07:48:54

标签: java spring-boot oauth-2.0

我有2个应用程序正在运行,其中一个是资源服务器,我有需要身份验证才能查看文本的信息。然后我有授权服务器给出令牌。现在我可以使用postman或Insomnia,添加auth_url,token_url,client_id,client_secret,我得到令牌。我将令牌添加到标题中,然后使用标题向我的资源服务器发送get请求,它运行正常。

现在我不知道如何直接从我的资源服务器实现重定向。就像我去

  

本地主机:9000 /家

我想重定向到:

  

本地主机:9001 /登录

我使用我的内存用户登录,然后将其重定向回localhost:9000 / home,我看到了消息。

实现用户访问localhost:9000 / home上信息的最佳方式是什么?你去localhost:9000 / home,它转到localhost:9001上的授权服务器,你用用户名和密码登录。批准授权,它会将您返回到localhost:9000 / home,然后您可以看到文本,以前受保护的内容,因为您没有令牌可以访问它。

ResourceServer.java

@SpringBootApplication
@RestController
@EnableResourceServer
@EnableOAuth2Client
public class SampleResourceApplication extends ResourceServerConfigurerAdapter {
        @Override
    public void configure(HttpSecurity http) throws Exception {
        http.antMatcher("/**")
                .authorizeRequests()
                .antMatchers("/", "/login**").hasRole("user")
                .anyRequest().authenticated();
    }

    @Bean
    public RequestContextListener requestContextListener() {
        return new RequestContextListener();
    }

    public static void main(String[] args) {
        SpringApplication.run(SampleResourceApplication.class, args);
    }

    @RequestMapping("/home")
    public String home() {
        return "this is home";
    }

}

我的属性如下:

server:
  port: 900
security:
  oauth2:
    client:
      client-id: foo
      client-secret: foosecret
      access-token-uri: http://localhost:9001/auth/oauth/token
      user-authorization-uri: http://localhost:9001/auth/oauth/authorize
      grant-type: USER
      auto-approve-scopes: true
    resource:
      user-info-uri: http://localhost:9001/auth/user

2 个答案:

答案 0 :(得分:4)

让代理人分开:您拥有用户(即您,也称为资源所有者),授权服务器资源服务器客户端(访问您的网址的应用程序,即您的浏览器)。

通常情况下会发生这种情况:

  1. 客户端访问资源服务器时,会收到401。根据您的实施情况,您还可以直接将客户端重定向到 AS (使用简单的重定向响应)。
  2. 您的 AS 会提示您输入凭据。验证后,它会为您发出令牌。然后,您可以使用此令牌访问 RS
  3. 您尝试获取的内容(如果我理解正确)是自动重定向令牌。为实现此目的,您可以在步骤1结束时重定向到 AS 时,直接传递您尝试访问的网址(即localhost:9000/home)。 AS hten提示用户输入凭据,生成令牌,将其存储为cookie(如果是浏览器),并将您重定向到他收到的URL(localhost:9000/home)。

    编辑:重定向的结果代码是什么。

    当您到达configure时,首先要检查用户是否已通过身份验证。如果他是,那么一切都很好,但如果他不是,你必须抓住这个事件并开始你的重定向。这可以使用链接exceptionHandling的{​​{1}}方法完成:

    http

答案 1 :(得分:2)

不幸的是,我不熟悉Spring框架,但希望无论如何这都有帮助:

OAuth是授权协议。它不处理身份验证(另请参阅:" What is the difference between authentication and authorization?"在ServerFault上)。

如果我理解正确,您希望用户在转到/login并且尚未登录时被重定向到/home。此步骤与OAuth无关,它必须是应用程序的安全/防火墙设置的一部分。

另请注意,授权服务器上的登录(身份验证)与实际授予应用程序访问资源的权限(授权)之间存在差异。首先,您必须证明自己是谁,然后才能访问您的内容。这是两个单独的步骤。