Spring 安全 Oauth 客户端 - 像邮递员示例一样请求
Spring security Oauth client - Request like a postman example
我正在尝试执行执行 OAuth 流程的 JUnit 测试。
我的客户构建了一个 OAuth 提供程序,当我使用邮递员进行测试时,邮递员向我展示了一个屏幕来填写凭据,之后,邮递员存储了信息 (access_token, id_token, 所有JWT信息), 就可以了
看例子:
我要测试的代码是:
@Test
public void getAccessTokenViaSpringSecurityOAuthClient() {
try {
OAuth2ProtectedResourceDetails resourceDetails = googleOAuth2Details();
OAuth2RestTemplate oAuthRestTemplate = new OAuth2RestTemplate(resourceDetails);
org.springframework.http.HttpHeaders headers = new org.springframework.http.HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
OAuth2AccessToken token = oAuthRestTemplate.getAccessToken();
System.out.println(oAuthRestTemplate.getResource());
System.out.println(oAuthRestTemplate.getOAuth2ClientContext());
System.out.println(token);
Assert.assertTrue(token != null);
} catch (Exception e) {
e.printStackTrace();
}
}
public OAuth2ProtectedResourceDetails googleOAuth2Details() {
AuthorizationCodeResourceDetails googleOAuth2Details = new AuthorizationCodeResourceDetails();
googleOAuth2Details.setClientId("xxxxx");
googleOAuth2Details.setUserAuthorizationUri("https://xxx/yyy/oauth2/authorize");
googleOAuth2Details.setAccessTokenUri("https://xxx/yyy/oauth2/token");
googleOAuth2Details.setScope(Arrays.asList("openid"));
googleOAuth2Details.setPreEstablishedRedirectUri("https://www.getpostman.com/oauth2/callback");
googleOAuth2Details.setAuthenticationScheme(AuthenticationScheme.query);
googleOAuth2Details.setClientAuthenticationScheme(AuthenticationScheme.form);
return googleOAuth2Details;
}
当我运行任务时,出现这个异常:
org.springframework.security.oauth2.client.resource.UserRedirectRequiredException: A redirect is required to get the users approval
是否可以测试此流程?
我该怎么做?
异常说明了问题:A redirect is required to get the users approval
。
Postman 隐藏了这样一个事实,即一旦授权过程结束,授权服务器会将您的浏览器重定向到 redirect_uri
,或 Postman 命名的回调 URL。 URL收集授权服务器下发的授权码,请求token
有关更多详细信息,请参阅授权代码流程:
这意味着您不能对授权服务器的授权代码授予进行“单元测试”。您需要某种网络服务器来处理授权代码流的回调。
通过使用 @EnableOAuth2Sso
创建一个 @SpringBootTest
和 Spring 引导应用程序,您可能会更快地测试您的授权。 Spring Boot 会为您自动配置 OAuth2RestTemplate
,您可以在 JUnit 测试中使用它 @Autowired
。
我正在尝试执行执行 OAuth 流程的 JUnit 测试。
我的客户构建了一个 OAuth 提供程序,当我使用邮递员进行测试时,邮递员向我展示了一个屏幕来填写凭据,之后,邮递员存储了信息 (access_token, id_token, 所有JWT信息), 就可以了
看例子:
我要测试的代码是:
@Test
public void getAccessTokenViaSpringSecurityOAuthClient() {
try {
OAuth2ProtectedResourceDetails resourceDetails = googleOAuth2Details();
OAuth2RestTemplate oAuthRestTemplate = new OAuth2RestTemplate(resourceDetails);
org.springframework.http.HttpHeaders headers = new org.springframework.http.HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
OAuth2AccessToken token = oAuthRestTemplate.getAccessToken();
System.out.println(oAuthRestTemplate.getResource());
System.out.println(oAuthRestTemplate.getOAuth2ClientContext());
System.out.println(token);
Assert.assertTrue(token != null);
} catch (Exception e) {
e.printStackTrace();
}
}
public OAuth2ProtectedResourceDetails googleOAuth2Details() {
AuthorizationCodeResourceDetails googleOAuth2Details = new AuthorizationCodeResourceDetails();
googleOAuth2Details.setClientId("xxxxx");
googleOAuth2Details.setUserAuthorizationUri("https://xxx/yyy/oauth2/authorize");
googleOAuth2Details.setAccessTokenUri("https://xxx/yyy/oauth2/token");
googleOAuth2Details.setScope(Arrays.asList("openid"));
googleOAuth2Details.setPreEstablishedRedirectUri("https://www.getpostman.com/oauth2/callback");
googleOAuth2Details.setAuthenticationScheme(AuthenticationScheme.query);
googleOAuth2Details.setClientAuthenticationScheme(AuthenticationScheme.form);
return googleOAuth2Details;
}
当我运行任务时,出现这个异常:
org.springframework.security.oauth2.client.resource.UserRedirectRequiredException: A redirect is required to get the users approval
是否可以测试此流程? 我该怎么做?
异常说明了问题:A redirect is required to get the users approval
。
Postman 隐藏了这样一个事实,即一旦授权过程结束,授权服务器会将您的浏览器重定向到 redirect_uri
,或 Postman 命名的回调 URL。 URL收集授权服务器下发的授权码,请求token
有关更多详细信息,请参阅授权代码流程:
这意味着您不能对授权服务器的授权代码授予进行“单元测试”。您需要某种网络服务器来处理授权代码流的回调。
通过使用 @EnableOAuth2Sso
创建一个 @SpringBootTest
和 Spring 引导应用程序,您可能会更快地测试您的授权。 Spring Boot 会为您自动配置 OAuth2RestTemplate
,您可以在 JUnit 测试中使用它 @Autowired
。