找回密码
 立即注册

微信扫码登录

搜索
查看: 58090|回复: 159

[技术探讨] HA升级到0.76后全面采用oAuth2认证,自建认证网关解决API访问

 火... [复制链接]

8

主题

89

回帖

851

积分

论坛技术达人

积分
851
金钱
749
HASS币
30
发表于 2018-8-23 19:55:26 | 显示全部楼层 |阅读模式
本帖最后由 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的交互是一件非常麻烦的事情:

  1. 需要通过某网站做token申请,跳转到HA的登录页
  2. HA的登录页回调申请授权的网页,并获得code
  3. 根据code和申请网站,去申请得到access_token,也就是最终的token
  4. 基于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防嗅探的模式,安全上基本也有保障了

使用方法

  1. 安装配置任意php环境,且所在目录拥有写入权限

  2. 拷贝index.php文件至任意可访问目录(不建议修改文件名),且目录允许php写入文件(用于refresh_token的保存(加密存储))

  3. 编辑index.php文件,修改最上方“$webSite=”的值,改为HomeAssistant的刚问路径(支持http/https),如“https://home.xxxx.com:8123” 。key值可改可不改,为安全起见建议key值做配置(可任意定义)

  4. 【登录,网关服务端建立token】浏览器访问index.php文件,界面会自动跳转到HomeAssistant登录页,登录后php路径下会写入一个数据文件(文件名为10位的字母+数字),标识token获取成功

  5. 【获取token】浏览器访问index.php文件,使用get/post方式传值state=clientrequesttoken,如“ https://home.xxxx.com/index.php?state=clientrequest&key=123 ” ,浏览器输出json格式字符串的access_token值表示token获取成功。(如果之前的步骤配置了key值,这里访问http时需要携带key值的传参)

  6. 【调用RestAPI】浏览器访问index.php文件,使用get/post方式传值state=clientrequestapi,并同时携带requestapi参数,如“https://home.xxxx.com/index.php? ... uestapi=/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的访问,否则这个基本太难解了。。

欢迎各路大神来继续技术探讨此话题








评分

参与人数 3金钱 +60 收起 理由
neroxps + 20 膜拜大神!
Milo + 20 膜拜大神!
Mirukuteii + 20 膜拜大神!

查看全部评分

回复

使用道具 举报

8

主题

89

回帖

851

积分

论坛技术达人

积分
851
金钱
749
HASS币
30
 楼主| 发表于 2018-8-23 23:11:21 | 显示全部楼层
说明有的些乱,重新编辑了几下
回复

使用道具 举报

8

主题

89

回帖

851

积分

论坛技术达人

积分
851
金钱
749
HASS币
30
 楼主| 发表于 2018-8-27 15:16:05 | 显示全部楼层
狮心哥哥 发表于 2018-8-27 14:21
我们在盖墙,你在这教大家挖洞,服了。

想要永久Access Token,基本功能都在了,分分钟解决,只是界面还没 ...

我承认这个做法确实属于挖洞行为,并不值得鼓励教大家去这么做,存在风险的也未知

但是,rest api访问的问题,如何处理,官方并没有给出任何指导,而且我提供的这个token请求并没有破坏原先任何的内容,而你提供的屠龙宝典对HA的认证却存在着破坏性的风险

帖子里我也说了,或许官方提供永久keyid的自助开放才是解决rest api的终点?
回复

使用道具 举报

8

主题

89

回帖

851

积分

论坛技术达人

积分
851
金钱
749
HASS币
30
 楼主| 发表于 2019-3-23 16:27:22 | 显示全部楼层
scott817 发表于 2019-3-15 14:54
0.89能不能支持一个

这个可以支持当前最新的版本(0.89/0.90都没问题)
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian ( 晋ICP备17001384号-1 )

GMT+8, 2025-9-11 03:37 , Processed in 0.211031 second(s), 8 queries , MemCached On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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