我是靠谱客的博主 细腻篮球,最近开发中收集的这篇文章主要介绍天猫精灵OAUTH2的authorize无法认证,认证参数不全,token错误的排查写在前面调试的方法错误排查调试成功的authorize.php源代码,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

  • 写在前面
    • 感想与目的
  • 调试的方法
    • 使用天猫精灵开发平台提供的在线测试工具
    • 手动输入链接与GET信息
  • 错误排查
    • authorize.php不发生跳转,直接显示错误码
    • 链接发生了跳转,但是提示认证参数不全
      • 第一种情况
      • 第二种情况
    • 链接发生了跳转,但是提示Oauth token 返回不正确
  • 调试成功的authorize.php源代码

写在前面

鉴于挺多人想要完整的工程代码的 现已上传:https://download.csdn.net/download/wmdscjhdpy/11127776

感想与目的

近期想实现一个用天猫精灵来控制ESP8266等设备的功能,本来以为就是一个简单的局域网通信,就像一句“儿子,给爸爸打开xxx”这样的命令就可以了,结果发现,事情并没有想的那么简单。。。
实际上的情况是
“因为我的儿子ESP8266不是天猫精灵认证的儿子而是我的儿子
所以天猫精灵想控制我的儿子就得先从我这获得我的授权
然后再拿着我的授权去换取我对我儿子的控制权
然后再拿着这个控制权把对我儿子的控制指令转达给我
我确认天猫精灵的控制权无误后再控制我的儿子”
想必各位了解OAUTH2的朋友们都知道这是什么忧伤的过程了。。。
本文主要记录了OAUTH2在authorize认证过程中所遇到的问题,尚未涉及token和资源访问。
因为平时做的基本上都是比较贴近硬件开发,这是第一次接触关于web的较为实际的项目,个人总结的经验有很多不足,欢迎大神指出。
主要参考文档:
跟着小狂玩天猫精灵智能设备对接–服务器篇(二)

调试的方法

使用天猫精灵开发平台提供的在线测试工具

使用开发平台里面的测试验证里的真机测试,开启测试后会有真实的授权页面与制定的页面进行通信,并可以校验返回数据是否正常。
在线测试

手动输入链接与GET信息

因为数据传入参数是GET请求,参数都直接在链接地址上,所以可以直接生造链接传入测试服务器来查看效果。当然也可以利用上面的真机测试,在提供的页面中用浏览器点击右键->查看框架源代码,就可以得到天猫精灵服务器的标准GET请求链接地址,可以复制下来作为调试测试。

错误排查

authorize.php不发生跳转,直接显示错误码

在这里插入图片描述
在这种情况下,直接查看错误类型的信息进行排查即可。比如此信息提示的就是redirect_uri_mismatch ,就是重定向链接与认证服务器数据库中的链接不匹配而产生的错误。
这个错误是我当时遇到的第一个坑。因为网上的教程各说纷纭,我在学习的时候也是到处借鉴别人的路子。我当时在添加认证服务器数据库的条目的时候,redirect_uri一项填的是https://open.bot.tmall.com/oauth/callback,而天猫精灵服务器的GET请求中包含的redirect_uri则是类似于https://open.bot.tmall.com/oauth/callback?skillId=xxxxx&token=xxxxxxxxxxxxxxxx这样带技能id和token参数的链接,而在authorize.php中的$server->validateAuthorizeRequest($request, $response)验证函数中,这两个地址是不相等的,因此会导致验证失败。
因此对于这个问题,有两个解决方法:

  1. 将传入的链接临时裁剪成https://open.bot.tmall.com/oauth/callback的形式,如:
$m = $request->query['redirect_uri'];//获得重定向链接
$temp = substr($m,0,strpos($m,"?"));//去掉?后面的参数的回调链接,以便和数据库内的回调链接校对
$request->query['redirect_uri']=$temp;//重新赋值重定向uri

这样后重定向url就可以通过数据库的验证了,这也是我在网上找到的解决方法,不过这种解决方法在后面还会导致其他问题,故在此不推荐。
2. 修改数据库的链接为https://open.bot.tmall.com/oauth/callback?skillId=xxxxx&token=xxxxxxxxxxxxxxxx,这样重定向的url也可以通过验证,不过这个token会不会变化目前还不得而知,目前还在查资料中。我目前是以这种方法通过了验证。

