写在前面:

在前一篇博客《OAuth2.0 原理简介》中我们已经了解了OAuth2.0的原理以及它是如何工作的,那么本篇我们将来聊一聊OAuth的一种授权许可方式:授权码(Authorization Code)

什么是Authorization Code ?

简单来说授权码就是的在第三方应用程序请求Authrization Server来获取AccessToken之前的预先校验,增加了获取token的安全性。比如你吭哧吭哧写了一天的代码,急于回家吃上一口媳妇做的热饭。当你走到小区门口的时候你需要刷卡才能进入到小区,然后找到你家在哪一栋楼,几单元几号,然后掏出钥匙开门,才能回到家。在这个过程中授权码就相当于是你在用钥匙开门回家的前一步身份确认,如果你不是这个小区的,那你自然是没有办法进入到小区内部的。授权码方式是OAuth2.0最常用的一种授权方式,比如:QQ,豆瓣,新浪微博等用的都是这种方式。

授权码的工作流程解析

上图的流程表示了请求的全过程,需要注意的点是:

发起授权请求需要的参数如下:

对应步骤(C),客户端向Authorization Server发起请求的时候需要提供以下参数:

  1. response_type:必选。值固定为“code”。
  2. client_id:必选参数(第三方应用的标识ID,告诉服务器谁需要得到授权)
  3. state:Client提供的一个字符串,服务器会原样返回给Client。
  4. redirect_uri:必选参数(授权成功后的重定向地址)
  5. scope:可选参数(表示授权范围)

完整URL如下所示:

GET /authorize?response_type=code&client_id=1&state=xyz&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Foauth2&scope=user,photo HTTP/1.1
Host: server.example.com

得到授权返回数据如下:

对应上图中的步骤(E),A授权服务器会返回下面信息:

  1. code:授权码(用于的下一步中请求token使用)
  2. state:步骤(C)中客户端提供的state参数原样返回。

完整的URL如下:

Location: https://client.example.com/oauth2?code=SplxlOBeZQQYbYS6WxSbIA&state=xyz

发起获取token的请求参数如下:

对应步骤(G):

  1. grant_type:必选参数(固定值“authorization_code”)
  2. code : 必选参数(上一步Response 中响应的code,避免在请求的过程中被篡改)
  3. redirect_uri:必选参数(必须和Request中提供的redirect_uri相同)
  4. client_id:必选参数(必须和上一步Request中提供的client_id相同,不能token和授权码请求的第三方应用不一致)

得到token的response包含如下信息:

对应步骤(H):

  1. access_token:访问令牌(服务器端加密过的字符串)。
  2. refresh_token:刷新令牌(刷新令牌的字符串)
  3. expires_in:过期时间(令牌的过期时间)
{
"access_token":"MJhjskotnFZFEjr1zCsicHJKSLA",
"token_type":"granttype",
"expires_in":4800,
"refresh_token":"JHJhjasdsjhKNSGKmzHDK",
"example_parameter":"example_value_test"
}

如果有一天你的小区的钥匙被一个陌生人拿到了,那么他就可以名正言顺的进入的小区里面,那么他进入到你家的机会就大了很多。一样的道理,授权码如果被窃取的话,那么对方就可以直接用你的授权码来获取到token从而窃取到你的信息,在使用的时候我们首先要要求授权码不能够被重复使用,如果一旦发现在token的生命周期内授权码被重复使用的话则会强制销毁此授权码生成的所有token,重新再做一次登陆的授权验证。

写在最后:

授权码是我们平时用到的最多的一种授权方式,它使得我们的的应用程序在获取token之前多了一个额外的安全层来保证我们的授权和访问过程是安全可靠的。

参考资料: https://oauth.net/2/grant-types/authorization-code/

