oauth2.0学习笔记

简介

oauth2.0是一种目前被广泛使用的开放式授权协议。各个服务平台可以使用oauth2.0协议来允许平台用户授权第三方来获取用户的信息数据等。

术语

Client : 第三方应用

Resource Owner : 资源拥有者,即平台用户

Authorization Server : 认证服务器,即平台提供的专门处理认证的服务

Resource Server : 资源服务器,平台给第三方提供资源访问的服务器,它与认证服务器可以是同一台也可以不是同一台

User Agent : 用户代理,即浏览器

协议流程

(A)用户打开客户端以后,客户端要求用户给予授权

(B)用户同意给予客户端授权。

(C)客户端使用上一步获得的授权,向认证服务器申请令牌。

(D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。

(E)客户端使用令牌,向资源服务器申请获取资源。

(F)资源服务器确认令牌无误,同意向客户端开放资源。

客户端授权类型

  • 授权码模式(authorization code)
  • 简化模式(implict)
  • 密码模式(resource owner password credentials)
  • 客户端模式(client credentials)

目前最常用的是授权码模式,因此也只对授权码模式进行学习。

授权码模式流程

(A)用户访问客户端,后者将前者重定向到认证服务器。

(B)用户选择是否给予客户端授权。

(C)假设用户给予授权,认证服务器将用户导向客户端事先指定的"重定向URI"(redirection URI),同时附上一个授权码。

(D)客户端收到授权码,附上早先的"重定向URI",向认证服务器申请令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。

(E)认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。

获取授权码(authorization code)

请求参数:

参数名称 是否可选 参数值 说明

response_type

必填 code 响应类型,此处固定值

client_id

必填   客户端标识

redirect_uri

必填   重定向url

scope

可选   权限申请范围,多个空格分隔

state

可选   ?客户端状态,服务端原样返回

例如:

GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
Host: server.example.com

返回参数:

参数名称 是否可选 参数值 说明

code

必填   授权码,有效时间很短,一次性

state

可选   如果请求中包含,则原样返回

例如:

HTTP/1.1302 Found
 Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA&state=xyz

错误响应(JSON):

参数名称 是否可选 参数值 说明

error

必填 参见“错误代码表” 错误代码

error_description

可选   错误描述

error_uri

可选   错误信息查看手册url

错误代码表:

错误码 说明

invalid_request

请求格式不正确(参数缺失,重复等)

unauthorized_client

客户端未授权

access_denied

授权被拒绝

unsupported_response_type

response_type参数指定值不支持

invalid_scope

scope参数有误

server_error

授权服务器内部错误

temporarily_unavailable

授权服务暂时无法访问

例如:

HTTP/1.1 302 Found
   Location: https://client.example.com/cb?error=access_denied&state=xyz

注:当请求没有处理成功(参数正确,获取到授权码)时,返回错误信息时应将http响应的响应码也更改为对应的含义(500除外,可以使用其他代替)。仅当处理成功时http响应码才应该被设置为200.

获取访问令牌(access token)

请求参数:

参数名称 是否可选 参数值 说明

grant_type

必填

authorization_code

固定值

code

必填   授权码

redirect_uri

可选   如有,必须和上一步一致

client_id

必填   客户端标识
client_secret 必填   客户端秘钥(该字段平台定义)

例如:

POST /token HTTP/1.1
 Host: server.example.com
 Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
 Content-Type: application/x-www-form-urlencoded
 
 grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb

返回参数(JSON):

参数名称 是否可选 参数值 说明
access_token 必填 bearer 访问令牌
token_type 必填   令牌类型,bearer或mac
expires_in 可选   过期时间
refresh_token 可选   刷新令牌
scope 可选   权限范围

例如:

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"
     }

错误响应(JSON):

参数名称 是否可选 参数值 说明
error 必填 参见“错误代码表” 错误代码
error_description 可选   错误描述
error_uri 可选   错误信息查看手册url

错误代码表:

错误码 说明
invalid_request 请求格式不正确(参数缺失,重复等)

invalid_client

客户端权限校验失败

invalid_grant

授权码或refresh token无效

unauthorized_client

客户端未被授权使用该授权类型

unsupported_grant_type

授权服务器不支持该授权类型

invalid_scope

scope参数有误

例如:

HTTP/1.1 400 Bad Request
     Content-Type: application/json;charset=UTF-8
     Cache-Control: no-store
     Pragma: no-cache
 
     {
       "error":"invalid_request"
     }

注:当请求没有处理成功(参数正确,获取到授权码)时,返回错误信息时应将http响应的响应码也更改为对应的含义(500除外,可以使用其他代替)。仅当处理成功时http响应码才应该被设置为200.

HTTP响应码参考:

302 Found
400 Bad Request
401 Unauthorized
403 Forbidden
503 Service Unavailable

刷新访问令牌

请求参数:

参数名称 是否可选 参数值 说明
grant_type 必填

refresh_token

固定值
refresh_token 必填   刷新令牌
client_id 必填   客户端标识
client_secret 必填   客户端秘钥
scop 可选   权限范围

注:授权信息可以通过http请求头的形式发送。

例如:

POST /token HTTP/1.1
     Host: server.example.com
     Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
     Content-Type: application/x-www-form-urlencoded
 
     grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA

返回参数和错误响应与“获取访问令牌”一致。

