OAuth2的定义和运行流程

简介: 开放授权(Open Authorization OAuth) 是一种资源提供商用于授权第三方应用代表资源所有者获取有限访问权限的授权机制。由于在整个授权过程中,第三方应用都无法触及用户的密码就可以获取部分资源的使用权限,所以OAuth是开放安全的。

OAuth2 定义

开放授权(Open Authorization OAuth) 是一种资源提供商用于授权第三方应用代表资源所有者获取有限访问权限的授权机制。由于在整个授权过程中,第三方应用都无法触及用户的密码就可以获取部分资源的使用权限,所以OAuth是开放安全的。

OAuth第一个版本诞生于2007年12月,由于OAuth1.0复杂的签名逻辑以及单一的授权流程存在较大缺陷,随后推出了OAuth2.0,OAuth2.0放弃了OAuth1.0中让开发者感到痛苦的数字签名和加密方案,后面我们要讲的都是指OAuth2.0。

对于OAuth,其实大家并不陌生,比如登录百度账户的时候,下面会提供QQ、新浪微博、微信的登录,如图1。当使用QQ登录的时候,会跳转到一个QQ OAuth2.0的登录窗口,登录QQ后再跳转回百度,并登录百度,从而避免在第三方网站提交QQ密码,在QQ登录窗口,右侧显示了第三方网站能够获取的权限资源,只能获取昵称、头像、性别,如图2。
图1

图2

从QQ授权登录机制中,我们基本可以看到OAuth认证的流程和形式。

OAuth 的运行流程

OAuth的4个重要角色:

  1. Resource Owner: 资源所有者,通常指用户
  2. Resource Server: 资源服务器,指存放用户受保护资源的服务器,通常需要通过Acess Token才能进行访问
  3. Client:客户端,指需要获取用户资源的第三方应用
  4. Authorization Server:授权服务器,用于验证资源所有者,并在验证成果之后向客户端发放相关令牌

如图3描述了4种角色的交互流程

图3

  1. Client 客户端要求资源所有者(用户)提供授权许可
  2. 资源所有者(用户)同意向客户端提供授权许可
  3. 客户端携带用户提供的授权许可向授权服务器申请资源服务器的访问令牌
  4. 授权服务器验证客户端及其携带的授权许可,确认有效后发放访问令牌
  5. 客户端使用访问令牌向资源服务器申请资源
  6. 资源服务器验证访问令牌,确认无误后向客户端提供资源

在这个流程中,第二步OAuth定义了4种授权模式,用于将用户的授权许可提供给客户端。

授权码模式(Authorization Code)

授权码模式是功能最完整、流程最严密的授权模式,它将用户引导到授权服务器进行身份验证,授权服务器将发放的访问令牌传递给客户端。百度使用QQ账户登录就是使用的该模式,如下。

https://graph.qq.com/oauth2.0/show?which=Login&display=pc&client_id=100312028&response_type=code&redirect_uri=https%3A%2F%2Fpassport.baidu.com%2Fphoenix%2Faccount%2Fafterauth%3Fmkey%3D7a58056f35517b863aca5dd7add6a179c927361ed5803d1ff8%26tpl%3Dmn&state=1659803324&display=page&scope=get_user_info%2Cadd_share%2Cget_other_info%2Cget_fanslist%2Cget_idollist%2Cadd_idol%2Cget_simple_userinfo&traceid=

其中,response_type指授权类型,必须,固定为code
client_id指客户端id,必须
state指客户端的状态,通常在授权服务器重定向时原样返回
scope为申请的权限范围,如获取用户信息、获取用户相册等,由授权服务器抽象为具体的条目
redirect_uri为授权通过后的重定向URL,授权服务器将在用户登录完成之后重定向到该地址。

隐式授权模式(Implicit)

