大家都知道OAuth
是用于第三方授权的,当你用其他的APP
想访问微信账号的昵称、粉丝、联系人等信息,这里就需要微信进行授权,此时在APP
的网页端是可以发现有微信登录的,点开会出现弹框,在弹框中输入用户名和密码,此时即同意授权,会直接到微信授权服务端获取授权码Code
,接着通过302
重定向到redirect
,并且把生成的code
加入到redirect
的后面,此时链接会访问到APP
的服务端,此时APP
服务器会利用截取到的code
到微信的授权服务器,对code
进行验证,验证通过就会生成token
,此时token
传输到APP
的服务器,此时会在微信的资源服务器验证APP
获取的token
进行验证,如果验证通过此时会把资源传输到APP
的服务器,并传入到APP
显现出来。
如图所示:工作流程图,从1
到9
。
如图所示,需要确定4部分其中在授权码模式下式不需要client_secret
的。
它的请求url
如下:
请求url:localhost:8080/oauth/authorize?client_id=client&respose_type=code&redirect_url=http://www.baidu.com
想获取认证,此时需要输入微信的用户名与密码,同意授权,生成code
,进行重定向。
重定向url:http://www.baidu.com/?code=fnajlgah
假如APP
是百度,此时重定向之后百度服务端会得到code
,利用code
获取token
,得到token
之后就会得到资源服务器获取得到资源。
常见的两种配置方式,第一种常用于测试中,利用到了InMemory
的方式,数据都存在内存中。
@Override public void configure(ClientDetailsServiceConfigurer clients) throws Exception { clients.inMemory() // 使用in-memory存储 .withClient("client") // client_id .secret("secret") //client_secret .authorizedGrantTypes("authorization_code") // 该client允许的授权类型 .scopes("app"); // 允许的授权范围 }
这种只能用于测试,当线程结束之后,所有的东西都会清楚。另一种方式是数据库JDBC
实现,所有的数据都会持久化到数据库。
@Autowired private AuthenticationManager authenticationManager; @Autowired private DataSource dataSource; @Bean // 声明TokenStore实现 public TokenStore tokenStore() { return new JdbcTokenStore(dataSource); } @Bean // 声明 ClientDetails实现 public ClientDetailsService clientDetails() { return new JdbcClientDetailsService(dataSource); } @Override // 配置框架应用上述实现 public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { endpoints.authenticationManager(authenticationManager); endpoints.tokenStore(tokenStore()); // 配置TokenServices参数 DefaultTokenServices tokenServices = new DefaultTokenServices(); tokenServices.setTokenStore(endpoints.getTokenStore()); tokenServices.setSupportRefreshToken(false); tokenServices.setClientDetailsService(endpoints.getClientDetailsService()); tokenServices.setTokenEnhancer(endpoints.getTokenEnhancer()); tokenServices.setAccessTokenValiditySeconds( (int) TimeUnit.DAYS.toSeconds(30)); // 30天 endpoints.tokenServices(tokenServices); }
这个授权协议蛮复杂的,想完全弄懂还有很长的路要走,但是这是每个开发者必须要去弄懂的,路漫漫。。。
请关注我的公众号:CodeJames