OAuth 2.0授权框架详解

news2025/1/12 23:43:21

简介

在现代的网站中,我们经常会遇到使用OAuth授权的情况,比如有一个比较小众的网站,需要用户登录,但是直接让用户注册就显得非常麻烦,用户可能因为这个原因而流失,那么该网站可以使用OAuth授权,借助于github或者其他的第三方网站的认证授权,来获取相关的用户信息,从而避免了用户注册的步骤。

当然,很可能在第三方网站上授权获得用户信息之后,还需要在本网站填写一些必要的信息进行绑定,比如手机号,用户名等等。

但是这比单纯的注册要方便太多了,也容易让用户接受。

今天,我们将要讲解一下OAuth 2.0授权框架的构成,希望大家能够喜欢。

OAuth的构成

在传统的CS模式的授权系统中,如果我们想要借助第三方系统来访问受限的资源,第三方系统需要获取到受限资源服务器的用户名和密码,才能进行对资源服务器的访问,很显然这个是非常不安全的。

在OAuth2中,我们是怎么做的呢?

我们先来看一下OAuth2中授权的流程图:

一般来说OAuth2中有4个角色。

resource owner: 代表的是资源的所有者,可以通过提供用户名密码或者其他方式来进行授权。通常来是一个人。

resource server:代表的是最终需要访问到资源的服务器。比如github授权之后获取到的用户信息。

client: 用来替代resource owner来进行交互的客户端。

authorization server: 用来进行授权的服务器,可以生成相应的Access Token。

整个流程是这样的:

Client向resource owner发起一个授权请求,resource owner输入相应的认证信息,将authorization grant返回给client。

client再将获取到的authorization grant请求授权服务器,并返回access token。

client然后就可以拿着这个access token去请求resource server,最后获取到受限资源。

refresh Token

为了安全起见,access token总是有过期时间的,那么如果token过期了怎么办呢?

具体的办法就是refresh Token :

我们看一下refresh token的流程图:

前面的A,B,C,D和之前的讲到的流程是一致的。

如果接下来访问资源的时候,access token过期了,那么client会再次向认证服务发出refresh token的请求。

然后认证服务器会再次返回新的access token.

Authorization Code模式

上面我们讲到的模式中,Client会保存Authorization Grant信息,并通过这个信息来去授权服务器请求Access Token。

Client直接保存Authorization Grant信息,并和授权服务器进行通信,这对client会有一定的安全限制。

如果是在web环境中,client是借助user-agent(web浏览器)来进行访问的该如何处理呢?

这里向大家介绍一个Authorization Code模式。

Client通过User-Agent发起请求,并附带跳转链接。当提供了用户的授权认证信息之后,授权服务器返回的不是token而是authorization code,拿到这个code之后,client可以通过这个code来获取access Token或者refresh Token。

上面的授权流程图我们可以通过一个具体的例子来说明,resource owner就是我们要访问的资源。 Authorization Server是第三方的授权服务器,比如github的授权服务。而User-Agent就是浏览器。

好了,我们开始具体流程的讲解:

比如用户想获取www.flydean.com的信息,但是需要登录,这个时候就跳转到github的登录界面,我们输入github的用户名密码,github会返回一个Authorization Code到我们的服务器比如 www.flydean.com/?code=code, client拿到这个code之后,会去后台请求github,去验证这个code的合法性,如果code合法,则github会返回access token的信息,client后面就可以通过access token去github资源服务器资源了。

举一个具体的access token返回值的例子:

 HTTP/1.1 200 OK Content-Type: application/json;charset=UTF-8 Cache-Control: no-store Pragma: no-cache { "access_token":"2YotnFZFEjr1zCsicMWpAA", "token_type":"example", "expires_in":3600, "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA", "example_parameter":"example_value" } 

隐式授权

在上面我们讲到的几个模式中,client都需要直接和授权服务器进行通信,从而获取到access Token,有没有什么方式可以不需要client和授权服务器直接通信就可以得到access token呢?

接下来我们讲一下隐式授权。

上图就是一个隐式授权的例子,和Authorization Code模式不同的是,授权服务器返回的是一个access token片段,只有这个片段,我们是无法得到access token的。

这里我们需要额外请求一次client resource服务器,服务器将会返回一个script脚本,通过这个脚本,我们对access token片段进行解析,得到最终的access token。

Resource Owner 授权密码认证

