OAuth 2.0 是一个开放的标准协议,允许应用程序访问其它应用的用户授权的数据(如用户名、头像、昵称等)。比如使用微信、QQ、支付宝登录等第三方网站,只需要用户点击授权按钮,第三方网站就会获取到用户在微信、QQ、支付宝的信息(当然信息都是不敏感数据如用户名、头像、昵称等),获取这些信息后,第三方网站就可以用这些信息创建一个第三方用户账户,不需要再用户手动填写用户名、头像、昵称等......要想了解这个授权过程,我们需要想了解什么是OAuth 2.0.

OAuth 2.0类型

  在OAuth 2.0中"授权类型"指的是应用程序获取令牌的方式。OAuth 2.0定义了若干授权类型,有Authorization Code(授权码)、Implicit(隐式授权)、Password(密码授权)、Client Credentials(客户端凭证)、Device Code(设备代码)、Refresh Token(刷新令牌)。根据每种授权的应用场景选择不同的授权。每种授权类型都针对特定用例进行了优化,无论是Web应用程序,本机应用程序,无法启动Web浏览器的设备或服务器到服务器应用程序。对于网站、手机app授权,现在用的最广泛的就是授权码授权。

授权码授权

  授权码与其他授权类型不同点是,它说先要求应用程序启动浏览器来开始流程。授权的大致流程如下:

  • 应用程序打开浏览器,将网页转到OAuth服务器。(如用微博登录豆瓣,会跳转到微博授权页面。)
  • 用户看到授权提示,然后同意给应用授权。(用户点击授权按钮,同意给豆瓣授权用户的微博信息。)
  • 用户会重定向到应用程序,并且在返回的网址中带了授权码。(点击授权按钮后,会回到豆瓣,在网址中会带有Code.)
  • 应用程序通过Code去获取access token.

第一步、获取用户的授权

  首先应用程序需要构造一个URL,URL的结构如下:https://authorization-server.com/auth?response_type=code&client_id=29352915982374239857&redirect_uri=https%3A%2F%2Fexample-app.com%2Fcallback&scope=create+delete&state=xcoiv98y2kd22vusuye3kch

  • response_type:这是告诉授权服务器,返回类型,code表示授权码授权。
  • client_id:应用程序的公共标识符。
  • redirect_uri:告诉授权服务器在用户批准授权后,将获取的Code发送到哪里。
  • scope:应用授权作用域(如微信,当scope=snsapi_base时,只能获取用户的openId。当scope=snsapi_userinfo时,可以获取昵称、性别、所在地)。
  • state:应用程序传递的一个随机数,用来防止CSRF攻击。

  如豆瓣需要获取微信的授权信息,根据微信文档,拼接这个URL,会重定向到微信授权页面,当用户点击授权时,会返回到redirect_uri对应的值的网址,微信会在网址后面添加上code=CODE&state=STATE。code的值就是微信返回的信息,state是的值是应用程序之前传递的值。

第二步、重定向返回应用程序

  应用程序需要接受返回的code。注意code有有效期,并且只能使用一次,微信认证为5分钟过期,支付宝为3分钟到24小时。

第三步、通过code获取access token

  获取access token应用程序需要通过POST请求并带着下面的参数请求授权服务器。

  • grant_type=authorization_code:告诉授权服务器,采用的授权类型是授权码类型。
  • code:获取的code。
  • redirect_uri:重定向网址。此参数不是必须的。
  • client_id:应用程序Id
  • client_secret:安全码。如果没有安全码,每个应用程序(包括攻击者的应用程序)都可以去获取微信的授权,因为这些参数(除了安全码)都可以拼接。为了安全,当你的应用程序需要微信授权登录时,申请了微信的应用,微信会给你一个secret。

请求授权服务器后,服务器会返回

{
"access_token":"MTQ0NjJkZmQ5OTM2NDE1ZTZjNGZmZjI3", //我们最终所需要的access token
"token_type":"bearer",              //令牌类型
"expires_in":3600,                 //access_token接口调用凭证超时时间,单位(秒)
"refresh_token":"IwOGYzYTlmM2YxOTQ5MGE3YmNmMDFkNTVk", //当access token超时失效后,需要用refresh token来再次获取access token
"scope":"create delete"               //应用授权作用域
}
授权流程到此就结束了。
参考:
What is the OAuth 2.0 Authorization Code Grant Type?

