本帖最后由 mobster 于 2018-9-16 22:37 编辑
版本支持说明:目前全系支持HA的0.76~0.77.3版本
HA升级到0.76版本后,强制开启了新的认证授权方式
auth_providers:
- type: homeassistant
# uncomment this to enable backwards compatible API password support
# - type: legacy_api_password
其中,type: legacy_api_password为兼容旧的password授权模式,无论开不开启,反正新的基于oAuth2.0的认证方式(token)是到来了,而且基于官方的说法,兼容模式在未来的版本中会逐渐关闭。那么以前大量基于password来做认证的REST API接口需要全部重新修改了
在官方还未提供永久授权key来做认证,只有oAuth2.0的模式下,用REST API来做HA的交互是一件非常麻烦的事情:
- 需要通过某网站做token申请,跳转到HA的登录页
- HA的登录页回调申请授权的网页,并获得code
- 根据code和申请网站,去申请得到access_token,也就是最终的token
- 基于token,访问REST API接口
...
官方的auth认证说明:https://developers.home-assistant.io/docs/en/auth_api.html
之前我有好几个自动化任务,利用tasker和IFTTT的http方式(webhooks),和HA做交互抓取数据和上传数据(还包括用gpslogger上传gps位置),认证方式的改变使得这些自动化工具,只能利用兼容模式的开启,还能存活一段时间,因此利用自建认证服务端来搞定新的oAuth2.0授权的想法就出来了,随即花了一晚上时间用php写了一套认证规则,顺利拿到token,后来想想还是麻烦,需要两次调用,先调用认证服务器拿token,再基于token调用rest API,在tasker上处理还好,在gpslogger和IFTTT上基本也很难处理这种需要变量交互式的做法,最后干脆直接让php的认证服务直接帮着调用API接口直接把数据返回回来岂不妙哉,于是这套基于php的认证服务器变成了api操作中转服务器
期间为了考虑安全问题(访问自建服务器后能拿到token,理论上风险不小,URL的暴漏意味着token的暴漏),在php上再定义一套key,相当于以前的password模式,再加上https防嗅探的模式,安全上基本也有保障了
使用方法
-
安装配置任意php环境,且所在目录拥有写入权限
-
拷贝index.php文件至任意可访问目录(不建议修改文件名),且目录允许php写入文件(用于refresh_token的保存(加密存储))
-
编辑index.php文件,修改最上方“$webSite=”的值,改为HomeAssistant的刚问路径(支持http/https),如“https://home.xxxx.com:8123” 。key值可改可不改,为安全起见建议key值做配置(可任意定义)
-
【登录,网关服务端建立token】浏览器访问index.php文件,界面会自动跳转到HomeAssistant登录页,登录后php路径下会写入一个数据文件(文件名为10位的字母+数字),标识token获取成功
-
【获取token】浏览器访问index.php文件,使用get/post方式传值state=clientrequesttoken,如“ https://home.xxxx.com/index.php?state=clientrequest&key=123 ” ,浏览器输出json格式字符串的access_token值表示token获取成功。(如果之前的步骤配置了key值,这里访问http时需要携带key值的传参)
-
【调用RestAPI】浏览器访问index.php文件,使用get/post方式传值state=clientrequestapi,并同时携带requestapi参数,如“https://home.xxxx.com/index.php?state=clientrequestapi&key=123&requestapi=/api/config ”,正常情况下浏览器会返回json格式的字符串(同访问HomeAssistant时{https://home.xxxx.com:8123/api/config }返回的结果相同),相当于绕开auth认证替代了直接访问HomeAssistant完成REST API请求的过程
- index.php的请求参数说明(get/post均可):
state(必填) : clientrequesttoken 或 clientrequestapi
key(选填) : (配合二次认证使用)
realtoken(配合state = clientrequesttoken 时使用):值为1时,返回真实的可直接使用的token(格式:token_type+' '+access_token);值为空时,返回HomeAssistant提供的token原形json字符串
requestapi(配合state = clientrequestapi 时使用):调用HomeAssistant的REST API时,URL地址栏的路径+完整参数(get方式),如“api/config”、“api/states/device_tracker.xxxxx”
下载地址
个人认为HomeAssistant未来会在oAuth2.0的基础上增加永久key授权的功能,来便于REST API的访问,否则这个基本太难解了。。
欢迎各路大神来继续技术探讨此话题
|