访问保护资源

客户端访问用户受保护资源时,一般只需要访问平台给出的url地址,然后将access_token和其他参数一起发送过去即可。令牌信息可以通过请求头或者包含在请求数据中。

时间: 2024-08-08 12:08:17

oauth2.0学习笔记的相关文章

微软企业库5.0学习笔记(10)ASP.NET模块依赖注入

您可以使用HTTP模块,一个到ASP.NET HttpApplicationState类的扩展,在Global.asax编写代码强制ASP.NET在每一个页面请求时自动注入依赖的对象,就像在ASP.NET Web窗体应用程序中讨论的一样. 下列方法显示了一个合适的方法能够获取PreRequestHandlerExecute事件将它自己注入到ASP.NET的执行流水线,在每个页面请求中通过容器的BuildUp方法运行Http模块,并获取OnPageInitComplete事件.当OnPageIni

一起学ASP.NET Core 2.0学习笔记(二): ef core2.0 及mysql provider 、Fluent API相关配置及迁移

不得不说微软的技术迭代还是很快的,上了微软的船就得跟着她走下去,前文一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx.supervisor.mysql环境搭建搭建好了.net core linux的相关环境,今天就来说说ef core相关的配置及迁移: 简介: Entity Framework(以下简称EF) 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案,EF Core是Entity

Swift 2.0学习笔记(Day5)——我所知道的标识符和关键字

Swift 2.0学习笔记(Day5)--我所知道的标识符和关键字   原创文章,欢迎转载.转载请注明:关东升的博客 好多计算机语言都有标识符和关键字,一直没有好好的总结,就是这样的用着,现在小小的整理一下Swift中的标识符和关键字. 什么是标识符呢? 标识符就是给变量.常量.方法.函数.枚举.结构体.类.协议等由开发人员指定的名字. 其实,构成标识符的字母是有一定规范的,Swift中命名规则是: 区分大小写,Myname与myname是两个不同的标识符: 标识符首字符可以以下划线(_)或者字

Quartz.NET 2.0 学习笔记(1) :Quartz.NET简介

转自:http://www.cnblogs.com/lzrabbit/archive/2012/04/13/2447609.html Quartz.NET 项目地址 http://quartznet.sourceforge.net/ Quartz.NET 2.0 学习笔记(1) :Quartz.NET简介 Quartz.NET 2.0 学习笔记(2) :和1.0的几点不同 Quartz.NET 2.0 学习笔记(3) :通过配置文件实现任务调度 Quartz.NET 2.0 学习笔记(4) :c

Swift 2.0学习笔记(Day 29)——访问级别

Swift 2.0学习笔记(Day 29)——访问级别 原创文章,欢迎转载.转载请注明:关东升的博客 访问级别: Swift提供了3种不同访问级别,对应的访问修饰符为:public.internal和private.这些访问修饰符可以修饰类.结构体.枚举等面向对象的类型,还可以修饰变量.常量.下标.元组.函数.属性等内容. l public.可以访问自己模块中的任何public实体.如果使用import语句引入其他模块,我们可以访问其他模块中的public实体. l internal.只能访问自

Hadoop1.0.0学习笔记

Hadoop1.0.0学习笔记 一.  安装JDK,配置环境JAVA环境变量 exportJAVA_HOME=/home/ligang/jdk1.6.0_26 exportJRE_HOME=/home/ligang/jdk1.6.0_26/jre exportCLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH 二.  安装Hadoop-1.0.0 1.     下载hadoop文件,地址为:http://hadoop.apache.org/co

Swift 2.0学习笔记(Day 37)——默认构造函数

Swift 2.0学习笔记(Day 37)--默认构造函数原创文章,欢迎转载.转载请注明:关东升的博客 结构体和类的实例在构造过程中会调用一种特殊的init方法,称为构造函数.构造函数没有返回值,可以重载.在多个构造函数重载的情况下,运行环境可以根据它的外部参数名或参数列表调用合适的构造函数.默认构造函数结构体和类在构造过程中会调用一个构造函数,即便是没有编写任何构造函数,编译器也会提供一个默认的构造函数.下面看示例代码: class Rectangle { var width: Double

Swift 2.0学习笔记(Day 9)——离开表达式你试试!

Swift 2.0学习笔记(Day 9)--离开表达式你试试! 原创文章,欢迎转载.转载请注明:关东升的博客   表达式啊是很重要地. 在Swift中,表达式有3种形式. l  不指定数据类型 var a1 = 10 l  指定数据类型 var a1:Int  = 10 l  使用分号 var a1:Int = 10; vara2:Int = 20 在Swift语言中,一条语句结束后可以不加分号也可以添加分号,但是有一种情况必须要用分号,那就是多条语句写在一行的时候,需要通过分号来区别语句. 例

Swift 2.0学习笔记(Day 3)——Swift 2.0之后增加的关键字

Swift 2.0学习笔记(Day 3)——Swift 2.0之后增加的关键字 看了之前的学习笔记知道了什么是关键字,现在提示各位在Swift 2.0之后增加defer.guard.repeat.catch.rethrows.throw.throws和try关键字,其中repeat关键字替代do - while循环中的do,即中repeat - while循环.而do关键字用于错误处理.catch.rethrows.throw.throws和try是错误处理关键字. 错误处理是Swift 2.0