OAuth 2.0授权之授权码授权的更多相关文章

  1. OAuth 2.0之授权码模式

    转载自:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html OAuth 2.0授权码模式 授权码模式(authorization code)是功 ...

  2. 单点登录 - OAuth 2.0 授权码模式(一)

    OAuth 2.0定义了四种授权方式 授权码模式(authorization code) 简化模式(implicit) 密码模式(resource owner password credentials ...

  3. 基于 IdentityServer3 实现 OAuth 2.0 授权服务【客户端模式(Client Credentials Grant)】

    github:https://github.com/IdentityServer/IdentityServer3/ documentation:https://identityserver.githu ...

  4. 转 OAuth 2.0授权协议详解

    http://www.jb51.net/article/54948.htm 作者:阮一峰 字体:[增加 减小] 类型:转载 时间:2014-09-10我要评论 这篇文章主要介绍了OAuth 2.0授权 ...

  5. OAuth 2.0 授权认证详解

    一.认识 OAuth 2.0 1.1 OAuth 2.0 应用场景 OAuth 2.0 标准目前被广泛应用在第三方登录场景中,以下是虚拟出来的角色,阐述 OAuth2 能帮我们干什么,引用阮一峰这篇理 ...

  6. 理解OAuth 2.0

    转自:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛 ...

  7. 理解OAuth 2.0(转载)

    作者: 阮一峰 原文地址:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html OAuth是一个关于授权(authorization)的开放网络标 ...

  8. [转]理解OAuth 2.0

    作者: 阮一峰 OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版. 本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释, ...

  9. 理解OAuth 2.0[摘]

    原文地址:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到 ...

  10. [转发] 理解 oauth 2.0

    原文: http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html oauth 的各种编程语言实现: http://oauth.net/2/ 理解OAu ...

随机推荐

  1. 微信小程序-button组件

    主要属性: 注:button-hover 默认为{background-color: rgba(0, 0, 0, 0.1); opacity: 0.7;} 效果图: ml: <!--默认的but ...

  2. 中大 9095. Islands

    9095. Islands 限制条件 时间限制: 2 秒, 内存限制: 256 兆 题目描述 Whenever it rains, Farmer John's field always ends up ...

  3. brctl命令

    有五台主机.其中一台主机装有linux ,安装了网桥模块,而且有四块物理网卡,分别连接同一网段的其他主机.我们希望其成为一个网桥,为其他四台主机(IP分别为192.168.1.2 ,192.168.1 ...

  4. VS动态修改App.config中遇到的坑(宿主进程问题)

    昨天遇到了很奇怪的一个bug,具体描述如下: 这个系统是c/s架构的针对多个工厂做的资材管理系统,由于有很多个工厂,每个工厂都有自己的服务器.所以需要动态的改变连接字符串去链接不同的服务器. 由于这个 ...

  5. AJPFX平台讲述买卖、点差、单位,外汇的交易时间以及外汇交易者的参与者

    AJPFX平台讲解:买(多).卖(空).点差.单位 外汇保交易也就是通过外汇的升值和贬值来赚取利润.以EURUSD(欧元/美元)为例.假设目前价格为1.3820左右,即1欧元兑换1.3820美元.这个 ...

  6. Bs4 BeautifulSoup取值

    原文网址:https://blog.csdn.net/u010244522/article/details/79627073 从网页获取HTML数据后,获取对应标签.属性的值 取值方法主要有以下几种: ...

  7. saltstack returners 结果转存

    returners 是saltstack对minion执行操作后,对返回的数据进行存储,可以存储到一个文件或者数据库当中. 支持的returners http://docs.saltstack.cn/ ...

  8. python读取文件首行和最后一行

    python读取文件最后一行两种方式 1)常规方法:从前往后依次读取 步骤:open打开文件. 读取文件,把文件所有行读入内存. 遍历所有行,提取指定行的数据. 优点:简单,方便 缺点:当文件大了以后 ...

  9. 安卓Dialog对话框多次显示而闪退的解决办法

    事情是这样子的,我在一个活动中自定义了一个AlertDialog,通过一个按钮点击即可弹出,而后来出现的情况是,第一次点击就没问题, 正常跳出,而第二次就直接程序闪退,然后报The specified ...

  10. W,b的初始化和几种激活函数

    权重W不能全部初始化为0,原因很简单,我们可以自己在本子上推导一下,假设现有一个含有一个隐藏层,隐藏层含有两个神经元初始输入为两个向量的网络,如果权重初始化全部为0,那么,第一层的输出,会和第二层的输 ...