Spring 引导授权服务器 /oauth/authorize 上出现未经授权的错误
Unauthorized error on Spring Boot Authorization Server /oauth/authorize
我正在尝试使用 @EnableAuthorizationServer
和内存客户端在 Spring 引导中为 OAuth2 授权服务器开发一个简单的 POC。
我的网络安全配置 class 如下所示:
package com.example.authservice;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http.antMatcher("/**")
.authorizeRequests().
antMatchers("/", "/login**", "/oauth/authorize", "/oauth/authorize**")
.permitAll().
anyRequest()
.authenticated();
}
}
授权服务器配置如下:
package com.example.authservice;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory().
withClient("auth-client").
secret("secret-key").
authorizedGrantTypes("authorization_code").
scopes("openid");
}
}
这是基于授权代码授予流程,当我尝试获取代码(将在下一次调用中使用以获取访问令牌)时,出现未授权错误。
curl -X GET \
'http://localhost:8080/oauth/authorize?client_id=auth-client&client_secret=secret-key&grant_type=authorization_code&response_type=code'
错误:
{
"timestamp": "2019-03-20T15:35:41.009+0000",
"status": 403,
"error": "Forbidden",
"message": "Access Denied",
"path": "/oauth/authorize"
}
我假设因为 /oauth/authorize
在我的网络安全配置中是允许的,它应该 return 一个可用于获取访问令牌的代码。有没有人知道可能出了什么问题。
当用户尝试通过调用 /oauth/authorize
生成授权代码时,用户应该告诉服务 he/she 是谁,即进行身份验证。这就是授权端点知道用户是否有权获取此令牌的方式。因此,我的服务中缺少的一个重要部分是身份验证。在 Spring 引导中,身份验证由 AuthenticationManager
.
处理
补充缺失的部分,下面是WebSecurityConfigurerAdapter.java
的修改版本:
package com.example.authservice;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf()
.disable()
.antMatcher("/**")
.authorizeRequests()
.antMatchers("/login")
.permitAll()
.anyRequest()
.authenticated()
.and().
httpBasic();
}
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("user").password("{noop}password").roles("ROLE");
}
}
这会向 Spring 引导服务添加基本 HTTP 身份验证。现在,当您尝试使用 HTTP 基本身份验证调用 /oauth/authorize
时,它将成功重定向到您传递的 redirect_uri
.
/oauth/authorize
是默认的授权服务器端点,这意味着它具有高优先级安全级别。
authorizeRequests().antMatchers("/oauth/authorize").permitAll()
不适用于 spring 安全默认设置 api。如果你使用浏览器来测试
之类的东西会更好
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication().passwordEncoder(new PasswordEncoder() {
@Override
public String encode(CharSequence charSequence) {
return charSequence.toString();
}
@Override
public boolean matches(CharSequence charSequence, String s) {
return s.equals(charSequence.toString());
}
})
.withUser("gig")
.password("123456")
.roles("USER");
}
此外,最好在您的作用域后添加一个 redirectUris。
我的测试 url
http://localhost:8080/oauth/authorize?response_type=code&client_id=auth-client-&redirect_uri=http://www.baidu.com&scope=all
我正在尝试使用 @EnableAuthorizationServer
和内存客户端在 Spring 引导中为 OAuth2 授权服务器开发一个简单的 POC。
我的网络安全配置 class 如下所示:
package com.example.authservice;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http.antMatcher("/**")
.authorizeRequests().
antMatchers("/", "/login**", "/oauth/authorize", "/oauth/authorize**")
.permitAll().
anyRequest()
.authenticated();
}
}
授权服务器配置如下:
package com.example.authservice;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory().
withClient("auth-client").
secret("secret-key").
authorizedGrantTypes("authorization_code").
scopes("openid");
}
}
这是基于授权代码授予流程,当我尝试获取代码(将在下一次调用中使用以获取访问令牌)时,出现未授权错误。
curl -X GET \
'http://localhost:8080/oauth/authorize?client_id=auth-client&client_secret=secret-key&grant_type=authorization_code&response_type=code'
错误:
{
"timestamp": "2019-03-20T15:35:41.009+0000",
"status": 403,
"error": "Forbidden",
"message": "Access Denied",
"path": "/oauth/authorize"
}
我假设因为 /oauth/authorize
在我的网络安全配置中是允许的,它应该 return 一个可用于获取访问令牌的代码。有没有人知道可能出了什么问题。
当用户尝试通过调用 /oauth/authorize
生成授权代码时,用户应该告诉服务 he/she 是谁,即进行身份验证。这就是授权端点知道用户是否有权获取此令牌的方式。因此,我的服务中缺少的一个重要部分是身份验证。在 Spring 引导中,身份验证由 AuthenticationManager
.
补充缺失的部分,下面是WebSecurityConfigurerAdapter.java
的修改版本:
package com.example.authservice;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf()
.disable()
.antMatcher("/**")
.authorizeRequests()
.antMatchers("/login")
.permitAll()
.anyRequest()
.authenticated()
.and().
httpBasic();
}
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("user").password("{noop}password").roles("ROLE");
}
}
这会向 Spring 引导服务添加基本 HTTP 身份验证。现在,当您尝试使用 HTTP 基本身份验证调用 /oauth/authorize
时,它将成功重定向到您传递的 redirect_uri
.
/oauth/authorize
是默认的授权服务器端点,这意味着它具有高优先级安全级别。
authorizeRequests().antMatchers("/oauth/authorize").permitAll()
不适用于 spring 安全默认设置 api。如果你使用浏览器来测试
之类的东西会更好 @Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication().passwordEncoder(new PasswordEncoder() {
@Override
public String encode(CharSequence charSequence) {
return charSequence.toString();
}
@Override
public boolean matches(CharSequence charSequence, String s) {
return s.equals(charSequence.toString());
}
})
.withUser("gig")
.password("123456")
.roles("USER");
}
此外,最好在您的作用域后添加一个 redirectUris。 我的测试 url
http://localhost:8080/oauth/authorize?response_type=code&client_id=auth-client-&redirect_uri=http://www.baidu.com&scope=all