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?

最新文章

  1. Eclipse,myeclipse开发中常用技巧总结
  2. MPlayer 增加边看边剪切功能
  3. July 17th, Week 30th Sunday, 2016
  4. 初学android的第一个习作
  5. Android Volley框架的使用(三)
  6. Junit。。。
  7. 最牛X的编码套路
  8. Java_Activiti5_菜鸟也来学Activiti5工作流_之JUnit单元测试(四)
  9. MySQL更新死锁问题
  10. [转]浅谈PCA的适用范围
  11. Access是什么?
  12. 2019年最大的Flag
  13. C#中的反射解析及使用(转)
  14. java笔记----面试题总结(一)【转】
  15. jquery.autocomplete详解
  16. php中 curl, fsockopen ,file_get_contents 三个函数
  17. 这是一次 docker 入门实践
  18. js及Java中对于两个时间日期的判断脚本
  19. Docker的一些常用命令
  20. CentOS 7 kibana安装配置

热门文章

  1. 2.panel面板
  2. js-列表修改
  3. jQuery插件初级练习1答案
  4. DELPHI微信支付代码
  5. Android-Recyclerview的简单使用
  6. 【C#】转一篇MSDN杂志文:ASP.NET Pipeline: Use Threads and Build Asynchronous Handlers in Your Server-Side Web Code
  7. 纸壳CMS主题增强,支持主题中加入模板
  8. 解决C#项目出现“此项目引用这台计算机上缺少的 NuGet 程序包。使用 NuGet 程序包还原可下载这些程序包。有关详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 ..\packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props”
  9. .NET MVC 学习笔记(三)— MVC 数据显示
  10. uwp 用win2d获取图片主调颜色