Spring Security OAUTH2 使用用户名/密码获取令牌

Posted

技术标签:

【中文标题】Spring Security OAUTH2 使用用户名/密码获取令牌【英文标题】:Spring Security OAUTH2 getting token with username/password 【发布时间】:2015-03-09 11:32:21 【问题描述】:

我的问题很“简单”。我不知道如何设置我的 OAUTH2 身份验证服务器以接受用户名/密码并返回我的令牌。

如果我使用:

curl curl:password@localhost:8081/oauth/token\?grant_type=client_credentials 它返回我的令牌,但问题是它在数据库中注册用户“curl”所以......不太好......

如果我使用:

http://www.example.com:8081/oauth/authorize?client_id=web&response_type=token 它提示用户名和密码对话框,我输入它们然后它问我“你授权'网络'访问你的受保护资源吗?

scope.read:批准拒绝”

我可以将这两者结合起来,然后创建简单的请求来返回令牌吗?我想在 Spring Boot 和 Jersey 中使用 RESTful WS 将它用于 angularjs 前端。

我应该使用这个方案吗 https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth2/src/test/resources/schema.sql

使用这个配置 -> clients.jdbc(dataSource);

如何为该方案设置一个用户?只需使用用户名和密码进行基本登录。

Oauth 配置

@Configuration
@EnableAuthorizationServer
public class OAuthConfiguration extends AuthorizationServerConfigurerAdapter


@Autowired
private DataSource dataSource;

@Bean
public TokenStore tokenStore()

    return new JdbcTokenStore(dataSource);


@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception

    endpoints.tokenStore(tokenStore());


@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception

    // @formatter:off
    clients.inMemory()
            .withClient("curl")
            .authorities("USER")
            .resourceIds("reee")
            .scopes("read", "write")
            .authorizedGrantTypes("client_credentials")
            .secret("password")
            .and()
            .withClient("web")
            .redirectUris("http://github.com/techdev-solutions/")
            .resourceIds("reee")
            .scopes("read")
            .authorizedGrantTypes("implicit");
    // @formatter:on


安全配置

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter

@Autowired
private DataSource dataSource;

@Override
protected void configure(HttpSecurity http) throws Exception

    http.authorizeRequests().antMatchers("/**").authenticated()
            .and().httpBasic().realmName("OAuth Server");


@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception

    PasswordEncoder encoder = new BCryptPasswordEncoder();

    auth.userDetailsService(userDetailsService()).passwordEncoder(encoder);
    auth.jdbcAuthentication().dataSource(dataSource);


@Bean
public UserDetailsService userDetailsService()

    return new CustomUserDetailsService(dataSource);


【问题讨论】:

“它在数据库中注册用户“curl”是什么意思...” 在 OAUTH_ACCESS_TOKEN 表中创建了新令牌,并且 client_id 为“curl”且 user_name 为空。但是对于“网络”客户端,它会注册我的用户名“bla@gmail.com”,但是如果我想授权该用户访问受保护的资源,则会出现确认对话框。如何避免该对话框? 【参考方案1】:

我认为我们有类似的问题,因为我打开了一个 q & a what are the java* configuration for oauth2 to return token after authentication

您可以通过在请求的标题http://localhost:8081/oauth/authorize?client_id=web&response_type=token 中添加用户名和密码来避免用户名和密码框,并在您的 Web 客户端配置中添加 clients.inMemory().autoApprove(true) 但是服务器将响应重定向网址。我的问题是我不希望它重定向我只想要响应中的令牌..

【讨论】:

以上是关于Spring Security OAUTH2 使用用户名/密码获取令牌的主要内容,如果未能解决你的问题,请参考以下文章

使用 spring-session 和 spring-cloud-security 时,OAuth2ClientContext (spring-security-oauth2) 不会保留在 Redis

针对授权标头的Spring Security OAuth2 CORS问题

使用spring security jwt spring security oauth2权限控制遇到的坑记录

Spring Security 入门(1-3)Spring Security oauth2.0 指南

Spring Security OAuth2 - 如何使用 OAuth2Authentication 对象?

oauth2 spring-security 如果您在请求令牌或代码之前登录