初试oAuth2.0协议 转

1. 为什么要使用oAuth

  • 原始的应用架构,如果要访问其他应用内的数据,必须通过授权
  • 但是授权就需要登录,登录就需要用户名和密码
  • 一旦用户名和密码被其他应用保存,则会失去安全性
  • 一旦系统数据泄露,则用户的数据也会随之泄露
  • 用户修改密码会导致授权失效

2. oAuth的几个要素

  • 服务提供方——原始应用平台
  • 服务消费方——第三方应用
  • 资源所有者——用户
  • 代理——浏览器
  • 认证服务器——与服务提供方分离的专门用于进行授权验证的服务器
  • 资源服务器——与服务提供方分离的专门用户存放用户资源的服务器

3. oAuth到底是什么

oAuth,就是第三方应用,在不获取用户的登录信息的前提下,获取用户的权限和资源

4. oAuth的工作思路

1) 原始调用方式:

2) oAuth的调用方式:

4.1 区别

  1. oAuth新加了认证授权服务器,使用此方式可避免用户开放用户名和密码
  2. oAuth需要进行双重验证和授权

4.2 oAuth的核心

用户给服务消费方进行授权

该步骤最关键,因为用户怎样给服务消费方授权,将直接影响到认证授权服务器的Token验证

5. oAuth的授权模式

oAuth提供了4种授权模式:

  • 授权码模式(最完整、最严密)
  • 简化模式
  • 密码模式(需要高信任,不安全)
  • 客户端模式

根据四种模式的特征,这里只研究授权码模式。

6. 授权码模式

授权码模式的工作思路比较像登录验证:

登录功能

授权码模式

输入用户名和密码后,点击登录

服务消费方向用户发起授权申请

后台会校验用户名和密码是否正确

用户选择是否授予权限

如果密码匹配,登录成功,会将登录信息缓存到一个空间,之后重定向到另一个URL

如果用户通过授权,会将用户的授权信息(即授权码)附加到一个事先指定好的URL上,随后服务消费方 向认证授权服务器发起请求

后台控制器进行请求重定向的处理,展示页面,登录成功

认证授权服务器校验URL和授权码,确认通过,给服务消费方响应一个访问Token和更新Token

步骤中的几个关键点:

  • 服务消费方 向 用户发起认证授权的请求,URL中包含以下参数:
    • response_type:表示授权类型,必选项,此处的值固定为"code"
    • client_id:表示客户端的ID,必选项
    • redirect_uri:表示重定向URI,可选项
    • scope:表示申请的权限范围,可选项
    • state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。
  • 用户回应服务消费方的重定向URL中包含以下参数:
    • code:表示授权码,必选项。该码的有效期应该很短,通常设为10分钟,客户端只能使用该码一次,否则会被授权服务器拒绝。该码与客户端ID和重定向URI,是一一对应关系。
    • state:如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样包含这个参数。
  • 服务消费方 向 认证授权服务器发起申请认证Token的请求,URL包含以下参数:
    • grant_type:表示使用的授权模式,必选项,此处的值固定为"authorization_code"。
    • code:表示上一步获得的授权码,必选项。
    • redirect_uri:表示重定向URI,必选项,且必须与第一步中的该参数值保持一致。
    • client_id:表示客户端ID,必选项。
  • 认证授权服务器响应的数据(通常为json)中包含以下参数:
    • access_token:表示访问令牌,必选项。
    • token_type:表示令牌类型,该值大小写不敏感,必选项,可以是bearer类型或mac类型。
    • expires_in:表示过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间。
    • refresh_token:表示更新令牌,用来获取下一次的访问令牌,可选项。
    • scope:表示权限范围,如果与客户端申请的范围一致,此项可省略。

7. 更新Token

在服务消费方进行服务/资源调取时,可能会出现权限Token过期的情况,这个时候就需要使用更新Token去重新获取一个有效的Token。

  • 服务提供方 向 认证授权服务器发送更新Token的请求,URL中应包含以下参数:
    • granttype:表示使用的授权模式,必选项,此处的值固定为"refreshtoken"。
    • refresh_token:表示早前收到的更新令牌,必选项。
    • scope:表示申请的授权范围,不可以超出上一次申请的范围,如果省略该参数,则表示与上一次一致。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏玩转JavaEE

Git分支管理

Svn中也有分支管理,但是很low,Git的分支管理非常强大,本文先不去说分支管理内部到底怎么做的,我们先来看看Git中最基本的分支管理操作。 本文是Git系列...

41050
来自专栏云计算教程系列

如何在Debian 9上设置Node.js生产应用程序

Node.js是一个开源JavaScript运行时环境,用于构建服务器端和网络应用程序。该平台可在Linux,macOS,FreeBSD和Windows上运行。...

18540
来自专栏逸鹏说道

在 EF 5 中跟踪SQL和缓存数据

在EF4和EF5中需要跟踪执行SQL和缓存数据,微软官方有一个名为EFProviderWrappers的扩展示例非常值得学习,EFProviderWrapper...

29980
来自专栏阮一峰的网络日志

Linux的五个查找命令

在Linux中,有很多方法可以做到这一点。国外网站LinuxHaxor总结了五条命令,你可以看看自己知道几条。大多数程序员,可能经常使用其中的2到3条,对这5条...

14210
来自专栏我的博客

dedecms安装

安装之前需要准备 空间可以正常使用PHP+MYSQL 空间数据库用户名和密码 第一步:下载后解压uploads文件夹到指定的文件夹内(我这使用的www/dede...

36470
来自专栏IT技术精选文摘

架构师详解:Nginx 架构

16540
来自专栏从零开始学自动化测试

Selenium2+python自动化2-pip降级selenium3.0

selenium版本安装后启动Firefox出现异常:'geckodriver' executable needs to be in PATH selenium...

33750
来自专栏Python小屋

Python扩展库psutil用法精要

0、安装与导入psutil pip install psutil import psutil 1、查看CPU信息 >>> psutil.cpu_count() ...

34240
来自专栏jeremy的技术点滴

nginx使用备忘

310110
来自专栏WindCoder

ubuntu14.04下java安装及环境配置

这可以说是一篇迟到的文章,几个月前就说要写,结果拖到了现在。中间由于系统打不开等一系列原因,不得不重装了一遍,这次环境配置是出了点小问题,最后奉上。

33620

扫码关注云+社区

领取腾讯云代金券