隐式授权模式的客户端一般指用户浏览器。访问令牌通过重定向的方式传递到用户浏览器中,再通过浏览器的JavaScript代码来获取访问令牌。由于访问令牌直接暴露在浏览器端,所以隐式授权模式可能会导致范围令牌被泄露,仅适用于需要临时访问的场景
与授权码模式相比,用户的登录环节是一样的,只是在授权成功之后的重定向,授权码模式是携带一个认证码,由客户端通过认证码申请访问令牌,而隐式授权模式则直接将访问令牌作为URL参数传递给浏览器。
隐式授权模式在重定向时携带的参数有:
access_token:访问令牌
expire_in:访问令牌多少秒后过期
state:客户端的状态参数

密码授权模式(Password Credentials)

客户端携带用户的密码向授权服务器申请令牌,这种操作不再像前两种一样跳转到授权服务器进行,而是由客户端提供专用页面。

客户端授权模式(Client Credentials)

客户端授权模式通常由客户端提前向授权服务器申请公钥、秘钥,并通过这些关键信息向授权服务器申请访问令牌,从而得到资源服务器提供的资源。

关于OAuth2的定义和运行流程先讲到这里,下篇将在Spring Security中使用OAuth2。

参考资料:
RFC6749:https://www.rfc-editor.org/rfc/rfc6749.html

相关文章
|
2月前
|
安全 API 数据安全/隐私保护
​6个值得测试的发送邮件接口API
在数字营销和企业通信中,发送邮件接口API如SendGrid、Mailgun、Amazon SES、AOKSend、Postmark和Sendinblue是关键工具。这些API自动化邮件发送,提高效率,确保及时送达。各具特色,如SendGrid和Mailgun适合大规模发送,AOKSend易于集成,Postmark专于事务邮件,而Sendinblue提供综合营销解决方案。根据企业需求,如邮件量、成本、功能和集成简易度,可选择最适合的API服务。
|
3月前
|
算法 安全 Java
对外接口验证sign工具
对外接口验证sign工具
|
3月前
|
安全 测试技术 API
API测试清单和最佳实践
API测试清单和最佳实践
API测试清单和最佳实践
|
3月前
|
监控 Java API
如何动态通过API的形式在XxlJob上创建任务
如何动态通过API的形式在XxlJob上创建任务
113 0
|
安全
springsecurity配置类以及授权逻辑的编写
springsecurity配置类以及授权逻辑的编写
77 0
|
3月前
|
安全 前端开发 Java
针对 SpringSecurity 鉴权流程做了一个详细分析,让你明白它是如何执行的!
针对 SpringSecurity 鉴权流程做了一个详细分析,让你明白它是如何执行的!
196 0
|
3月前
|
存储 缓存 前端开发
自定义OAuth2组件实现对授权码登录模式的封装
所谓OAuth2其实就是Open Authorization,即开放授权,是一种授权机制或者说是一种协议。OAuth2允许用户授权第三方应用访问其存储在开放平台(授权服务器)中的数据而不需要提供密码。授权服务器根据OAuth2协议标准制订一套授权的API,第三方网站接入开放平台之后即可通过其提供的API来实现用户授权和获取授权服务器中用户的信息的功能。
|
JSON NoSQL 前端开发
SpringBoot定义优雅全局统一Restful API 响应框架完结撒花篇封装starter组件
SpringBoot定义优雅全局统一Restful API 响应框架完结撒花篇封装starter组件
SpringBoot定义优雅全局统一Restful API 响应框架完结撒花篇封装starter组件
|
API 区块链 Python
okcoin交易所的实盘api开发执行代码部署示例
okcoin交易所的实盘api开发执行代码部署示例
|
小程序 前端开发 Java
java如何利用JWT和注解,自定义参数的方式优雅实现小程序用户Id管理
在我们的开发项目中,经常需要用到用户ID,比如在小程序商城系统中,我们将商品加入购物车,这时前端就需要发送请求,携带上用户的ID。基本上很多种请求操作都需要携带用户ID,如果每个请求都需要我们往data中添加id的话,那样需要写很多重复代码,并且代码也不美观;所以我们可以利用JWT跟注解的方式来实现;
182 0