『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 46220|回复: 140

[智能音箱] 天猫精灵接入HomeAssistant【OAuth访问控制】

  [复制链接]

23

主题

302

帖子

2165

积分

论坛技术达人

积分
2165
金钱
1838
HASS币
110

活跃会员教程狂人

发表于 2018-4-21 12:22:03 | 显示全部楼层 |阅读模式
本帖最后由 cnk700i 于 2018-4-21 12:40 编辑

       最近在研究天猫精灵接入,根据大神的指引天猫精灵接入HomeAssistant【智能家居技能接入,非webhook调用】,也可以顺利控制yeelight。但发现有一个问题,没有实现OAuth访问控制。即天猫精灵服务器使用获取的token来访问gate.php,OAuth服务器应该进行校验,校验通过后才执行来自天猫精灵服务器的请求。
       根据github上oauth2-server-php的文档,应该增加Resource Controller进行校验。

  • // include our OAuth2 Serverobject
  • require_once __DIR__.'/server.php';
  • // Handle a request to a resourceand authenticate the access token
  • if (!$server->verifyResourceRequest(OAuth2\Request::createFromGlobals())) {
  •     $server->getResponse()->send();
  •     die;
  • }
  • echo json_encode(array('success'=> true, 'message'=> 'You accessed myAPIs!'));


       但将代码加到gate.php头部,总是验证不通过,经过分析天猫精灵对接api以及研读OAuth2的代码发现了问题。

       天猫精灵服务器使用POST方式,以JSON格式(CONTENT_TYPE='application/json')传递数据,其中token值在$json->payload->accessToken
       而OAuth服务器处理方式是:
       1、接收保存JSON数据,通过标识符'access_token',即$json->access_token取的token值来判断是否授权
       2、verifyResourceRequest校验过程,判断是POST方式的话,需要CONTENT_TYPE='application/x-www-form-urlencoded',否则判断失败
所以实现Resource Controller的代码调整如下(当然也可以修改oauth2-server-php相关的处理逻辑代码处理):



    游客,如果您要查看本帖隐藏内容请回复
       然后把代码加到gate.php开头的地方吧。
       至此正文结束。

       另外,天猫精灵服务器貌似在token过期后不会自动刷新(虽然api上说是有),自己设置有效期长一点,默认的是3600s。

  • //server.php
  • $server = new OAuth2\Server($storage, array(
  •         'access_lifetime'=>86400  //token有效期,单位s
  •         ));
  • //顺便先把允许刷新token的功能开启了
  • $server->addGrantType(new OAuth2\GrantType\RefreshToken($storage, array(
  •     'always_issue_new_refresh_token' => true
  •     )));

       最后问个问题,PC端调试页面每次都要加载authorize.php,但手机端不用,这是为什么,求大神解答。。。










回复

使用道具 举报

40

主题

3057

帖子

1万

积分

超级版主

Nero

Rank: 8Rank: 8

积分
11135
金钱
8028
HASS币
182
发表于 2018-4-21 13:42:31 | 显示全部楼层
本帖最后由 neroxps 于 2018-4-21 13:46 编辑

感谢大佬提供修复。请问下大佬,这个加入代码和不加代码之间的区别是啥?

不懂php表示看不明白。
Nero
回复

使用道具 举报

26

主题

553

帖子

2726

积分

金牌会员

Rank: 6Rank: 6

积分
2726
金钱
2148
HASS币
100

教程狂人

发表于 2018-4-21 13:50:29 | 显示全部楼层
妙哉妙哉
回复

使用道具 举报

23

主题

302

帖子

2165

积分

论坛技术达人

积分
2165
金钱
1838
HASS币
110

活跃会员教程狂人

 楼主| 发表于 2018-4-21 14:53:10 来自手机 | 显示全部楼层
neroxps 发表于 2018-4-21 13:42
感谢大佬提供修复。请问下大佬,这个加入代码和不加代码之间的区别是啥?

不懂php表示看不明白。

完整的对接流程是天猫精灵取得授权code(authorize.php),使用code获取token(token.php),最后用token通过认证然后控制设备(gate.php)。不加控制代码就是不根据token做认证,对外部的请求全部放行,先前获取token就是走个流程。
天猫精灵官网有对接流程介绍的。
回复

使用道具 举报

0

主题

7

帖子

32

积分

新手上路

Rank: 1

积分
32
金钱
25
HASS币
0
发表于 2018-4-21 17:14:25 | 显示全部楼层
token 返回不正确
回复

使用道具 举报

23

主题

302

帖子

2165

积分

论坛技术达人

积分
2165
金钱
1838
HASS币
110

活跃会员教程狂人

 楼主| 发表于 2018-4-21 17:36:07 来自手机 | 显示全部楼层
a3163599 发表于 2018-4-21 17:14
token 返回不正确

啊?不加代码正常吗,代码只是根据请求的token进行验证的,不会返回token的。
回复

使用道具 举报

0

主题

221

帖子

1095

积分

论坛积极会员

积分
1095
金钱
874
HASS币
0
发表于 2018-4-21 19:13:00 | 显示全部楼层
看看好资料 借鉴一下
回复

使用道具 举报

74

主题

1942

帖子

7885

积分

元老级技术达人

积分
7885
金钱
5893
HASS币
430

活跃会员教程狂人

发表于 2018-4-21 19:21:27 | 显示全部楼层
好帖顶一个,看来必须得部署一下SSL了,谢谢分享,虽然看不懂
所有过往,皆为序章。
回复

使用道具 举报

0

主题

3

帖子

22

积分

新手上路

Rank: 1

积分
22
金钱
19
HASS币
0
发表于 2018-4-21 21:02:22 | 显示全部楼层
看看大神
回复

使用道具 举报

23

主题

302

帖子

2165

积分

论坛技术达人

积分
2165
金钱
1838
HASS币
110

活跃会员教程狂人

 楼主| 发表于 2018-4-21 21:38:05 | 显示全部楼层

大神当不起,也是新手上路,各种折腾
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-4-25 00:28 , Processed in 3.218337 second(s), 38 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表