ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

再谈OAuth授权

2021-09-25 23:03:18  阅读:195  来源: 互联网

标签:code 微信 APP 再谈 OAuth 授权 tokenServices endpoints


工作场景流程

大家都知道OAuth是用于第三方授权的,当你用其他的APP想访问微信账号的昵称、粉丝、联系人等信息,这里就需要微信进行授权,此时在APP的网页端是可以发现有微信登录的,点开会出现弹框,在弹框中输入用户名和密码,此时即同意授权,会直接到微信授权服务端获取授权码Code,接着通过302重定向到redirect,并且把生成的code加入到redirect的后面,此时链接会访问到APP的服务端,此时APP服务器会利用截取到的code到微信的授权服务器,对code进行验证,验证通过就会生成token,此时token传输到APP的服务器,此时会在微信的资源服务器验证APP获取的token进行验证,如果验证通过此时会把资源传输到APP的服务器,并传入到APP显现出来。

如图所示:工作流程图,从19

在编程的过程中需要在服务端确定哪些东西呢?

如图所示,需要确定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

标签:code,微信,APP,再谈,OAuth,授权,tokenServices,endpoints
来源: https://www.cnblogs.com/CodeJames/p/15335942.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有