|
本帖最后由 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,但手机端不用,这是为什么,求大神解答。。。
|
|