zoukankan      html  css  js  c++  java
  • OAuth的机制原理讲解及开发流程

    原文地址:http://kb.cnblogs.com/page/189153/

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

      1、OAuth的简述

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

      2、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认证流程就是这样,相信通过图示及讲解都能明白,若有不明白之处请留言)

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

      课件分享:点击下载 (麻烦保留博主信息,谢谢)

  • 相关阅读:
    springboot文件上传: 单个文件上传 和 多个文件上传
    Eclipse:很不错的插件-devStyle,将你的eclipse变成idea风格
    springboot项目搭建:结构和入门程序
    POJ 3169 Layout 差分约束系统
    POJ 3723 Conscription 最小生成树
    POJ 3255 Roadblocks 次短路
    UVA 11367 Full Tank? 最短路
    UVA 10269 Adventure of Super Mario 最短路
    UVA 10603 Fill 最短路
    POJ 2431 Expedition 优先队列
  • 原文地址:https://www.cnblogs.com/AloneSword/p/3347023.html
Copyright © 2011-2022 走看看