OAuth2.0的简单理解与使用
2018-03-17 13:29
411 查看
最近在做小程序的开发,在调用数据接口的时候发现一个以前知道却不了解的协议OAuth2.0,只有获得授权才可以顺利调用自己想要的API,没办法只能花时间研究下咯。
1.应用场景
假设你想玩现在很火的一款吃鸡游戏,但是需要使用你的微信账号登录,这时就出现一个授权访问的问题,OAuth2.0协议就是应用于这种场景之下的。
如图微信会告诉你,吃鸡游戏将会访问你的那些用户数据
首先我们来理解下OAuth2.0协议的一些定义
(1)第三方应用程序,如上例中的吃鸡游戏
(2)服务提供商:提供账号相关信息的微信
(3)资源所有者/用户:微信中的注册用户
2.使用原因
使用第三方应用(吃鸡游戏)登录时,最传统的办法是让用户直接游戏登录页面输账号和密码,但是有的用户觉得注册新账号麻烦(或者APP根本没有提供注册,仅提供关联账号),于是就使用相关的社交账号(微信)通过用户的账号和密码去微信那里获取用户数据,但这样做有很多严重的缺点:
吃鸡游戏需要明文保存用户的微信账号和密码,这样很不安全。
吃鸡游戏拥有了获取用户在微信所有的权限,包括删除好友、给好友发消息、更改密码、注销账号等危险操作。
用户只有修改密码,才能收回赋予吃鸡游戏的权限。但是这样做会使得其他所有获得用户授权的第三方应用程序全部失效。
只要有一个第三方应用程序被破解,就会导致用户密码泄漏,以及所有使用微信登录的网站的数据泄漏。
为了解决以上的问题,OAuth 协议应运而生。
3.运行原理
微信作为服务提供商,拥有用户的头像、昵称、好友以及所有的朋友圈内容,吃鸡游戏希望获取用户存储在微信的头像和昵称,假设它们是三个人(吃鸡游戏是帮忙取快递的人,微信是快递员):
吃鸡游戏和微信说,我想要拿用户X的个人快递
微信就说了,你想要获得用户X的快递可以,但是我得先去问问用户X是否同意
用户X 对微信说:我给吃鸡游戏我的取货码和手机号(即一个信用凭证),如果他给你出示了这些,你就把我的快递给他
吃鸡游戏使用户给它的凭证顺利拿到了用户X的快递。
以上是 OAuth 认证的大概流程。在使用微信授权之前,吃鸡游戏需要先在微信开放平台上注册应用,填写自己的名称、logo、用途等信息,微信开放平台颁发给吃鸡游戏一个应用 ID 和叫 APP Secret 的密钥,在实际对接中,会使用到这两个参数。
上图使用的是csdn开放平台创建的应用过程,成功后就将获得应用 ID 和叫APP Secret 密钥
以下是吃鸡游戏获得授权的具体流程
1. 用户点击登录按钮
页面自动跳转到初始参数中
第三步,吃鸡游戏通过上一步获取的 code 参数换取 Token,Token 就是前文中说到的信用凭证(取货码和手机号)。
要包含以下参数:
client_id:在微信开放平台申请的应用 ID
client_secret:在微信开放平台申请时提供的APP Secret
grant_type:需要填写authorization_code
code:上一步获得的 code
redirect_uri:回调地址,需要与注册应用里的回调地址以及第一步的 redirect_uri 参数一致
通过第三步的请求,接口返回 Token 和相关数据:
在第四步中获取了access_token ,使用它,就可以去获取用户的资源了
最后一步,微信返回用户信息,吃鸡游戏进行处理,整个流程结束。
通过以上的方式,在微信和吃鸡游戏中间建立了一个独立的权限层,这个权限由用户赋予,可以被用户随时取消,不同第三方应用之间相互独立,互不干扰,这样就彻底解决了明文存放账号密码的问题。
举例
1.csdn申请acess_token实例(csdn客户端登录授权连接:http://open.csdn.net/wiki/oauth2):
2.调用API使用access_token获得博主的基本信息
文章参考自:https://www.jianshu.com/p/0db71eb445c8
http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html
1.应用场景
假设你想玩现在很火的一款吃鸡游戏,但是需要使用你的微信账号登录,这时就出现一个授权访问的问题,OAuth2.0协议就是应用于这种场景之下的。
如图微信会告诉你,吃鸡游戏将会访问你的那些用户数据
首先我们来理解下OAuth2.0协议的一些定义
(1)第三方应用程序,如上例中的吃鸡游戏
(2)服务提供商:提供账号相关信息的微信
(3)资源所有者/用户:微信中的注册用户
2.使用原因
使用第三方应用(吃鸡游戏)登录时,最传统的办法是让用户直接游戏登录页面输账号和密码,但是有的用户觉得注册新账号麻烦(或者APP根本没有提供注册,仅提供关联账号),于是就使用相关的社交账号(微信)通过用户的账号和密码去微信那里获取用户数据,但这样做有很多严重的缺点:
吃鸡游戏需要明文保存用户的微信账号和密码,这样很不安全。
吃鸡游戏拥有了获取用户在微信所有的权限,包括删除好友、给好友发消息、更改密码、注销账号等危险操作。
用户只有修改密码,才能收回赋予吃鸡游戏的权限。但是这样做会使得其他所有获得用户授权的第三方应用程序全部失效。
只要有一个第三方应用程序被破解,就会导致用户密码泄漏,以及所有使用微信登录的网站的数据泄漏。
为了解决以上的问题,OAuth 协议应运而生。
3.运行原理
微信作为服务提供商,拥有用户的头像、昵称、好友以及所有的朋友圈内容,吃鸡游戏希望获取用户存储在微信的头像和昵称,假设它们是三个人(吃鸡游戏是帮忙取快递的人,微信是快递员):
吃鸡游戏和微信说,我想要拿用户X的个人快递
微信就说了,你想要获得用户X的快递可以,但是我得先去问问用户X是否同意
用户X 对微信说:我给吃鸡游戏我的取货码和手机号(即一个信用凭证),如果他给你出示了这些,你就把我的快递给他
吃鸡游戏使用户给它的凭证顺利拿到了用户X的快递。
以上是 OAuth 认证的大概流程。在使用微信授权之前,吃鸡游戏需要先在微信开放平台上注册应用,填写自己的名称、logo、用途等信息,微信开放平台颁发给吃鸡游戏一个应用 ID 和叫 APP Secret 的密钥,在实际对接中,会使用到这两个参数。
上图使用的是csdn开放平台创建的应用过程,成功后就将获得应用 ID 和叫APP Secret 密钥
以下是吃鸡游戏获得授权的具体流程
1. 用户点击登录按钮
页面自动跳转到初始参数中
redirect_uri定义的那个URL,并自动在 URL 末尾添加一个
code参数
第三步,吃鸡游戏通过上一步获取的 code 参数换取 Token,Token 就是前文中说到的信用凭证(取货码和手机号)。
要包含以下参数:
client_id:在微信开放平台申请的应用 ID
client_secret:在微信开放平台申请时提供的APP Secret
grant_type:需要填写authorization_code
code:上一步获得的 code
redirect_uri:回调地址,需要与注册应用里的回调地址以及第一步的 redirect_uri 参数一致
通过第三步的请求,接口返回 Token 和相关数据:
{ "access_token": "ACCESS_TOKEN",//Token 的值 "expires_in": 1234,//过期时间 "uid":"122222"//当前授权用户的UID。 }
在第四步中获取了access_token ,使用它,就可以去获取用户的资源了
最后一步,微信返回用户信息,吃鸡游戏进行处理,整个流程结束。
通过以上的方式,在微信和吃鸡游戏中间建立了一个独立的权限层,这个权限由用户赋予,可以被用户随时取消,不同第三方应用之间相互独立,互不干扰,这样就彻底解决了明文存放账号密码的问题。
举例
1.csdn申请acess_token实例(csdn客户端登录授权连接:http://open.csdn.net/wiki/oauth2):
2.调用API使用access_token获得博主的基本信息
文章参考自:https://www.jianshu.com/p/0db71eb445c8
http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html
相关文章推荐
- 有效的使用和设计COM智能指针—条款4:理解ATL的CComPtr提倡简单
- 使用DotNetOpenAuth搭建OAuth2.0授权框架——Demo代码简单说明
- ios学习之autolayout自动布局的简单理解 即UIKIt dymanic的使用
- bp神经网络的简单理解和使用
- 对于CocoaPods的简单理解,实践安装使用过程和常见问题
- Retrofit三步理解之一 ------------------ Retrofit的简单使用总结
- 有效的使用和设计COM智能指针——条款4:理解ATL的CComPtr提倡简单,高效
- 简单透彻理解JSONP原理及使用
- Java中Pattern和Matcher的理解以及简单使用
- .Net 4.5 的async 和await 的简单理解使用
- 索引 视图 存储过程和函数 简单理解 以及使用创建方法
- 索引 视图 存储过程和函数 简单理解 以及使用创建方法
- 索引 视图 存储过程和函数 简单理解 以及使用创建方法
- 对于CocoaPods的简单理解,实践安装使用过程和常见问题
- 设计模式笔记1 - 简单工厂 和 工厂模式理解以及使用
- 索引 视图 存储过程和函数 简单理解 以及使用创建方法
- 简单直白的去理解AOP,了解Spring AOP,使用 @AspectJ - 读书笔记
- ThreadLocal 理解和简单使用场景
- Android ListView复杂使用方式简单理解
- 使用flume问题总结2——flume event的简单理解