链接发生了跳转,但是提示认证参数不全

在这种情况下,页面会提示3秒后自动返回xxx(设备列表或主页)。
这种情况有两种可能,一种情况是卡在了$server->validateAuthorizeRequest($request, $response)函数,还有一种可能是返回参数真的不全。

第一种情况

出现第一种情况的原因是重定向链接正常,但是其他某些信息和数据库不匹配,因此能够跳转链接,但是本质上还是验证失败。在出现该页面时,在3秒后跳转前在浏览器点击右键->查看网页源代码,可以查看重定向链接后面带的参数。如果后面带的参数是error_code的话,那就是说明依然是validateAuthorizeRequest验证失败。具体信息可以查看error_code后面所带的信息。实在得吐槽一下这个错误信息返回的地方也太隐蔽了。。。 我所遇到的情况是数据库中的grant_types没有赋值,导致认证失败。当时这个没有赋值也是因为跟着网上的某个教程做的,结果到自己手上我也不知道咋的就翻车了。找到这个问题之后,那解决方法就好说了。天猫精灵的OAUTH2认证方式是authorization_code 认证的,因此在数据库中UPDATE grant_types参数值为authorization_code即可。

第二种情况

返回的参数包括天猫精灵自己带的参数skillId,token。然后需要认证服务器返回的code和state(我就忘了这个)。具体漏了什么参数同样可以用查看网页源代码的链接地址中少了什么,在解析中直接添加即可。
另外需要注意的是,如果你和我一样漏了state参数,说明你应该也是手动拼凑重定向链接地址的(如header("Location: ".$return)这样的手动回调形式)。如果你的validateAuthorizeRequest验证函数是通过的话,使用OAUTH2中的$response->send();即可自动打包好code和state自动重定向,比手动拼接要来的简单的多。

链接发生了跳转,但是提示Oauth token 返回不正确

返回不正确
这个问题的话由于自己能力所限,仅仅能知道如何解决了。。
解决的方法就是尽量使用OAUTH库中的$response->send();函数来重定向,而不是自己裁剪编码链接再通过header的方式去重定向。当然也有可能是我自己的手动裁剪出现了问题,在此贴出我的代码以互相交流:

  $code = substr($response->getHttpHeader('Location'), strpos($response->getHttpHeader('Location'), 'code=')+5, 40);
  $return = $m."&code=".$code."&state=".$_GET['state'];//拼接回调地址,$m是redirect_url参数
  header("Location: ".$return);//发送http报头

调试成功的authorize.php源代码

经过上面的各种坑爹问题,现在authorize也算是认证成功了,附上源代码:

<?php
/*		@brief OAUTH2认证代码
  *		@author WMD
  */
//该文件用于初次访问时服务器给予客户端认证code以便其获取token
// include our OAuth2 Server object
require_once __DIR__.'/auth_tmailIOT.php';


if (!$server->validateAuthorizeRequest($request, $response)) {//OAUTH2库的数据库验证
  $response->send();//发送错误信息(可能会跳转)
  die;
}
// display an authorization form
if (empty($_POST)) {
exit('
<form method="post">
<label>您打算授权给我测试吗?</label><br />
<input type="submit" name="authorized" value="yes">
<input type="submit" name="unauthorized" value="no">
</form>');
}

// print the authorization code if the user has authorized your client
$is_authorized = ($_POST['authorized'] === 'yes');
if(!$is_authorized)die;
$server->handleAuthorizeRequest($request, $response, $is_authorized);
if ($is_authorized) {
$response->send();//发送重定向跳转指令
}
die;

最后

以上就是细腻篮球为你收集整理的天猫精灵OAUTH2的authorize无法认证,认证参数不全,token错误的排查写在前面调试的方法错误排查调试成功的authorize.php源代码的全部内容,希望文章能够帮你解决天猫精灵OAUTH2的authorize无法认证,认证参数不全,token错误的排查写在前面调试的方法错误排查调试成功的authorize.php源代码所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部