oAuth 使得第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权
OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH是安全的。oAuth是Open Authorization的简写。
http://baike.baidu.com/link?url=dbhAbTjRKhqT4FCMbbnYvLamqZ4slI4HucF2QuP2-OHpbsQVyAwYXDZHrFfFW5jbBeTq5hr3YRAUnjXpvh86ya
http://blog.jobbole.com/49211/
OAuth的机制原理讲解及开发流程
OAuth的原理
(流程图)
我在图上分了四个步骤,下面是四步的讲解:
第一步:用户访问第三方网站,比如:就是你需要使用QQ进行登录的网站;
第二步:你点击QQ登录后,第三方网站将会连接并进行请求,比如:你点击登录后,第三方网站会跳转到QQ平台,提示你进行登录;
第三步:你要进行授权第三方网站对你的信息访问的一个权限,比如:当你QQ登录成功后,QQ会提示你,是否授权第三方Web访问你的用户基本信息或其他的资源信息,这时你点击授权即可;
第四步:授权后,第三方Web即可访问你刚才授权的资源信息,比如:你的QQ基本信息-头像、昵称、性别等。
通过这个原理图示及讲解(图是手工制作,有点草),相信大家都了解了OAuth这个原理的一个基本流程,若看不明白,你可以不用学习制作OAuth了,开个玩笑。(这步后,大家知道什么原理了,但还是无法知道OAuth究竟是如何实现认证的,别急,接着往下看)
3、OAuth 1.0的认证流程
这里直接讲解OAuth 1.0协议的认证机制(OAuth 2.0会在下一节中讲述),虽然现在很多平台都是遵循OAuth 2.0,但还是有开放OAuth 1.0平台的,比如:新浪微博、QQ1.0平台等。
在OAuth 1.0认证中会用到三个重要的Url:
第一个:Request Token Url,获取未授权的Token的Url;
第二个:User Authorization Url,请求用户对Token进行授权的Url;
第三个:Request Access Url,使用Token获取Access Token的Url。
上面是认证流程中用到的三个Url,在下面的流程示意图中会体现到,这是我讲解OAuth幻灯片的一页,直接截图下来进行讲解:
第一步:网站向认证平台请求一个未授权的Token,这个Request Token Url是前面说的第一个Url;
第二步:跳转至用户授权页面,提示用户进行登录,并进行授权,返回获得已授权的Token,用到的User Authorization Url是前面说的第二个Url;
第三步:通过已授权的Token,向认证平台请求Access Token(数据令牌),用到的Request Access Url是前面说的第三个Url,返回后到这步整个认证流程就结束了,最后一步,是通过数据令牌等参数,调用接口获取用户信息,不完全算认证的流程。(我喜欢简洁明了,认证流程就是这样,相信通过图示及讲解都能明白,若有不明白之处请留言)
4、QQ OAuth1.0认证中Url的调用及参数的传递
前面讲了OAuth1.0的机制原理及认证流程,这篇文章着重讲解QQ OAuth1.0认证中Url的调用、各参数的传递、注意事项。而因为现在QQ开发平台上,已经很少能找到OAuth1.0认证的说明开发文档了,采用新的2.0认证模式,所以简单讲述Url请求与返回参数的传递,并没有很详细深入地讲解,有什么问题大家可留言给我。
4.1、请求未授权的临时Token
新建一个页面为QQLogin.aspx,用来请求临时Token及跳转到用户授权页。下面是相关Url及参数介绍:
Request Token Url(请求临时Token的Url):http://openapi.qzone.qq.com/oauth/qzoneoauth_request_token
请求后,跳转至引导用户登录的Url:http://openapi.qzone.qq.com/oauth/qzoneoauth_authorize
第一个Url请求参数包含如下内容:(红色为必填、绿色为选填)
参数 | 含义 |
---|---|
oauth_consumer_key | 申请QQ登录成功后,分配给网站的appid |
oauth_nonce | 随机字符串,所有oauth_nonce请使用int型值。 |
oauth_timestamp | unix时间戳(从UTC时间1970年1月1日00:00:00到当前时刻的秒数,不同语言中如何获取请google/baidu之)。 注意第三方服务器时间与腾讯服务器时间相差不能超过5分钟。 |
oauth_version | 版本号,请固定使用1.0 |
oauth_signature_method | 签名方法,请固定使用HMAC-SHA1。 |
oauth_signature | 签名值,用来提高传输过程参数的防篡改性。 签名值的生成详见【QQ登录】签名参数oauth_signature的说明 |
oauth_client_ip | 用户的IP地址(可选),int型 |
返回的参数有:oauth_token(临时令牌)、oauth_token_secret(临时密钥对应的令牌)
第二个Url需要传递的参数为:
参数 | 含义 |
---|---|
oauth_consumer_key | 分配给网站的appid。 |
oauth_token | 上一步中,得到的oauth_token |
oauth_callback | 回调地址,即登录并授权后返回到你网站上的地址。 |
返回的参数有:
参数 | 含义 |
---|---|
oauth_token | 已授权的token |
openid | 与APP通信的用户key,它和QQ号码一一对应,访问OpenAPI时必需。 同一个QQ号码在不同的应用中有不同的OpenID。 |
oauth_signature | 签名值。如果网站使用这一步返回的openid,则需要按规则生成签名值,并与该签名值比对,以验证openid以及来源的可靠性。 比对时生成签名值的规则:使用HMAC-SHA1算法,源串:openid+openid的timestamp(串中间不要添加’+’符号);密钥:oauth_consumer_secret。 |
timestamp | openid的时间戳 |
oauth_vericode | 授权验证码。 |
4.2、请求Access Token数据令牌
上一步中,我们写了一个回调地址,并顺利得到一些参数,下面就是拿这些参数来进行下一步操作,首先,得到数据令牌(只有拿到数据令牌才可以调用接口获取用户信息)。
Request Access Url(获取Access Token请求Url):http://openapi.qzone.qq.com/oauth/qzoneoauth_access_token
Url请求参数包含如下内容:
参数 | 含义 |
---|---|
oauth_consumer_key | 分配给网站的appid |
oauth_token | 已授权的的token,上一步返回的oauth_token |
oauth_nonce | 随机数 |
oauth_timestamp | unix时间戳(从UTC时间1970年1月1日00:00:00到当前时刻的秒数,不同语言中如何获取请google/baidu之) |
oauth_version | 版本号,请固定使用1.0 |
oauth_signature_method | 签名方法,请固定使用HMAC-SHA1 |
oauth_signature | 签名值,用来提高传输过程参数的防篡改性。 签名值的生成详见【QQ登录】签名参数oauth_signature的说明 |
oauth_vericode | 授权验证码,上一步返回的oauth_vericode |
oauth_client_ip | 用户的IP地址(可选),int型 |
返回的参数如下:
参数 | 含义 |
---|---|
oauth_token | 具有访问权限的access_token |
oauth_token_secret | access_token的密钥 |
openid | 在第一步和本步骤中都返回了openid。使用本步骤返回的openid,更为安全 |
timestamp | openid的时间戳 |
oauth_signature | 针对openid的签名值 |
4.3、通过Access token(数据令牌)调用API接口,获取用户授权资源
请求Url:http://openapi.qzone.qq.com/user/get_user_info (这里默认写的是get_user_info接口) 请求参数:
参数 | 含义 |
---|---|
oauth_consumer_key | 分配给网站的appid |
oauth_token | 上一步返回的oauth_token |
oauth_nonce | 随机数,int型 |
oauth_timestamp | unix时间戳(从UTC时间1970年1月1日00:00:00到当前时刻的秒数,不同语言中如何获取请google/baidu之)。 |
oauth_version | 版本号,固定使用1.0 |
oauth_signature_method | 签名方法,固定使用HMAC-SHA1 |
oauth_signature | 签名值,用来提高传输过程参数的防篡改性。 签名值的生成详见【QQ登录】签名参数oauth_signature的说明 |
openid | 上一步返回的openid。 |
oauth_client_ip | 用户的IP地址(可选),int型 |
好了,上面就是整个QQ OAuth1.0认证流程中Url参数的请求与返回说明,这OAuth1.0认证中,你会发现参数特别多,还有经过HMAC-SHA1加密、签名等操作,特别麻烦、繁琐,所以还是最好推荐使用OAuth 2.0认证协议进行接口开发。
下面这篇文章是QQ登录制作过程中,公共返回码说明(包含1.0、2.0),供大家参考,看是哪个阶段出错,然后对症下药,特别是参数的请求、传递是否正确,还有一个参数顺序、签名是否正确,这四点弄好,相信这个东西自然就实现了。
OAuth_QQ登录_公共返回码说明:点击进入。
最后将自己开发制作的OAuth 1.0源代码分享给大家,代码分享:点击下载。
5、OAuth2.0的认证流程
在OAuth2.0的处理流程,主要分为以下四个步骤:
1)得到授权码code
2)获取access token
3)通过access token,获取OpenID
4)通过access token及OpenID调用API,获取用户授权信息
上面是流程的大概四个步骤,在下面的流程示意图中会得到体现,这是我制作的一个幻灯片的流程图(文章最后会附上制作的OAuth幻灯片分享给大家),这里就直接截图下来进行讲解:
第一步:首先直接跳转至用户授权地址,即图示 Request User Url ,提示用户进行登录,并给予相关资源授权,得到唯一的Auth code,这里注意的是code只有10分钟的有效期,对于安全考虑,相对于OAuth 1.0省了一步获取临时的Token,并且有效期也进行了控制,比1.0认证简化了很多,并安全一些;
第二步:得到授权code后,这一步就是请求access token,通过 图示 Request access url ,生成得到数据Token;
第三步:通过Access Token请求OpenID,OpenID是用户在此平台的唯一标识,通过图示 Request info url 请求,然后得到OpenID;
第四步:通过第二步得到的数据Token、第三步得到的OpenID及相关API,进行请求,获取用户授权资源信息。(我喜欢简洁明了,OAuth2.0认证流程就是这样,相信通过图示及讲解都能明白,若有不明白之处请留言)
oAuth 使得第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权的更多相关文章
- PHP中Cookie的使用---添加/更新/删除/获取Cookie 及 自动填写该用户的用户名和密码和判断是否第一次登陆
PHP中Cookie的使用---添加/更新/删除/获取Cookie 及 自动填写该用户的用户名和密码和判断是否第一次登陆 什么是cookie 服务器在客户端保存用户的信息,比如登录名,密码等 这些数 ...
- 要求用户输入用户名和密码,只要不是admin、888888就
要求用户输入用户名和密码,只要不是admin.888888就一直提示用户名或密码错误,请重新输入 Console.WriteLine("输入账号和密码"); string a = ...
- Linux的用户切换、修改用户的用户名和密码
一.用户切换 "$":普通用户提示符 "#":root用户提示符 1.普通用户到root: 方式一:命令:su然后输入root密码 此种方式只是切换了root ...
- Jquery实现检测用户输入用户名和密码不能为空
要求 1.用户名和密码为空点击登录时提示相应的提示 2.获取用户名输入框时,错误提示清除 思路 1.创建1个input-text标签和1个input-password标签,1个input-botton ...
- 实战:Nginx如何让用户通过用户名和密码认证访问WEB站点
有时我们会有这么一种需求,就是你的网站并不想提供一个公共的访问或者某些页面不希望公开,我们希望的是某些特定的客户端可以访问.那么我们可以在访问时要求进行身份认证,就如给你自己的家门加一把锁,以拒绝那些 ...
- 在主函数中提示用户输入用户名和密码。另写一方法来判断用户输入是否正确。该方法分别返回一个bool类型的登录结果和和一个string类型的登录信息。如登录成功,返回true及“登录成功”,若登录失败则返回false及“用户名错误”或“密码错误”(使用out参数)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 服务器http://localhost:8080要求用户输入用户名和密码
我们在将web项目部署运行的时候,想要在浏览器上输入http://localhost:8080时却提示: 如果你的电脑安装过Oracle的话,可能是和Oracle 的端口一样了,这是可以有两个办法解决 ...
- Android——用户登陆及用户名和密码的保存
Android——用户登陆及用户名和密码的保存 在之前的学习过程中已经将Android学习完了,但是在后面将近一年的时间里都没有进行过Android开发,所以对Android的所有的知识点又有点忘 ...
- Tomcat8.0.21登录时忘记用户名和密码
大概是这学期开学没多久吧,4月份的时候,为了学习javaEE,装了Tomcat.过了这么久早就忘记用户名和密码了,所以无法进入Tomcat的管理界面.百度(其实我也很想用google)了一堆,几乎都是 ...
随机推荐
- django model Foreign key usage 关系型数据库 ORM
django 的模型 from django.db import models""" A model pair to map car and its manufactur ...
- Linux系统 nfs 共享及 挂载mount 配置
要把 A服务器(192.168.1.1)的 /home 目录挂载到 B服务器(192.168.1.2)的/mnt目录 我们先在 A 服务器上编辑/etc/exports 文件, 添加下面这行代码 /h ...
- Android Device Chooser中显示Target unknown解决方法
手机插在电脑上准备调试程序来着,通过eclipse运行时,弹出的Android Device Chooser中显示设备名是?????,Target未知,无法继续运行. 可以通过以下步骤解决(Ubunt ...
- HTTPCLIENT抓取网页内容
通过httpclient抓取网页信息. public class SnippetHtml{ /** * 通过url获取网站html * @param url 网站url */ public Strin ...
- MP4视频编码器
用 HTML5 播放视频,最流行的视频格式非 MP4莫属, 所有最新浏览器都支持; MP4 带有 H.264 视频编码和 AAC 音频编码的 MPEG 4 文件: 以前做过一个把其它编码格式的视频转成 ...
- CentOS在线升级内核
升级内核需要使用 elrepo 的yum 源首先我们导入 elrepo 的key rpm –import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org ...
- 清楚float浮动的四种方法
1.对父级设置适合CSS高度 对父级设置适合高度样式清除浮动,这里对“.divcss5”设置一定高度即可,一般设置高度需要能确定内容高度才能设置. 2.clear:both清除浮动 为了统一样式,我们 ...
- Python3 操作Excel--openpyxl
操作Excel文件建议使用openpyxl 兼容office2016 打开excel文件,获取工作表 import openpyxl wb=openpyxl.load_workbook('ttt.xl ...
- c#注释
c#的注释分为:这里不能不说一下什么是注释. 注释本身不会执行,只是说明性文字,只供程序员阅读. 注释又分为:单行注释,多行注释,文档注释. 单行注释://开始 多行注释:/*开始, */结束. 文档 ...
- Spark Wordcount
1.Wordcount.scala(本地模式) package com.Mars.spark import org.apache.spark.{SparkConf, SparkContext} /** ...