2017-08-29 104 views
0

我正在实现一个使用Spring Security + Spring会话的登录过程来为需要创建/维护会话的后端服务的REST构建登录功能。Spring安全会话ID作为令牌配置

我不知道我是否正确地接近解决方案,因为我正在使用自定义端点手动创建会话。也许会话创建需要在授权方法本身完成?或者也许有一种方法可以在后端的一些请求验证之后让spring创建会话?我正在使用自定义过滤器和提供程序。

我目前的配置

另外,我有一个问题,因为后端API与每个请求创建一个新的会话,即使它应该返回401

该解决方案的要求如下:

  1. 客户端将登录到第三方认证/授权提供商。验证通过后,提供者将发出访问令牌。
  2. API必须验证客户端的访问令牌与第三方提供商。验证后,API必须创建一个会话并向客户端返回一个新的令牌(或会话ID)。
  3. 未来对API的调用应该在标头/ cookie中包含令牌(或sessionID),以便API获取客户端的会话。

最大的问题在这里:是否有遵循使用链接到用户会话令牌基于身份验证的常用方法?如果是这样,如果我在春季会话创建会话之前需要进行自定义验证,并且向此会话添加自定义属性?

我的代码位于:https://github.com/munilvc/api-session/tree/master/src/main/java/com/munilvc/poc/security

例如,一些执行示例:

1)执行自定义登录:

$ curl -X POST http://localhost:8080/app-api/login/createsession -v 
> POST /app-api/login/createsession HTTP/1.1 
> Host: localhost:8080 
> User-Agent: curl/7.49.1 
> Accept: */* 
> 
< HTTP/1.1 200 
< x-auth-token: 15a06ce8-5b34-401a-a05f-a0d933926245 
< Content-Type: application/json;charset=UTF-8 
< Transfer-Encoding: chunked 
< Date: Tue, 29 Aug 2017 01:28:24 GMT 
< 
171{"username":"username1"} 

2)调用另一个端点提供X-auth-令牌:

注意x-auth令牌在响应中被刷新。 (指创建一个新的会话 - 这是我们希望避免,这也发生在响应401)

$ curl -X GET http://localhost:8080/app-api/accounts/2 -H "x-auth-token:15a06ce8-5b34-401a-a05f-a0d933926245" -v 
> GET /app-api/accounts/2 HTTP/1.1 
> Host: localhost:8080 
> User-Agent: curl/7.49.1 
> Accept: */* 
> x-auth-token:15a06ce8-5b34-401a-a05f-a0d933926245 
> 
< HTTP/1.1 200 
< X-Content-Type-Options: nosniff 
< X-XSS-Protection: 1; mode=block 
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate 
< Pragma: no-cache 
< Expires: 0 
< X-Frame-Options: DENY 
< x-auth-token: 42a5db80-e5e1-4127-bd85-e468af4a8fb2 
< Content-Type: application/json;charset=UTF-8 
< Transfer-Encoding: chunked 
< Date: Tue, 29 Aug 2017 01:29:08 GMT 
< 
870{"id":3,"name":"Account 3"} 

PS:我不知道如果我允许提供一个链接到堆栈中的代码溢出。如果没有,我也可以在这里粘贴代码。

非常感谢!

回答

0

根据您的要求,可以使用OpenID Connect对最终用户进行身份验证,并授权客户端,然后客户端将收到AccessToken。然后可以使用AccessToken来调用后端API(资源服务器)。

看看这个sample/guide关于如何在Spring Security 5中针对外部OAuth 2.0或OpenID Connect提供程序设置登录。这将满足您使用外部提供者登录应用程序并在Spring Security内创建安全会话的要求。

现在您已登录到应用程序并且客户端有AccessToken,客户端可以在请求(授权标头)中使用AccessToken来调用后端API(资源服务器)。资源服务器应设置来验证传入AccessToken。就以如何配置资源服务器一起来看看这款samplemasterjwt-support分支机构)。

我会强烈建议变得越来越熟悉OAuth 2.0 Authorization FrameworkOpenID Connect Core 1.0

祝你好运!