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 ...
随机推荐
- bootstrap 图片切换
<!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title> ...
- AngularJS $watch 性能杀手
双向绑定是AngularJS核心概念之一,它给我们带来了思维的转变,不再是以DOM为驱动,而是以Model为核心,View中写上声明式标签(指令或{{}}),AngularJS会在后台默默同步View ...
- 3.1.1随机事件的概率的Breamer(2018-03-22)
% !Mode:: "TeX:UTF-8" \documentclass[xcolor=svgnames,serif,table,12pt]{beamer}%, %\include ...
- Spring Boot 2 启动时加载properties文件
每个项目从开发到测试再到上线所需要的各种环境是不同的,这就需要维护相应的配置文件,比如properties或yml文件.有了配置文件后就要考虑如何与应用进行集成. 对于云环境来讲,项目发布需要打成镜像 ...
- NODE-WEBKIT教程(6)NATIVE UI API 之MENU(菜单)
node-webkit教程(6)Native UI API 之Menu(菜单) 文/玄魂 目录 node-webkit教程(6)Native UI API 之Menu(菜单) 前言 6.1 Menu ...
- 动态生成html元素并为元素追加属性
动态生成HTML元素的方法有三种: 第一种:document.createElement()创建元素,再用appendChild( )方法将元素添加到指定节点 <!DOCTYPE html> ...
- 背水一战 Windows 10 (40) - 控件(导航类): AppBar, CommandBar
[源码下载] 背水一战 Windows 10 (40) - 控件(导航类): AppBar, CommandBar 作者:webabcd 介绍背水一战 Windows 10 之 控件(导航类) App ...
- 「PKUSC2018」真实排名(组合)
一道不错的组合数问题! 分两类讨论: 1.\(a_i\) 没有翻倍,那些 \(\geq a_i\) 和 \(a_j\times 2<a_i\) 的数就没有影响了.设 \(kth\) 为 \(a_ ...
- underscore.js源码研究(7)
概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以 ...
- 关于UUID
UUID是通用唯一识别码的缩写,其目的,是让分布式系统中的所有元素,都能有唯一的辨识信息. UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的. 在做后台管理的时候,经常会碰 ...