OAuth 2.0授权之授权码授权
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授权之授权码授权的更多相关文章
- OAuth 2.0之授权码模式
转载自:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html OAuth 2.0授权码模式 授权码模式(authorization code)是功 ...
- 单点登录 - OAuth 2.0 授权码模式(一)
OAuth 2.0定义了四种授权方式 授权码模式(authorization code) 简化模式(implicit) 密码模式(resource owner password credentials ...
- 基于 IdentityServer3 实现 OAuth 2.0 授权服务【客户端模式(Client Credentials Grant)】
github:https://github.com/IdentityServer/IdentityServer3/ documentation:https://identityserver.githu ...
- 转 OAuth 2.0授权协议详解
http://www.jb51.net/article/54948.htm 作者:阮一峰 字体:[增加 减小] 类型:转载 时间:2014-09-10我要评论 这篇文章主要介绍了OAuth 2.0授权 ...
- OAuth 2.0 授权认证详解
一.认识 OAuth 2.0 1.1 OAuth 2.0 应用场景 OAuth 2.0 标准目前被广泛应用在第三方登录场景中,以下是虚拟出来的角色,阐述 OAuth2 能帮我们干什么,引用阮一峰这篇理 ...
- 理解OAuth 2.0
转自:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛 ...
- 理解OAuth 2.0(转载)
作者: 阮一峰 原文地址:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html OAuth是一个关于授权(authorization)的开放网络标 ...
- [转]理解OAuth 2.0
作者: 阮一峰 OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版. 本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释, ...
- 理解OAuth 2.0[摘]
原文地址:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到 ...
- [转发] 理解 oauth 2.0
原文: http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html oauth 的各种编程语言实现: http://oauth.net/2/ 理解OAu ...
随机推荐
- hdu 4961 数论?
http://acm.hdu.edu.cn/showproblem.php?pid=4961 给定ai数组; 构造bi, k=max(j | 0<j<i,a j%ai=0), bi=ak; ...
- shell 命令 bc linux下的计算器
bc命令 在linux环境下的计算器.
- AngularJS 路由及SPA理解
一.路由及SPA理解 路由允许我们通过不同的 URL 访问不同的内容,可实现多视图的单页web应用(SPA);通常我们的URL形式为 http://runoob.com/first/page,但在单页 ...
- ICCV2013、CVPR2013、ECCV2013目标检测相关论文
CVPapers 网址: http://www.cvpapers.com/ ICCV2013 Papers about Object Detection: 1. Regionlets for Ge ...
- 使用命令行打包 nuget 包
对于那些不打算涉及这么复杂而又想制作自己的 nuget 包的园友们,我是推荐使用 Nuget Package Explorer 来制作的.关于这个图形化的 nuget 包管理软件的使用,博客园内有相关 ...
- Spring Boot 应用系列 6 -- Spring Boot 2 整合Quartz
Quartz是实现定时任务的利器,Quartz主要有四个组成部分,分别是: 1. Job(任务):包含具体的任务逻辑: 2. JobDetail(任务详情):是对Job的一种详情描述: 3. Trig ...
- JS学习笔记9_JSON
1.JSON概述 JavaScript Object Natation,js对象表示法,(像XML一样)是一种数据格式,它与js有相同的语法形式 P.S.一点小历史:JSON之父是道格拉斯,<J ...
- VS动态修改App.config中遇到的坑(宿主进程问题)
昨天遇到了很奇怪的一个bug,具体描述如下: 这个系统是c/s架构的针对多个工厂做的资材管理系统,由于有很多个工厂,每个工厂都有自己的服务器.所以需要动态的改变连接字符串去链接不同的服务器. 由于这个 ...
- C# Winform右下角弹窗方式
[方法一] 第一步:winform项目创建完成后,添加一个窗口,命名为:Messages .(加上最开始的Form1,一共为两个窗口),双击主窗口进入后台代码 . 第二步:在Messages 窗口中添 ...
- 08_python_文件操作
一.初始文件操作 打开⽂件的⽅式: r, w, a, r+, w+, a+, rb, wb, ab, r+b, w+b, a+b 默认使⽤的是r(只读)模式 f = open("少妇嫩模.t ...