标签: spring-security-oauth2

无法获取EnableOauth2Sso工作 - BadCredentialsException:无法获取访问令牌

我正在尝试使用简单的Spring OAuth2 SSO应用程序,但我无法这样做.以下是发生的事情的步骤和结果:

  1. 命中端点/user,由OAuth2保护
  2. 我被转发到一个简单的Spring OAuth2授权服务器
  3. 我向授权服务器进行身份验证
  4. 我批准了访问权限
  5. 然后,我在OAuth2 SSO应用程序上获得了一个白标错误页面,其中包含以下内容:

    Whitelabel Error Page
    
    This application has no explicit mapping for /error, so you are seeing this as a fallback.
    
    Mon Jul 13 08:19:18 EDT 2015
    There was an unexpected error (type=Unauthorized, status=401).
    Authentication Failed: Could not obtain access token
    
    Run Code Online (Sandbox Code Playgroud)

授权码位于URL中.以下是示例网址:

http://localhost:8083/login?code=9s63rU&state=Fo9S2M
Run Code Online (Sandbox Code Playgroud)

我没有看到HTTP POST授权服务器/oauth/token端点获取JWT.我通过/trace授权服务器上的端点验证了这一点.

异常堆栈是:

2015-07-13 08:23:32.695 DEBUG 3516 --- [nio-8083-exec-7] o.s.s.w.u.matcher.AntPathRequestMatcher  : Checking match of request : '/login'; against '/css/**'
2015-07-13 08:23:32.695 …
Run Code Online (Sandbox Code Playgroud)

spring spring-security spring-boot spring-security-oauth2 spring-cloud

26
推荐指数
1
解决办法
1万
查看次数

独立Spring OAuth2 JWT授权服务器+ CORS

所以我从Dave Syer的这个例子中得到了以下授权服务器

@SpringBootApplication
public class AuthserverApplication {

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

    /* added later
    @Configuration
    @Order(Ordered.HIGHEST_PRECEDENCE)
    protected static class MyWebSecurity extends WebSecurityConfigurerAdapter {

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http //.csrf().disable() 
                .authorizeRequests()
                .antMatchers(HttpMethod.OPTIONS, "/oauth/token").permitAll();
       }
    }*/

