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

 找回密码
 立即注册
查看: 44142|回复: 158

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

  [复制链接]

8

主题

97

帖子

847

积分

论坛技术达人

积分
847
金钱
745
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?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的访问,否则这个基本太难解了。。

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








评分

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

查看全部评分

回复

使用道具 举报

73

主题

1165

帖子

6679

积分

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
5509
HASS币
30
发表于 2018-8-23 20:06:17 | 显示全部楼层
学习一下
回复

使用道具 举报

5

主题

116

帖子

429

积分

论坛分享达人

积分
429
金钱
313
HASS币
0
发表于 2018-8-23 20:08:13 | 显示全部楼层
来了,虽然我的还是71版本
回复

使用道具 举报

75

主题

1976

帖子

8205

积分

元老级技术达人

积分
8205
金钱
6179
HASS币
430

活跃会员教程狂人

发表于 2018-8-23 20:20:16 | 显示全部楼层
今天还在想有没有大神出个auth的教程,这么快就有了,多谢大佬分享。
所有过往,皆为序章。
回复

使用道具 举报

2

主题

199

帖子

3593

积分

论坛元老

Rank: 8Rank: 8

积分
3593
金钱
3394
HASS币
0
发表于 2018-8-23 20:40:50 | 显示全部楼层
学习一下
回复

使用道具 举报

2

主题

61

帖子

448

积分

中级会员

Rank: 3Rank: 3

积分
448
金钱
387
HASS币
0
发表于 2018-8-23 21:12:14 | 显示全部楼层
好好学习
回复

使用道具 举报

14

主题

253

帖子

1055

积分

金牌会员

Rank: 6Rank: 6

积分
1055
金钱
802
HASS币
0
发表于 2018-8-23 21:18:57 | 显示全部楼层
我还是呆在我的0.70好了。
回复

使用道具 举报

8

主题

871

帖子

5224

积分

论坛元老

Rank: 8Rank: 8

积分
5224
金钱
4353
HASS币
0
发表于 2018-8-23 21:22:23 | 显示全部楼层
谢谢分享
回复

使用道具 举报

0

主题

143

帖子

4351

积分

论坛元老

Rank: 8Rank: 8

积分
4351
金钱
4208
HASS币
0
发表于 2018-8-23 22:11:02 | 显示全部楼层
看不懂怎么用
回复

使用道具 举报

0

主题

150

帖子

914

积分

高级会员

Rank: 4

积分
914
金钱
764
HASS币
0
发表于 2018-8-23 22:31:09 | 显示全部楼层
謝謝分享~
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-12-28 17:32 , Processed in 0.602163 second(s), 34 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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