工作场景流程

大家都知道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

再谈OAuth授权的更多相关文章

  1. OAuth授权 | 把这一篇丢给他

    OAuth授权 一.背景 上一篇我们介绍了单点登录(SSO),它能够实现多个系统的统一认证.今天我们来谈一谈近几年来非常流行的,大名鼎鼎的OAuth.它也能完成 统一认证,而且还能做更多的事情.至于O ...

  2. 第三方OAuth授权登录,QQ、微信(WeChat)、微博、GitHub、码云(Gitee)、淘宝(天猫)、微软(Microsoft )、钉钉、谷歌(Google)、支付宝(AliPay)、StackOverflow

    Netnr.Login 第三方OAuth授权登录 支持第三方登录 三方 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 安装 ( ...

  3. OAuth授权登录

    一.写在前面 日常生活中,我们经常看到到一个网站时,需要登录的时候,都提供了第三方的登录,也就是说你可以使用你的微信,QQ,微博等账号进行授权登录.那么这个认证登录的东西到底是什么呢? 微信授权登录页 ...

  4. IOS第三天-新浪微博 - 版本新特性,OAuth授权认证

    *********版本新特性 #import "HWNewfeatureViewController.h" #import "HWTabBarViewController ...

  5. iOS之新浪微博的OAuth授权

    新浪微博的OAuth授权 之前通过新浪微博开发平台写过微博的的项目,现在就开始总结下各个方面的知识点,一个是为了加深印象.巩固知识,另一个记录自己学习过程,希望自己在开发这条路上有所积累,为以后的道路 ...

  6. 什么是OAuth授权?

    什么是OAuth授权?   一.什么是OAuth协议 OAuth(开放授权)是一个开放标准. 允许第三方网站在用户授权的前提下访问在用户在服务商那里存储的各种信息. 而这种授权无需将用户提供用户名和密 ...

  7. [转载]再谈百度:KPI、无人机,以及一个必须给父母看的案例

    [转载]再谈百度:KPI.无人机,以及一个必须给父母看的案例 发表于 2016-03-15   |   0 Comments   |   阅读次数 33 原文: 再谈百度:KPI.无人机,以及一个必须 ...

  8. Support Vector Machine (3) : 再谈泛化误差(Generalization Error)

    目录 Support Vector Machine (1) : 简单SVM原理 Support Vector Machine (2) : Sequential Minimal Optimization ...

  9. 微信订阅号里实现oauth授权登录,并获取用户信息 (完整篇)

    摘要 这段时间一直有人问我,订阅号实现的oauth授权登录的问题,之前写的比较简单,很多人不明白.众所周知,微信公众号分订阅号.服务号.企业号:每个号的用途不一样,接口开放程度也不一样.微信还有个扯淡 ...

随机推荐

  1. 【网络编程】TCPIP_3_地址族与数据序列

    目录 前言 3. 地址族与数据序列 3.1 分配给套接字的 IP 地址与端口号 3.2 参数 IP 地址 3.2.1 IPV4 地址的结构体 3.2.2 地址族(Address Family) 3.2 ...

  2. SQL 练习9

    查询学过「张三」老师授课的同学的信息 SELECT Student.* from Student,Teacher,Course,SC WHERE Teacher.TId = Course.TId AN ...

  3. 题解 c(留坑)

    传送门 这题卡常--而且目前还没有卡过去 首先以原树重心为根,向所有子树重心连边,可以建立一棵点分树 点分树有两个性质: 一个是树高只有log层 另一个是两点在点分树上的lca一定在原树上两点间的树上 ...

  4. springboot&&springcloud知识点

    spring cloud 常见面试题: A.https://blog.csdn.net/panhaigang123/article/details/79587612 B.https://blog.cs ...

  5. Ant高级-path和fileset

    一 <path/> 和 <classpath/> 你可以用":"和";"作为分隔符,指定类似PATH和CLASSPATH的引用.Ant会 ...

  6. tomcat Debug 启动

    eclipse有web工程,将打包为war包(export -> War file) 将打包好的war 包放在tomcat 的webapps下面: 配置debug: 参考来自 http://bl ...

  7. jQuery中的表单过滤选择器(四、七)::input、:text、:password、:radio、:checkbox、:file等

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...

  8. 获取本地请求的真实IP地址

    1 /** 2 * 自定义访问对象工具类 3 * 4 * 获取对象的IP地址等信息 5 * 6 */ 7 public class CusAccessObjectUtil { 8 9 /** 10 * ...

  9. n, n+1, ..., 2n 中的 5 数环初探

    本篇是 IMO 2021 第一题题解及相关拓展问题分析 和 IMO 2021 第 1 题拓展问题的两个极值的编程求解 的延伸篇. 从上两篇的分析,可知: 当 n < 48 时,n, n+1, . ...

  10. configparser读

    #-*-coding:utf-8-*-__author__ = "logan.xu"import configparserconf = configparser.ConfigPar ...