    @Configuration
    @EnableAuthorizationServer
    protected static class OAuth2AuthorizationConfig extends
                    AuthorizationServerConfigurerAdapter {

            @Autowired
            private AuthenticationManager authenticationManager;

            @Bean
            public JwtAccessTokenConverter jwtAccessTokenConverter() {
                    JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
                    KeyPair keyPair = new KeyStoreKeyFactory(
                                    new ClassPathResource("keystore.jks"), "foobar".toCharArray())
                                    .getKeyPair("test");
                    converter.setKeyPair(keyPair);
                    return converter; …
Run Code Online (Sandbox Code Playgroud)

spring-security cors jwt spring-security-oauth2

24
推荐指数
3
解决办法
4万
查看次数

Spring oauth2范围与权限(角色)

我正在使用Spring Security OAuth2并且当前实现了client_credentials和密码授予类型.我注意到客户既有范围又有权限.有人可以解释一下有什么区别吗?更具体地说,我正在使用JDBCTokenStore,而数据库模式有一个oauth_client_details表.

也,

在oauth_client_details表中,我不确定以下字段用于:

web_server_redirect_url,access_token_validity,refresh_token_validity

一些澄清将非常有帮助和赞赏.

spring-security spring-security-oauth2

24
推荐指数
1
解决办法
2万
查看次数

@EnableResourceServer @EnableAuthorizationServer 已弃用?

我正在编写一个简单的应用程序来测试 Oauth。但是我看到两个注释 @EnableResourceServer @EnableAuthorizationServer 都被弃用了!

我没有找到处理它的替代方法,也没有在任何地方找到任何信息。

配置资源服务器和身份验证服务器的最新方法是什么?

谢谢!

spring-security spring-security-oauth2

24
推荐指数
1
解决办法
2万
查看次数

在Spring Security OAuth2中使用用户名密码授予中的刷新令牌请求新的访问令牌

我们使用username-password grant从我们的auth服务器获取访问令牌.我们希望使用提供的刷新令牌在访问令牌到期之前刷新访问令牌,直到用户注销或关闭客户端应用程序.

但是我找不到任何关于如何发出此刷新令牌请求的示例.

要获得令牌,我们称之为:

curl -v --data "grant_type=password&username=user&password=pass&client_id=my_client" http://localhost:8080/oauth/token
Run Code Online (Sandbox Code Playgroud)

所以要刷新我希望调用看起来像这样:

curl -v --data "grant_type=refresh_token&access_token=THE_ACCESS_TOKEN&refresh_token=THE_REFRESH_TOKEN" http://localhost:8080/oauth/token
Run Code Online (Sandbox Code Playgroud)

或者可能

curl -v -H "Authorization: Bearer THE_ACCESS_TOKEN" --data "grant_type=refresh_token&refresh_token=THE_REFRESH_TOKEN" http://localhost:8080/oauth/token
Run Code Online (Sandbox Code Playgroud)

但它只会给我一个401 ..

哦是的,也许我需要添加clientId?我不能使用客户端密钥,因为没有(请参阅上面获取令牌的请求).毕竟使用用户名和密码进行身份验证.

我认为我们的服务器配置正确,所以我不会在这里发布.如果我的一个示例请求应该工作,并且您需要查看重要的配置部分,我将添加它们.

谢谢!

spring spring-security access-token oauth-2.0 spring-security-oauth2

23
推荐指数
2
解决办法
4万
查看次数

如何使用Spring Social进行休息认证?

我已经实现了Spring社交+ Spring安全性,如Spring安全性示例(以及spring security java config)中所述.我当时报告了几个问题(请参阅https://jira.springsource.org/browse/SEC-2204)所有这些问题都已解决,我的安全性正常.

但是,我想更改我的安全实现并使用RESTful身份验证.Spring oauth/oauth2(http://projects.spring.io/spring-security-oauth/)解决了这个问题,但我看不出Spring Social如何适应这张图片?虽然幕后春天与Facebook/Twitter的社交谈话与oauth,我不认为Spring Social的注册形式和其他特征是为了一个宁静的api而建立的.

任何例子或想法肯定会有所帮助.谢谢.

这篇文章的最新消息:(4/6/2014)

  • 我已经建立了一个消耗我的API的(php)网站.
  • 这个php网站(让我们称之为客户端网站),使用Facebook php sdk注册它自己的用户.这是一种收集自己成员的完全独立的方式.
  • 但是,一旦用户注册了客户端站点,就会传递用户名,电子邮件,密码,名字,姓氏数据及其client_id和客户端密钥,并使用OAuth2授权类型client_credentials身份验证.
  • 传入的用户数据在主系统上创建用户记录!(主要申请)
  • 在此之后,每次客户端站点通过OAuth2授权类型密码调用主系统并发送client_id,client_secret,用户名和密码,获取"身份验证令牌"并能够使用此令牌与主站点通信.

似乎还有很长的路要走,但解决了在主系统上保留用户记录的问题.我很好奇是否有其他方法可以做到这一点?请指教.谢谢

spring spring-security spring-social spring-security-oauth2

23
推荐指数
1
解决办法
5522
查看次数

PreAuthorize错误处理

我正在使用Spring Oauth2Spring Pre-post Annotations使用Spring-boot

我有一个服务班MyService.一个MyService方法是:

@PreAuthorize("#id.equals(authentication.principal.id)")
public SomeResponse getExampleResponse(String id){...}
Run Code Online (Sandbox Code Playgroud)

我能以某种方式控制调用者控制器返回的json吗?

默认返回的json是:

{error : "access_denied" , error_message: ".."}
Run Code Online (Sandbox Code Playgroud)

我希望能够控制error_message参数.我正在寻找类似的东西:

@PreAuthorize(value ="#id.equals(authentication.principal.id)", onError ="throw new SomeException("bad params")")
public SomeResponse getExampleResponse(String id){...}
Run Code Online (Sandbox Code Playgroud)

我想到的一种方法是使用 ExceptionHandler

@ExceptionHandler(AccessDeniedException.class)
public Response handleAccessDeniedException(Exception ex, HttpServletRequest request){
    ...
}
Run Code Online (Sandbox Code Playgroud)

但我无法控制message异常.而且我不能确定这Exception将在未来的版本中被抛出

spring spring-security spring-annotations spring-boot spring-security-oauth2

22
推荐指数
2
解决办法
8118
查看次数

自己的Spring OAuth2服务器以及第三方OAuth提供商

在Spring Boot应用程序中,我有一个OAuth2授权/资源服务器.基于此和Spring Security,我已经获得了我的Spring MVC REST API端点.

除此之外,我还想基于第三方OAuth提供商(如Twitter,Facebook,Google)为我的REST端点添加身份验证.

在我的应用程序中,我有两个实体 - UserSocialUser.SocialUser代表社交网络中的用户个人资料 User可以有0-*关联SocialUsers.现在我可以在Twitter上验证用户,之后我在我的数据库中创建两条记录 - User和SocialUser.SocialUser包含Twitter发布的访问/刷新令牌以及来自此社交网络的一些其他配置文件信息.

现在我不知道如何将从社交网络创建的用户与我现有的身份验证\授权流程相关联.对于这个用户,我想创建自己的(由我自己的OAuth2授权服务器)accessToken并将其提供给客户端.

此外,该用户在其实体中没有用户名,密码和电子邮件User.而且我也不知道如何手动创建自己的访问令牌并将其发送到客户端以供将来的API调用.

我找到了一些例子:

@Inject
private TokenEndpoint tokenEndpoint;

public String createAccessToken(User user) {
    HashMap<String, String> parameters = new HashMap<String, String>();
    parameters.put("client_id", "appid");
    parameters.put("client_secret", "myOAuthSecret");
    parameters.put("grant_type", "password");
    parameters.put("password", user.getPassword());
    parameters.put("scope", "read write");
    parameters.put("username", user.getUsername());

    // principal ??
    return tokenEndpoint.getAccessToken(principal, parameters);
}
Run Code Online (Sandbox Code Playgroud)

但我不知道如何Principal基于我的User实体创建,我也不确定这是一个正确的方法.

那么,主要的问题是 - 如何通过我自己的OAuth服务器为这个新用户手动生成这个新令牌?

请告诉我如何才能正确实施.谢谢.

更新:

我已添加ProviderSignInController到我的应用程序中,现在能够通过Twitter执行完整的OAuth舞蹈.此外,我已经实现了自己的Neo4jConnectionRepository,Neo4jUsersConnectionRepository因为我使用Neo4j作为主数据库. …

spring-mvc spring-security oauth-2.0 spring-social spring-security-oauth2

21
推荐指数
1
解决办法
4329
查看次数

在Spring Security OAuth2(提供程序)中使用作用域作为角色

让我们考虑一个相当简单的假设应用程序,用户可以在其中阅读或撰写帖子.

有些用户可以阅读和撰写文章,而有些用户只能阅读.使用Spring Security(3.2.1),我通过两个角色对此进行了建模:

  • ROLE_WRITE:此角色授予用户访问撰写帖子的权限.
  • ROLE_READ:此角色授予用户访问阅读帖子的权限.

使用Spring安全性实现这一点非常简单......

现在,我想通过使用Spring Security OAuth(版本2.0.0.M3 ATM)实现OAuth2提供程序,允许第三方应用程序代表用户读写帖子.

在授权步骤期间,应用程序询问用户是否愿意代表他们授予阅读和/或撰写帖子的权利.这里的用户在这里授予范围(不是角色).

然后,当OAuth2使用者调用我的REST API时,Spring Sec OAuth会授权所授予的令牌并创建一个身份验证,其中包含具有所有角色的用户以及仅授予的作用域.

问题(和问题)是我现在必须编写不同的安全逻辑,具体取决于API是否由正常身份验证的用户调用(只检查角色)或是否通过OAuth2调用(检查角色+范围).

是否可以在Spring Security OAuth2中"合并"角色和范围的概念,以便在授权步骤中,用户向应用程序授予他们拥有的角色的子集(并且让OAuth2身份验证仅在授予的权限中报告这些角色) ?这样,当第三方应用程序进行API调用时,身份验证中的角色是授予的角色?这样我就不必编写任何特定于OAuth2的安全逻辑.

spring oauth spring-security oauth-2.0 spring-security-oauth2

20
推荐指数
1
解决办法
2万
查看次数

使用spring security oauth2进行双因素身份验证

我正在寻找有关如何使用spring security OAuth2实现双因素身份验证(2FA)的想法.要求是用户仅需要对具有敏感信息的特定应用程序进行双因素身份验证.这些webapps有自己的客户端ID.

我想到的一个想法是"误用"范围审批页面以强制用户输入2FA代码/ PIN(或其他).

示例流程如下所示:

不使用和使用2FA访问应用程序

  • 用户已注销
  • 用户访问不需要2FA的应用A.
  • 重定向到OAuth应用,用户使用用户名和密码登录
  • 重定向回应用程序A并且用户已登录
  • 用户访问app B,也不需要2FA
  • 重定向到OAuth应用,重定向回应用B,用户直接登录
  • 用户访问应用程序S的确实需要2FA
  • 重定向到OAuth应用,用户需要另外提供2FA令牌
  • 重定向回应用程序S并且用户已登录

使用2FA直接访问应用

  • 用户已注销
  • 用户访问应用程序S的确实需要2FA
  • 重定向到OAuth应用,用户使用用户名和密码登录,用户需要另外提供2FA令牌
  • 重定向回应用程序S并且用户已登录

你有其他想法如何计算这个吗?

spring two-factor-authentication spring-security-oauth2

20
推荐指数
1
解决办法
1万
查看次数