OAuth认证过程

2024-06-19 03:18
文章标签 认证 过程 oauth

本文主要是介绍OAuth认证过程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转载:

http://blog.unvs.cn/archives/oauth-qq1.0-developer.html


本想前段时间就把自己通过QQ OAuth1.0、OAuth2.0协议进行验证而实现QQ登录的心得及Demo实例分享给大家,可一直很忙,今天抽点时间说下OAuth1.0协议原理,及讲解下QQ对于Oauth1.0的认证开发。闲话多说了点,下面直接进入主题。

1、OAuth的简述

OAuth(Open Authorization,开放授权)是为用户资源的授权定义了一个安全、开放及简单的标准,第三方无需知道用户的账号及密码,就可获取到用户的授权信息,并且这是安全的。(我喜欢简单明了,这里没看懂,没关系,接着往下面看)

2、OAuth的原理

oauth_developer_1

(流程图)

我在图上分了四个步骤,下面是四步的讲解:

第一步:用户访问第三方网站,比如:就是你需要使用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幻灯片的一页,直接截图下来进行讲解:

oauth_developer_2

第一步:网站向认证平台请求一个未授权的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_timestampunix时间戳(从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。
timestampopenid的时间戳
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_timestampunix时间戳(从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_secretaccess_token的密钥
openid在第一步和本步骤中都返回了openid。使用本步骤返回的openid,更为安全
timestampopenid的时间戳
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_timestampunix时间戳(从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幻灯片分享给大家),这里就直接截图下来进行讲解:

oauth2.0_developer_pic3

第一步:首先直接跳转至用户授权地址,即图示 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认证流程就是这样,相信通过图示及讲解都能明白,若有不明白之处请留言)

最后,分享自己关于OAuth1.0、2.0认证流程讲解的幻灯片,结合文章来看,你会更容易理解。

课件分享:点击下载

这篇关于OAuth认证过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1073861

相关文章

JAVA SpringBoot集成Jasypt进行加密、解密的详细过程

《JAVASpringBoot集成Jasypt进行加密、解密的详细过程》文章详细介绍了如何在SpringBoot项目中集成Jasypt进行加密和解密,包括Jasypt简介、如何添加依赖、配置加密密钥... 目录Java (SpringBoot) 集成 Jasypt 进行加密、解密 - 详细教程一、Jasyp

Java通过ServerSocket与Socket实现通信过程

《Java通过ServerSocket与Socket实现通信过程》本文介绍了Java中的ServerSocket和Socket类,详细讲解了它们的构造方法和使用场景,并通过一个简单的通信示例展示了如何... 目录1 ServerSocket2 Socket3 服务器端4 客户端5 运行结果6 设置超时总结1

MongoDB搭建过程及单机版部署方法

《MongoDB搭建过程及单机版部署方法》MongoDB是一个灵活、高性能的NoSQL数据库,特别适合快速开发和大规模分布式系统,本文给大家介绍MongoDB搭建过程及单机版部署方法,感兴趣的朋友跟随... 目录前言1️⃣ 核心特点1、文档存储2、无模式(Schema-less)3、高性能4、水平扩展(Sh

MySQL中存储过程(procedure)的使用及说明

《MySQL中存储过程(procedure)的使用及说明》存储过程是预先定义的SQL语句集合,可在数据库中重复调用,它们提供事务性、高效性和安全性,MySQL和Java中均可创建和调用存储过程,示例展... 目录概念示例1示例2总结概念存储过程:在数据库中预先定义好一组SQL语句,可以被程序反复调用。

MySQL存储过程实践(in、out、inout)

《MySQL存储过程实践(in、out、inout)》文章介绍了数据库中的存储过程,包括其定义、优缺点、性能调校与撰写,以及创建和调用方法,还详细说明了存储过程的参数类型,包括IN、OUT和INOUT... 目录简述存储过程存储过程的优缺点优点缺点存储过程的创建和调用mysql 存储过程中的关键语法案例存储

Redis中Hash从使用过程到原理说明

《Redis中Hash从使用过程到原理说明》RedisHash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化... 目录一、开篇:Hash就像超市的货架二、Hash的基本使用1. 常用命令示例2. Java操作示例三

Redis中Set结构使用过程与原理说明

《Redis中Set结构使用过程与原理说明》本文解析了RedisSet数据结构,涵盖其基本操作(如添加、查找)、集合运算(交并差)、底层实现(intset与hashtable自动切换机制)、典型应用场... 目录开篇:从购物车到Redis Set一、Redis Set的基本操作1.1 编程常用命令1.2 集

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

k8s中实现mysql主备过程详解

《k8s中实现mysql主备过程详解》文章讲解了在K8s中使用StatefulSet部署MySQL主备架构,包含NFS安装、storageClass配置、MySQL部署及同步检查步骤,确保主备数据一致... 目录一、k8s中实现mysql主备1.1 环境信息1.2 部署nfs-provisioner1.2.

springboot依靠security实现digest认证的实践

《springboot依靠security实现digest认证的实践》HTTP摘要认证通过加密参数(如nonce、response)验证身份,避免明文传输,但存在密码存储风险,相比基本认证更安全,却因... 目录概述参数Demopom.XML依赖Digest1Application.JavaMyPasswo