赞
踩
自2020年4月 Spring Authorization Server 被发起以来,时至今日已发布 0.1.0 版本。至于为什么要另起炉灶这里不做赘述,详见官方初始公告都有说明。
初始公告
https://spring.io/blog/2020/04/15/announcing-the-spring-authorization-server
源代码
https://github.com/spring-projects-experimental/spring-authorization-server
下面是阅读源码后,对它的授权过程进行的一些原理流程步骤整理:
场景:源码下载后,服务都启动后,然后浏览器从访问 http://localhost:8080/index 到需要登录,等会成功后然后跳回来并成功显示 /index 页面的内容,这个整个处理过程。
1、访问客户端服务的一个需要登录认证才可以访问的接口,例如 /index
2、判断发现用户没有登录状态,于是乎应该跳转到客户端服务登录页面。在客户端 SecurityConfig 类的 HttpSecurity 中配置了登录页url为 /oauth2/authorization/messaging-client-oidc ,这个url最后一段的值很重要,应该是你客户端服务配置文件中 spring.security.oauth2.client.registration 集合配置中的其中之一,这个登录页的最后一个值 registrationId 表示登录后自动走的授权模式。
3、浏览器开始跳转配置的登录页面 /oauth2/authorization/messaging-client-oidc,这个URL会被 OAuth2AuthorizationRequestRedirectFilter 过滤器拦截(拦截规则为 /oauth2/authorization/*),并解析出 registrationId = messaging-client-oidc
4、第3步的 Filter 进行自动处理组装跳转参数后跳转到授权地址(例如:http://auth-server:9000/oauth2/authorize?response_type=code&client_id=messaging-client&scope=openid&state=TvECECXAfJSrY3XpdY8124YOVOWIr8XMR0yH6jf8WXE%3D&redirect_uri=http://localhost:8080/login/oauth2/code/messaging-client-oidc&nonce=l6H4vW2fFQfrRnGEbAqgObYAMSZLM_gWIbBtSD2QSdQ),此时交由oauth2的server端记录相关参数信息并处理后后显示登录页面。默认的server授权地址为http://auth-server:9000/oauth2/authorize
5、oauth2的server收到/oauth2/authorize请求后,先判断server本身是否存在用户已经登录的会话,如果不存在则跳转到server的login页面http://auth-server:9000/login。如果存在已经登录的会话用户,则进行下面的第7步。
6、用户在浏览器输入账号密码进行登录操作。
7、登录成功后,跳转回客户端的redirect_uri,并携带参数code和state,其中code由服务的颁发的有效期较短,state为客户端跳转授权时携带的这里server端原样返回(例如:http://localhost:8080/login/oauth2/code/messaging-client-oidc?code=sc02-aIAimsjl6ayr297VmFIaDWoVi4_1BYW9VgdHsL23S4ZEqLfX9DFPjCNubmFgOMdVN0oxb5SJxSdq4HUVswz3J4cZIVWUFd26p5noO04g1ItkVLNC18Y9MrXDAWC&state=qAs4Ac27tOlvP0i8A1eA3cpbdIx5DPUgPGGV2PZJ75w%3D)
8、客户端接收/login/oauth2/code/messaging-client-oidc请求,被 OAuth2LoginAuthenticationFilter 拦截处理(校验URL是否匹配+参数是否包含code和state),通过拿到的code调用auth-server/auth2/token接口获得access_token、refresh_token和id_token(只有openid授权模式才会返回id_token,其中包含了用户ID等信息,是一个按一定规则进行分割加密的字符串。相关资料:http://www.voidcn.com/article/p-osloewbk-bsq.html)。
9、OAuth2LoginAuthenticationFilter(OAuth2LoginAuthenticationFilter是openid处理过滤器、OAuth2AuthorizationCodeGrantFilter是code模式授权处理过滤器)进行一系列处理后,在最后通过authorizedClientRepository.saveAuthorizedClient保存认证通过的用户信息(默认是存入session中,实际业务一般需要扩展实现存入数据库的表中)。
10、OAuth2LoginAuthenticationFilter父类的doFilter最后通过successfulAuthentication方法进入后续处理,由SavedRequestAwareAuthenticationSuccessHandler中的方法onAuthenticationSuccess处理进行最后的重定向跳转工作,最后进行sendRedirect重定向到我们授权之前访问的地址(在授权访问之前预访问的地址被存入session中,这里在从session中取出来进行重定向)。
11、浏览器加载授权之前访问的url地址,重新进入第1步流程,此时会话中已经存在用户信息,所以通过验证正常调用接口返回了数据。
12、整个oauth2的授权跳转过程结束。
个人认为,未来不断发布的版本,应该会在代码细节、逻辑、bug、以及可扩展性、易用性等方面进行优化,个人觉得整理流传和处理流程的框架体,不会和上面的过程有过多输入。
(END)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。