这篇文章是我看了慕课网视频课程--PHP第三方登录--OAuthth2.0协议后写的总结篇,推荐看原版。
在申请使用QQ等第三方登录的时候经常看到这玩意,感觉上是个很高大尚的东西,而且念出来超专业的 Open Authorization,开放式授权协议装逼啊有木有,有木有。
好了回到正题,什么是开放式授权协议,举个下面这个情况,一个网站想让用户使用qq号进行登录,但是有两个方面的原因,1,用户不希望这个网站知道自己的qq帐号和密码,2,该网站无法知道该用户使用的qq帐号和密码是不是正确的。所以这个时候腾讯老大哥就说你们来求我啊,他对用户说你把帐号和密码给我,我来验证你的帐号密码是否是正确的,然后把结果告诉该网站,这样不就行了吗?网站既无法知道用户的帐号和密码又能验证该帐号和密码是否正确,用户也不必担心自己的信息泄漏。但是来求腾讯老大哥的网站太多了,于是腾讯大哥就给每个人发放一个身份证明,以此来区分谁是谁。开放式授权大致解决问题的思路就是这样。
接下来是具体的步骤,但是接下来还是理论上的步骤,具体的实施情况可以到慕课网上搜教程,我1没服务器,2没域名,只能学习理论阶段了。
首先第一步,请求OAuth登录页,下面拿慕课网上实现的QQ第三方登录举例子。
这个时候腾讯就会问了,谁来请求我的登录页啊?所以在请求该登录页的时候就要使用qq提供的专门的SDK(Software Development Kit,软件开发工具),在后台拼接出一个带有网站信息的URl,来发送到腾讯服务器,腾讯服务器就解析该URL,来判断这个网站是否有在我这里领取过身份信息,他的身份信息又是否正确。
发送的URL叫--未授权的令牌请求服务地址,一个一个来解析他的名词,未授权,是因为当你使用该URL地址的时候腾讯服务器是没有任何参与的,他只是被动的接收你的消息,令牌,表明其中是带有你这个网站的个人信息的,请求服务,请求腾讯服务器的服务,地址,主语,前面都是定语。
这个地址中重要的几个点是:
https://graph.qq.com/oauth/...?...
&client_id=XXXXXXXX&...
&redirect_uri=XXXXXXX
这里的 client_id 表明你是谁,也即腾讯发给用户的身份证明--app_id,在QQ互联官网通过审核并且创建应用后就会为该应用分配一个 app_id 和 app_key,就像你的银行卡号和密码一样,来识别你的身份的,redirect_uri 表示将用户的qq号处理结束后将处理结果发送到哪里,下面拿我随便使用thinkphp的url规则编写的一个地址举例。
client_uri=http://www.anyname.com/index.php/Home/Admin/qqadmin
上面的意思就是告诉腾讯服务器后台,将处理结果发送到我的后台的Home模块下的Admin控制器下的qqadmin方法里,然后你再在后台读取返回码,并根据返回码做不同的判断。
如果腾讯判断该用户的帐号和密码正确后,就会按照上面的 redirect_uri 发送处理结果,同时,这个 redirect_uri 也是经过处理的,他的后面也带着参数的,那个参数其中之一就是code,跟在 redirect_uri 后面作为使用 url 传值这样的形式发送到用户后台。用户后台使用 $_GET['code'] 的方式读取这个数据。这个数据有什么用呢?腾讯服务器需要确认一下该网站是否收到了我发送的处理结果,所以在服务器后台接收到这个处理结果后要第一时间再发一条消息给腾讯服务器端,告诉腾讯服务器我收到了你的处理结果了,为什么要第一时间就返回呢?因为这个 code 变量在腾讯服务器的有效期是很短的,就几秒,时间一过就无效,导致用户即使输入正确的信息也无法显示登录正确。
而这个时候使用的URL地址就不是前面的未授权的令牌请求服务地址了,他叫--用户授权的令牌请求服务地址,因为在前面的时候腾讯服务器后台已经验证该网站是有在我这里注册过的,所以是经过授权的,那么这个URL地址是由哪几部分组成的呢?
https://xxx.qq.com/ouath/...?...
&client_id=XXXXXX&.......
&client_secret=XXXXXX&......
&code=XXXXXX
当然这个地址由于没有页面跳转,所以我们是看不到的,一般是交给qq提供给我们的SDK的内部函数去执行的,所以这里我们只能说这个地址大致形式是这样的。
client_id 前面讲过了,等于你的银行卡号,client_secret 就是你的帐号密码了,这次也要一并发过去,还有前面拿到的 code,这之后腾讯服务器就确定了你的身份。允许你使用接下来这个令牌来对该帐号的信息进行一些经过授权的修改,这个令牌就是在前面拿到 code 时跟在 code 后面的别的参数--AccessToken,这个参数的有效期就比前面的 code 长很多了,他也是你后面对这个帐号执行操作的凭证,具体的使用我也不知道了,可以去看QQ提供的API文档,里面有详细介绍。
虽然一直拿QQ举例子,但是具体的 OAuth 2.0协议的大致流程就是这样子了,顺便一提,码字好幸苦。