这种模式一般出现在resource owner非常信任client的情况下。

我们先看一下流程图:

这种模式实际上相当于用户将密码交给client保管,由client使用保存好的用户名密码向授权服务器请求资源。

Client 认证授权

这种模式下,client本身是有一定的授权范围的,可以通过client认证授权,直接获取到授权服务器的access token。

github的OAuth2认证流程

上面讲的通用流程中,其实很多角色都可以合并的。

接下来我们具体讲解一下如何使用github的OAuth2进行授权。

要使用github的OAuth2,需要首先在github中进行OAuth服务的注册。

点击注册按钮,输入相应的信息,我们就可以完成注册了。

这里比较重要的就是callback url,我们会通过这个callback url来传递授权信息。

注册成功之后,你会得到一个Client ID和Client Secret。

github的授权步骤分为三个部分:

用户跳转到github的认证页面进行授权

在这一部分中,我们需要跳转到github的授权页面:

https://github.com/login/oauth/authorize 

上面是跳转页面的链接,这个链接可以接下面几个参数:

client_id: 必须的参数,是我们上面注册app得到的client id。

redirect_uri: 可选参数,如果不设定,则会使用注册的时候提供的callback uri。

login:可选参数,指定具体的认证用户名。

scope:github中权限的范围。

state: 是一个随机数,用来防止cross-site攻击。

allow_signup: 是否允许在认证的时候注册。

看一下跳转的页面:

用户跳转回要访问的资源页面

当用户授权之后,就会调整到callback页面,并带上code:

http://www.flydean.com/login?code=b14a2dd57f11b2310f42 

应用程序拿到code之后,通过调用下面的请求来获取access token:

POST https://github.com/login/oauth/access_token 

这个post请求需要带上client_id,client_secret,code这三个必须的参数,还可以带上两个可选的参数redirect_uri和state。

默认情况下,我们会获取到下面的响应信息:

access_token=e72e16c7e42f292c6912e7710c838347ae178b4a&token_type=bearer 

应用程序拿到access token获取到github用户信息

有了access token之后,我们需要将token放到请求head中,去请求用户信息:

Authorization: token OAUTH-TOKEN
GET https://api.github.com/user 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/156550.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FactoryBean和BeanFactory的区别

1. 前言 “BeanFactory和FactoryBean的区别是什么???” 这是Spring非常高频的一道面试题,BeanFactory是Spring bean容器的顶级接口,负责创建和维护容器内所有的bean对象。而FactoryBean是用来创建一类bean的接口&…

数字新基建之数据云

自2021年“新基建”概念火爆以来,相关的政策和技术都不断跟进和发展,由于“新基建”本质上是基础设施向数字化、智能化、网络化方向发展,因此更多的科技领域从业者和投资者都将其称为“数字新基建”。而数据库、数据仓库、大数据平台和数据云…

C语言:整数的存储方式

整数的存储方式 char类型在存储时是按照ASCII码值进行存储,存储方式与整型一致 有符号数与无符号数 char一个字节signed charunsigned char int四个字节signed intunsigned int 各种类型数据均分为有符号和无符号类型,当定义一个int类型或char类型的数…

备库为什么会延迟好几个小时?

在上一篇文章中,我和你介绍了几种可能导致备库延迟的原因。你会发现,这些场景里,不论是偶发性的查询压力,还是备份,对备库延迟的影响一般是分钟级的,而且在备库恢复正常以后都能够追上来。 但是,如果备库执行日志的速度持续低于主库生成日志的速度,那这个延迟就有可能…

百度搜索留痕推广资源整理如何收录排名的?

每日分享:百度对图文类内容的优质标准 (1)文字的字体、字号与间距需要适配网页,文档分段合理,结构有序,阅读体验舒适。 (2)在文章中使用小标题准确概括段意,通过加粗、…

vue3 setup语法糖父子组件传值,让女友看得明明白白

前言 最近在想做个cloud项目,gitee上找了个模板项目,前端使用到vue3 typeScript,最近使用到vue3 的父子组件之间的传值,顺便学习一下,在此总结一下,若有不足之处,望大佬们可以指出。 vue3官网&#xff1a…

栈--专题讲解

文章目录基本概念模拟栈数据结构-栈:stack头文件定义基本操作实例:火车进栈题目大意解题思路AC代码基本概念 栈的定义 栈(stack)是限定仅在表尾进行插入或者删除的线性表。对于栈来说,表尾端称为栈顶(top)&#xff0c…

