| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> Oauth2系列2:授权码模式 -> 正文阅读 |
|
[移动开发]Oauth2系列2:授权码模式 |
目录 传送门在前面一节,对oauth2有了一个初步概念。这里重点讨论下授权码模式 再次重申oauth2的定义定义前面对oauth2的定义有过百科的引用,英文好的也可以看看官方定义:OAuth 2.0。这里不是要对定义做过多理解,而是重点放在下面的场景下的讨论中 作用oauth2通常是用来做第三方应用授权的,比如前面的微信例子:网站应用微信登录开发指南 多读几遍上面的一句话,会不会发现有一些矛盾? oauth2不是用来做授权吗,为什么微信用它来做第三方登录呢?带着这个疑问,再次回顾一下下面这个微信登录时序图 再看一下微信官方给出的步骤解释?
?通过上面的时序图,及步骤解释,都提到了"微信用户",就是说要应用微信登录第三方应用,前提是用户必须是微信用户! 这个要求也是顺理成章的,用户都不是微信的,微信怎么对用户主体做属性授权呢? 但是需要思考一个问题,对于第三方网站来说,如果是微信用户,并且依赖微信的开放平台做了授权登录,那么对应三方应用来说,它自己到底存不存储用户相关信息呢?如果没有自己的用户信息,如果网站需要自己的权限管理,该怎么办? 微信授权登录,三方应用能获取的信息是有限的,可能只有用户相关的一点可怜的用户昵称,性别,头像等。其它一些信息,需要依赖开放平台的支持,这多少也有些受制于人! 所以,我个人觉得,对于三方网站的不同定位,如果需要自己做一些权限管控,或者是后续基于用户维度的功能,是需要有一套自己的账户体系的,只不过在用户使用方式止,可以做成是高阶功能再认证或补全身份信息的流程。此时的流程,大致如下 这个流程跟微信标准相比,就是加了后面几个步骤(第7步之后),主要就是第三方应用的账户处理
标准授权码流程4个参与角色上面我们看到微信第三方授权登录的时序图,一共有3个参与方:用户,第三方应用,vx开放平台。 其实严格意义来讲,标准的oauth2协议,总共有4个角色 资源拥有者就是拥有资源的主体,在上面的登录场景中就是指微信用户,所有的用户信息都是属于他的。当然,资源不一定是只有用户信息,也可能是任何能授权的数据(一切皆数据)。通常拥有者都是一个人,这个人才拥有数据 客户端客户端,在上面的登录场景中就是指第三方应用,是需要申请资源权限的第三方应用 授权服务授权服务就是对资源进行授权的系统,在上面的登录场景中就是指微信开放平台。在上面,大部分的核心逻辑都是在它在负责处理的:第三方应用身份检验,授权管理(生成授权页面,权限列表检验),生成授权码code及返回授权码code给第三方应用等,以及最终的令牌颁发等 受保护资源受保护资源就是指可以用来授权的信息或数据,上面的登录场景中就是指用户的信息,比如姓名,性别,头像等 但是在微信登录的场景中,只有三个角色,并没有把受保护资源单独列出。因为微信开放平台本身就拥有用户的信息,所以是可以视为一体的。 但是在有些场景,受保护资源有可能是单独服务,是可以跟授权服务分开的。比如,在一些微服务架构中,授权服务有可能是放到网关来做的,而资源是在业务服务中的 授权码流程OAuth 诞生之初就是为了解决 Web 浏览器场景下的授权问题,上面第三方微信登录,有可能是发生在PC端的浏览器,也有可能是移动端的APP应用上,而移动端的APP应用其实也可以视为一种浏览器。 而通常现在的客户端,一般是有前端界面与后端应用的,前端一般也是让用户在浏览器上面操作。 现在假设是在浏览器的场景下,一般授权码流程到底是怎么样的呢?来看一个更细致的流程 引导授权正常来说,第三方业务系统都有自己的会话管理,就像在前面提到的传统session会话 对于java开发的系统,一般常用的会有server的过滤器Filter,通过session来判断用户会话是否过期,过期会引导用到登录界面进行登录认证。 对于ouath2这种协议作微信第三方登录认证,也是需要业务系统做会话管理的。就是用户第一次访问业务系统时,如果发现用户是未登录,则调用认证服务的接口,这个接口最终会生授权登录界面,让用户授权
当第三方系统请求这个接口时,微信会跳转到微信的一个标准授权界面。这就是时序图中的第一次重定向。这里要特别说明的是,业务系统一般也是通过重定向的方式请求这个接口的。可以前端js或者后端跳转:
而其中的参数也是有讲究的 参数说明
获取code用户允许授权后,将会重定向到redirect_uri的网址上,并且带上 code 和state参数
用授权码code换取令牌token
如果第三方业务系统拿到授权码code,这个时候就可以通过code换取令牌了。如果令牌获取成功,就表示用户认证完成,可以登录了 注意,这个接口严格来说,必须是后端发起调用,因为这里面的参数除了appid之外,还需要secret参数,这个参数是不能暴露到浏览器的。
参数说明
返回令牌格式最后,看一下,返回令牌的格式
在这里,会发现,除了刚才讨论的访问令牌access_token之外,还多了其它几个参数
令牌续期access_token是调用授权关系接口的调用凭证,由于access_token有效期(目前为2个小时)较短,当access_token超时后,可以使用refresh_token进行刷新,access_token刷新结果有两种:
refresh_token拥有较长的有效期(30天),当refresh_token失效的后,需要用户重新授权。
参数说明
预告这一节主要讨论了授权码流程,但是各大开放平台,在使用第三方登录的oauth2协议时,都基本有一个准备工作,即要先进行注册。 下一节,会结合阿里云开放平台,看一下注册流程如何操作及背后的设计 |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 0:30:42- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |