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. hdu 5095 多项式模拟+有坑

    http://acm.hdu.edu.cn/showproblem.php?pid=5095 就是把ax^2 + by^2 + cy^2 + dxy + eyz + fzx + gx + hy + i ...

  2. php email

    项目中用到了发邮件的功能.代码很简单,但是其中碰到了一些奇怪的问题. smtp error: could not authenticate 163 ======================== 新 ...

  3. 深入探讨 Java 类加载器(转)

    原帖地址:https://www.ibm.com/developerworks/cn/java/j-lo-classloader/ 类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要 ...

  4. sql server rdl report 如何用动态sql

    我做rdl report 一般用存储过程,可是今天遇到个问题,需要用动态sql,rdl report数据集不能绑定字段 查了一下谷歌,解决如下: declare @CarrierList table ...

  5. 工作随笔——获取当前Java程序PID

    小知识,记录下: JVM:1.8 // spring boot 中可以使用 String pid = ManagementFactory.getRuntimeMXBean().getSystemPro ...

  6. 数据导出之winfrom导出word(一)

    我们常会用winfrom程序开发小工具,使用dataGridView控件展示数据.同时,我们也会有将这些数据导出的需求. 本篇文章介绍了开发过程中遇到的问题. 一.引用组件 首先,需要在窗体程序中引用 ...

  7. .NET 中的 GAC

    GAC : ———> 全局程序集缓存 介绍GAC的好文章(怎么:生成SNK,给项目加强名称,加入到GAC,多个版本共存,介绍了不同的工具): http://www.makaidong.com/% ...

  8. 通过EntityFramework操作sqlite(DbFirst)

    记录一下通过 EntityFramework6 来操作sqlite过程 环境: visual studio 2017 .net 4.5 Console Application(项目类型) sqlite ...

  9. OSLab文件描述符

      日期:2019/3/24 内容:Linux文件描述符.   一.基本概念 文件描述符(File Descriptor) 一个非负整数.应用程序利用文件描述符来访问文件.打开现存文件或新建文件时,内 ...

  10. [宁波集训]0827Day1

    1.\(CF771D\ Bear\ and\ Company\)(原题,比赛时改为多组数据) 一道毒瘤\(dp\)题,\(dp[i][j][k][0/1]\)表示有\(i\)个\(V\),有\(j\) ...