web服务器----基于http协议搭建的静态网站详解

一,WWW的简介 1、什么是 www www 是 world wide web 的缩写,也就是全球信息广播的意思。通常说的上网就是使用 www 来查询用户所需要的信息。www 可以结合文字、图形、影像以及声音等多媒体,并通过可以让鼠标单击超链接的方式将信息以 Inter…

Docker容器搭建及基本使用

一、安装环境 操作系统:CentOS 7(建议用7或以上,因为6版本有部分功能不兼容) 二、Docker安装 1、卸载旧版本 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrota…

linux修改密码报错‘Authentication token manipulation error‘

本次事故使用操作系统为centos7 1、报错起因: 利用chage设置root用户密码定期更换后,到期之后登录系统,输入密码之后,提示要改密码,输入新密码之后,报错 ‘Authentication token manipulation error’ &a…

【k8s系列】gvisor安装与containerd集成

文章目录安装与containerd集成下发runtimeclass资源修改containerd配置文件准备pod的yaml文件参考资料author: ningan123date: ‘2023-01-11 21:23’updated: ‘2023-01-11 21:31’安装 安装地址:Installation - gVisor ARCH$(uname -m)URLhttps://storage.googlea…

Gotify <2.2.3 存在反射型 XSS 漏洞(MPS-2023-0815)

漏洞描述 Gotify 是 Go 语言开发的开源组件,用作于发送和接收消息的服务器。 由于 2.2.3 之前版本的 Gotify 使用具有反射型 XSS 漏洞版本的 swagger-ui 生成文档,当用户访问 Gotify /docs 页面时存在反射型 XSS 漏洞。 攻击者可诱导 Gotify 用户点击…

【学习笔记】【Pytorch】四、torchvision中的数据集使用

【学习笔记】【Pytorch】四、torchvision中的数据集使用学习地址主要内容一、datasets模块介绍二、datasets.CIFAR10类的使用1.使用说明2.代码实现学习地址 PyTorch深度学习快速入门教程【小土堆】. 主要内容 一、datasets模块介绍 介绍:一些加载数据的函数及常用…

P6:DataLoader的使用

1、准备数据集(测试集) import torchvisiontest_data torchvision.datasets.CIFAR10(./dataset, trainFalse, transformtorchvision.transforms.ToTensor()) 注意数据集中的图片是PIL的格式,需要格式转换。 2、使用DataLoader from torch…

HBase数据库总结(一)

1、 HBase的特点是什么?HBase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。1)大:一个表可以有数十亿行,上百万列2&…

测试开发基础|一文搞定计算机网络(一)

计算机网络知识对测试人员来说是非常重要的基础技能。无论是在平时测试工作中(比如接口测试),还是测试技术面试时,都会经常涉猎。很多基础薄弱的同学靠临时抱佛脚突击搜索学习,对系统知识和重点难点的理解总是不够透彻…

认证授权-SpringSecurity

认证授权-SpringSecurity 1. 认证授权概述 1.1 认证授权概念 1.1.1 认证 在互联网中,我们每天都会使用到各种各样的 APP 和网站,在使用过程中通常还会遇到需要注册登录的情况,输入你的用户名和密码才能正常使用,也就是说成为这…

uniapp引入vantweapp踩坑笔记

vue-cli创建uniapp项目引入vantweapp踩坑笔记 uni-app中引入vantweappvue-cli创建uniapp项目引入vantweapp踩坑笔记一、环境准备二、项目搭建三、引入vant第一种方式第二种方式一、环境准备 我用的环境分别是 软件名称版本号下载命令\链接检查是否成功卸载命令Vue-clivue/cli…

JavaScript中的重要概念

JavaScript中的重要概念 1、标识符 标识符(Identifier)就是名字。JavaScript 中的标识符包括变量名、函数名、参数名、属性名、类名等。 合法的标识符应该注意以下强制规则: 第一个字符必须是字母、下划线(_)或美元…

发表计算机SCI论文,需要经历哪些阶段? - 易智编译EaseEditing

想在SCI期刊上发表一篇属于自己的论文一定是要经历四个阶段:论文选题、论文写作、期刊投稿和修稿反馈。 1.论文选题:前面已经说过在SCI期刊上发表论文是比较有难度的,是因为SCI期刊通常要求所接收稿件的选题具有较高的创新性和新颖性。 所以…