OAuth 2.0授权框架详解

Stella981
• 阅读 582

简介

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

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

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

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

OAuth的构成

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

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

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

OAuth 2.0授权框架详解

一般来说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的流程图:

OAuth 2.0授权框架详解

前面的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模式。

OAuth 2.0授权框架详解

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呢?

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

OAuth 2.0授权框架详解

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

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

Resource Owner 授权密码认证

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

我们先看一下流程图:

OAuth 2.0授权框架详解

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

Client 认证授权

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

OAuth 2.0授权框架详解

github的OAuth2认证流程

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

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

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

OAuth 2.0授权框架详解

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

OAuth 2.0授权框架详解

这里比较重要的就是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:是否允许在认证的时候注册。

看一下跳转的页面:

OAuth 2.0授权框架详解

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

当用户授权之后,就会调整到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-TOKENGET https://api.github.com/user

总结

OAuth2是一个非常常用的协议,也非常的方便,主要目的就是可以使第三方服务器可以获得授权范围内的用户信息。希望大家能够喜欢。

本文作者:flydean程序那些事

本文链接:http://www.flydean.com/oauth-2-0-in-depth/

本文来源:flydean的博客

欢迎关注我的公众号:「程序那些事」最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

本文分享自微信公众号 - 程序那些事(flydean-tech)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Spring Security 实战干货:OAuth2第三方授权初体验
1\.前言现在很多项目都有第三方登录或者第三方授权的需求,而最成熟的方案就是OAuth2.0授权协议。SpringSecurity也整合了OAuth2.0,在目前最新的SpringSecurity5中整合了OAuth2.0的客户端,我们可以很方便的使用SpringSecurityOAuth2来实现相关的需求。接下来跟着胖哥
Stella981 Stella981
3年前
Spring Boot 的 oAuth2 认证(附源码)
OAuth2统一认证原理OAuth在"客户端"与"服务提供商"之间,设置了一个授权层(authorizationlayer)。"客户端"不能直接登录"服务提供商",只能登录授权层,以此将用户与客户端区分开来。"客户端"登录授权层所用的令牌(token),与用户的密码不同。用户可以在登录的时候,指定授权层令牌的权限范围
Stella981 Stella981
3年前
Spring Cloud下基于OAUTH2认证授权的实现
SpringCloud下基于OAUTH2认证授权的实现博客分类:javaspring在SpringCloud需要使用OAUTH2来实现多个微服务的统一认证授权,通过向OAUTH服务发送某个类型的granttype进行集中认证和授权,从而获得access_token,而这个token是受其他微服务信任的,我们在后续的访问可以
Easter79 Easter79
3年前
SpringSecurity进阶:OAuth2.0详解
OAuth2是什么?OAuth是一个为了方便用户登入而使用的授权流程,他的优点是不需要向第三方平台暴露我们的用户名和密码,而是使用授权服务器颁发短期的token和效验token的方式开放部分资源给第三方平台OAuth是一个授权协议不是认证协议OAuth2的授权方式!(https://p1tt
Stella981 Stella981
3年前
Oauth2.0 认证的Web api例子
Oauth2.0的解释OAuth(开放授权)是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容。OAuth是一个关于授权(Authorization)的开放网络标准,目前的版本是2.0版。注意是Authorization(授权),而不
Wesley13 Wesley13
3年前
C#开发——网站应用微信登录开发
1\.在微信开放平台注册开发者账号,并有一个审核已通过的网站应用,并获得相对应的AppID和AppSecret,申请通过登陆后,方可开始接入流程。2.微信OAuth2.0授权登录目前支持authorization\_code模式,适用于拥有server端的应用授权。该模式整体流程为:1.第三方发起微信授权登录请求,微信用户允许授权第三方应
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这