OAuth2.0 授权许可 之 Authorization Code的更多相关文章

  1. 基于OWIN WebAPI 使用OAUTH2授权服务【授权码模式(Authorization Code)】

    之前已经简单实现了OAUTH2的授权码模式(Authorization Code),但是基于JAVA的,今天花了点时间调试了OWIN的实现,基本就把基于OWIN的OAUHT2的四种模式实现完了.官方推 ...

  2. OAuth2.0授权

    一.什么是OAuth2.0官方网站:http://oauth.net/ http://oauth.net/2/ 权威定义:OAuth is An open protocol to allow secu ...

  3. Microsoft.Owin.Security.OAuth搭建OAuth2.0授权服务端

    Microsoft.Owin.Security.OAuth搭建OAuth2.0授权服务端 目录 前言 OAuth2.0简介 授权模式 (SimpleSSO示例) 使用Microsoft.Owin.Se ...

  4. 使用DotNetOpenAuth搭建OAuth2.0授权框架

    标题还是一如既往的难取. 我认为对于一个普遍问题,必有对应的一个简洁优美的解决方案.当然这也许只是我的一厢情愿,因为根据宇宙法则,所有事物总归趋于混沌,而OAuth协议就是混沌中的产物,不管是1.0. ...

  5. 微信开发——OAuth2.0授权

    微信公众平台最近新推出微信认证,认证后可以获得高级接口权限,其中一个是OAuth2.0网页授权,很多朋友在使用这个的时候失败了或者无法理解其内容,希望我出个教程详细讲解一下,于是便有了这篇文章. 一. ...

  6. OAuth2.0授权机制说明

    授权机制说明   1 简介 优酷对第三方应用用户授权采用OAuth2.0标准 2 OAuth2.0 授权方式 优酷支持OAuth 2.0的三种授权方式,请根据平台选用不同的授权方式: 2.1 通用授权 ...

  7. 使用微服务架构思想,设计部署OAuth2.0授权认证框架

    1,授权认证与微服务架构 1.1,由不同团队合作引发的授权认证问题 去年的时候,公司开发一款新产品,但人手不够,将B/S系统的Web开发外包,外包团队使用Vue.js框架,调用我们的WebAPI,但是 ...

  8. 深入浅出OAuth2.0授权

    一.前言 说到OAuth,先来一段百度到的比较官方的解释: OAUTH协议为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信 ...

  9. oauth2.0授权协议

    参考文章 一.OAuth是什么? OAuth的英文全称是Open Authorization,它是一种开放授权协议.OAuth目前共有2个版本,2007年12月的1.0版(之后有一个修正版1.0a)和 ...

随机推荐

  1. [Python]CentOS - ImportError: No module named '_curses'

    网上搜了不少答案, 基本都是说Windows环境下curses包不适用的问题. 作为碰到这个问题的linux用户,实在感到无奈. 起因是在CentOS上部署uwsgi,想要使用uwsgitop来监控. ...

  2. 多阶段构建Docker镜像

    在Docker 17.05及更高的版本中支持支持一种全新的构建镜像模式:多阶段构建: 多阶段构建Docker镜像的最大好处是使构建出来的镜像变得更小: 目前常见的两个构建镜像的方式为: 1.直接使用某 ...

  3. md5 加密文件

    import hashlibimport os def get_md5(file_path): md5 = None if os.path.isfile(file_path): f = open(fi ...

  4. C语言实型常量

    实型常量又称实数或浮点数.在C语言中可以用两种形式来表示一个实型常量. 一.小数形式 小数形式的实型常量由两部分组成:数字和小数点.如:0.12.12...12都是合法的实型常量. 二.指数形式 在C ...

  5. Mybatis_4.DBUtil.java

    1.获取SqlSessionFactory /** * @author:滕鹏飞 * @version: 1.0 * @Created on: 2018-8-31 下午2:10:45 * 类说明:加载配 ...

  6. linux下SS 网络命令详解

    ss命令用来显示处于活动状态的套接字信息. ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容. 但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比n ...

  7. 操作XML

    别人已经写过很好的XML辅助类,可以直接引用后使用: 我这里自己写一个xml的操作类,目前能实现的是对一个不含集合的类可以操作,含集合的类无法将集合里的数据读取出来, 首先定义一个XML特性,用于区分 ...

  8. 《C#与.NET程序员面试宝典》学习札记

    第2章 .NET概述 2.1-6~ .Net Framework / CLR / IL / Assembly IL:中间语言代码,不同语言(如C#,VB)的基于CLR的编译器编译生成的中间语言字节码, ...

  9. 微服务(Microservices)和服务网格(Service Mesh)架构概念整理

    注:文章内容为摘录性文字,自己阅读的一些笔记,方便日后查看. 微服务(Microservices) 在过去的 2016 年和 2017 年,微服务技术迅猛普及,和容器技术一起成为这两年中最吸引眼球的技 ...

  10. Roslyn还出现这么低级的错误,不应该呀!

    前几天对Dora.Interception作了简单的重构,想提供C#脚本来定义Interception Policy,毫无疑问微软提供的编译平台Roslyn使C#脚本化提供了支持.但是没有想到随便尝试 ...