看了很多关于outh2应用文章,介绍都比较晦涩难懂,同时没有一个实际案例说明,
下面,我将使用security+outh2简单案例讲解,并通过微信认证流程解释为什么这种实现方式是最佳的。
1. Security实现Outh2登录
1.1 项目环境搭建及说明
- 搭建springboot项目引入依赖
<!-- for Spring Security --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><!-- for OAuth 2.0 --><dependency><groupId>org.springframework.security.oauth</groupId><artifactId>spring-security-oauth2</artifactId></dependency>
- 我的站点资源
默认情况下,访问会被security登录拦截,输入配置信息,即可访问到接口资源
@RestController
@RequestMapping("/api")
public class ExampleController {@RequestMapping("/hello")public String hello() {return "world";}}
用户信息配置:
security.user.name=lonk
security.user.password=lonk
- 限制资源访问
要实现outh2方式登录后才能访问资源的话,就要对资源访问做限制,我们配置一个资源服务器
@Configuration
@EnableResourceServer
public class OAuth2ResourceServer extends ResourceServerConfigurerAdapter {/**** 配置访问权限** @param http* @throws Exception*/@Overridepublic void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().authenticated().and().requestMatchers().antMatchers("/api/**"); // 对 "/api/**" 开启认证}}
配置后,访问接口就会被拦截
- 授权服务器
授权服务器类似第三方认证,提供一个授权信息; 此时项目整体环境搭建好了,下面讲解具体认证流程。
@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServer extends AuthorizationServerConfigurerAdapter {@Overridepublic void configure(ClientDetailsServiceConfigurer clients) throws Exception {clients.inMemory().withClient("client_app_id").secret("pwd123456") .redirectUris("http://localhost:8080/callback").authorizedGrantTypes("authorization_code") // 授权码模式.scopes("read_userinfo") // 可授权的 Scope;}}
1.2 验证码方式认证流程
- 获取授权码
1.浏览器访问:http://localhost:8080/oauth/authorize?
client_id=client_app_id&
redirect_uri=http://localhost:8080/callback&
response_type=code&
scope=read_userinfo
2.被拦截输入security配置用户名密码
3.验证成功,会重定向到:http://localhost:8080/callback?code=sSGEXP, code值即为授权码。
- 获取访问token
{"access_token": "30bf2637-4e41-4891-a0c0-ffeb8b50ed7a","token_type": "bearer","expires_in": 43199,"scope": "read_userinfo"
}
- 使用token访问限制接口
2. 认证流程分析
我以微信账号登录网易音乐为例,按如下步骤说明:
2.1 网易在微信上注册信息
如果网易平台想获取微信用户的信息,微信会要求先在它的平台上注册一个应用,在申请的时候标明需要获取用户信息的哪些权限,并且在申请的时候填写你的网站域名,微信只允许在这个域名中获取用户信息。
审核通过后,会得到:
- Client Id
- Client Secret
微信-网站应用开发
2.2 用户和微信间协商
用户进入网易时,点击微信登录按钮,网易会将微信发放的Client Id交给用户,
让他进入微信授权界面:
如果用户同意,在授权页面点击了确认授权后,页面会跳转到网易预先设定的
redirect_uri并附带一个授权码code
2.3 网易访问微信
网易已经拿到授权码code,但这个code 只能表明,用户允许网易从微信上获取该用户的数据,如果其他平台拿这个code去微信访问用户数据一定会被拒绝,因为任何平台都可以持有code,微信并不知道code持有方就是谁。
此时, 网易使用用户授权的code和网易的client_id、client_secret去访问微信,拿到最后的access_token。
2.4 用户开始微信账号在网易上听音乐
网易有了access_token,通过微信提供的 API就能够访问用户的信息了,能获取用户的哪些权限通过scope做限制。
参考:https://blog.csdn.net/qq_40437152/article/details/84303104