天猫精灵对接1:outh对接
公司的智能家居产品需要接入语音控制,目前在对接阿里语音的天猫精灵
对接天猫精灵的第一步是完成outh鉴权
https://doc-bot.tmall.com/docs/doc.htm?spm=0.7629140.0.0.84a01780RQrNoT&treeId=393&articleId=106999&docType=1
鉴权的博客可以参照如下博客
1.Java实现Aligenie天猫精灵OAuth2.0认证授权流程
https://blog.csdn.net/willianfu/article/details/87464528
免登录式的
https://blog.csdn.net/weixin_41581158/article/details/81120028
带有登录的
贴个代码说说自己的实现
天猫精灵的文档还是很详细的,第一步是登录认证,认证OK之后重定向天猫精灵的地址(带上code的)
登录过程还是必要的,例如我的登录过程,登录上报了单元房ID,这样就把这个天猫精灵和房屋建立关系了,通过这个code赋值的token也是单元房ID,这样在设备控制和查询的时候通过token就知道是查询哪个单元房的设备了
第一步登录,将回调地址放入map中,等待登录成功后回调地址+code信息重定向
@RequestMapping(value = "/login")
public String login(@ModelAttribute LoginForm loginForm, HttpServletRequest request) {
String unicede = IdUtil.getId() + ""; String repsonse = "login";
try {
//构建OAuth 授权请求
OAuthAuthzRequest oauthRequest = new OAuthAuthzRequest(request); //if (oauthRequest.getClientId() != null && oauthRequest.getClientId().equals(clientId)) {
LOG.info("clientID:" + oauthRequest.getClientId());
//利用oauth授权请求设置responseType,目前仅支持CODE,另外还有TOKEN
String responseType = oauthRequest.getParam(OAuth.OAUTH_RESPONSE_TYPE);
//进行OAuth响应构建
OAuthASResponse.OAuthAuthorizationResponseBuilder builder =
OAuthASResponse.authorizationResponse(request, HttpServletResponse.SC_FOUND);
builder.setParam("state", oauthRequest.getState());
//得到到客户端重定向地址
String redirectURI = oauthRequest.getParam(OAuth.OAUTH_REDIRECT_URI);
//构建响应
OAuthResponse response = builder.location(redirectURI).buildQueryMessage();
String responceUri = response.getLocationUri(); //将url放入map,待用户登录后填上code做回调
loginForm.setUnicode(unicede);
map.put(unicede, responceUri);
//} } catch (OAuthSystemException e) {
LOG.error("处理获取code请求时发生异常", e);
repsonse = "error";
} catch (OAuthProblemException e) {
LOG.error("处理获取code请求时发生异常", e);
repsonse = "error";
}
return repsonse; }
第二部登录鉴权,登录成功重定向至天猫精灵服务器,即返回天猫精灵code
@RequestMapping(value = "/loginSucess")
public String add(@ModelAttribute LoginForm loginForm) {
String uniCode = loginForm.getUnicode();
String redirectURL = map.get(uniCode);
if (redirectURL == null) {
LOG.error("用户回调url为null,需要重新登录");
return "error";
}
map.remove(uniCode); //houseID鉴权
String house = loginForm.getHouseId(); IotGwInfo iotGwInfo = new IotGwInfo();
iotGwInfo.setIhouseId(house);
List<IotGwInfo> iotGwInfoList = iotGwInfoService.getIotGwInfos(iotGwInfo);
if (iotGwInfoList == null || iotGwInfoList.isEmpty()) {
LOG.error("上报的houseid:{}下找不到网关", house);
return "error";
} redirectURL = redirectURL + "&code=" + loginForm.getHouseId(); LOG.info("登录回调地址:" + redirectURL);
return "redirect:" + redirectURL;
}
第三部 返回token,我的代码里token值=代码值=单元房ID,因为服务器做的是支持多网关的,一个单元房可以有多个网关
@RequestMapping(value = "/accessToken", method = RequestMethod.POST)
public HttpEntity token(HttpServletRequest request) throws OAuthSystemException {
OAuthResponse response = null;
//构建OAuth请求
try {
OAuthTokenRequest oauthRequest = new OAuthTokenRequest(request); String id = oauthRequest.getClientSecret();
LOG.info("clientID:" + id);
//if (id != null && id.equals(clientId)) {
String token = request.getParameter("code");
//生成OAuth响应
response = OAuthASResponse
.tokenResponse(HttpServletResponse.SC_OK)
.setAccessToken(token)
.setRefreshToken(token)
.setParam("expires_in", EXPIRE_TIME)
.buildJSONMessage();
//}
//根据OAuthResponse生成ResponseEntity
return new ResponseEntity(response.getBody(), HttpStatus.valueOf(response.getResponseStatus())); } catch (OAuthSystemException e) {
LOG.error("获取accessToken发生问题", e);
response = OAuthASResponse
.tokenResponse(HttpServletResponse.SC_OK)
.setParam("error", "101")
.setParam("error_description", "内部错误")
.buildJSONMessage();
return new ResponseEntity(response.getBody(), HttpStatus.valueOf(response.getResponseStatus()));
} catch (OAuthProblemException e) {
LOG.error("获取accessToken发生问题", e);
response = OAuthASResponse
.tokenResponse(HttpServletResponse.SC_OK)
.setParam("error", "102")
.setParam("error_description", "参数错误")
.buildJSONMessage(); return new ResponseEntity(response.getBody(), HttpStatus.valueOf(response.getResponseStatus()));
} }
设备操作这块就是json的了,主要是设备发现,设备查询,设备控制三种功能。
@ApiOperation(value = "设备接口", notes = "设备接口")
@RequestMapping(value = "/deviceHandle", method = RequestMethod.POST)
public AliDevice deviceHandle(@RequestBody AliDevice aliDeviceReq) {
LOG.info("请求数据:" + JSON.toJSONString(aliDeviceReq)); String action = aliDeviceReq.getHeader().getNamespace();
AliDevice resp = new AliDevice();
resp.setHeader(aliDeviceReq.getHeader());
switch (action) {
case Constants.Namespace.deviceDiscovery: {
aliboxDeviceService.deviceDiscovery(aliDeviceReq.getPayload().getAccessToken(), resp);
resp.getHeader().setName(Constants.Name.deviceDiscoveryResp);
break;
}
case Constants.Namespace.deviceControl: { aliboxDeviceService.deviceControl(aliDeviceReq, resp);
break;
}
case Constants.Namespace.deviceQuery: {
break;
}
default: { }
} LOG.info("返回数据:" + JSON.toJSONString(resp));
return resp;
}
以上是天猫精灵对接
在后台服务器里还需要一个天猫精灵的登录页面,就直接写在后台了,使用thymeleaf,这块就是学习做了,因为对前段不输,就是白板写出了功能。
spring:
profiles: shypro
thymeleaf:
prefix: classpath:/templates/
suffix: .html
mode: LEGACYHTML5
encoding: UTF-8
content-type: text/html
cache: false
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8"></meta>
<title>login</title>
</head>
<body>
<h1>login</h1>
<div th:object="${loginForm}">
<p th:text="*{houseId}"></p>
<p th:text="*{unicode}"></p>
</div>
<form action="#" th:action="@{/alibox/loginSucess}" th:object="${loginForm}" method="post">
<input type="text" th:field="*{houseId}"/>
<input type="text" th:field="*{unicode}" text="${loginForm.unicode}"/>
<input type="submit"/>
</form>
</body>
</html>
天猫精灵对接1:outh对接的更多相关文章
- (一) 天猫精灵接入Home Assistant- hass对接天猫精灵
1如何利用论坛的认证服务器对接天猫精灵 说起天猫精灵的接入,最早是由c1pher(25989406)大神通过开发自定义技能接入,后面qebabe大神进行了改进,可以直接通过HASS API读取hass ...
- 天猫精灵对接2(OAuth 搭建)
根据 接入方式及流程 中的说明,可知,搭建过程中,我们需要自己整一个 OAuth 的授权平台,具体说明可以参考蟋蟀大哥的文章 ASP.NET WebApi OWIN 实现 OAuth 2.0 ,我的 ...
- 对接天猫精灵X1 (https 的申请)
1 起因 公司是做智能家居的,最近公司要求对接天猫精灵的智能家居功能,所以就来对接天猫精灵X1 了. 新产品,大家都懂的,坑是有不少的,正常事. 1 首先,语言是 c#,不要和我讲 php 是世界最好 ...
- (二 -3-1) 天猫精灵接入Home Assistant-自动发现Mqtt设备--灯系列 实战
#本片教程介绍了具体如何实现天猫精灵控制一个灯. 前提: HASS平台 你已经搭建一个可以在公网IP访问到的HASS平台--- 我用的是租了阿里云服务器,买了个域名,ubuntu1604系统 你已经搭 ...
- (零 ) 天猫精灵接入Home Assistant-总说明
天猫精灵设备管理 https://bbs.hassbian.com/tmall 自己的hass访问地址 http://[自己的IP或域名]:8123/states 自己的MQTT服务器访问 http: ...
- 天猫精灵X1智能音箱使用感想
11.22音箱到手,等了刚好一个月. 主要是测评语音交互功能. 测试条件:正宗普通话. 1)问天气.温度:表现良好.2)找手机功能:试了多次,每次都说手机号码格式不对3)小孩听故事:正常.但是开头会有 ...
- 接入天猫精灵auth2授权页面https发送ajax请求
已存在一个应用A,采用的是http交互, 在接入天猫精灵时,要求请求类型是https,所以在应用服务前加了个nginx转发https请求.在绑定授权页面,会发送ajax请求验证用户名和密码,采用htt ...
- (二 -5) 天猫精灵接入Home Assistant-自动发现Mqtt设备--电风扇
官网:https://www.home-assistant.io/components/fan.mqtt/ 1 添加配置文件 要在安装中启用MQTT风扇,请将以下内容添加到您的configuratio ...
- (二 -3-1) 天猫精灵接入Home Assistant-自动发现Mqtt设备--灯系列 esp8266程序
设备1 上电自动注册自己是个1个开关 HASS网页和手机APP控制 外部开关上升沿中断控制 天猫精灵语音控制 一键配网 记录以往WIFI信息 设备2 上电后,自动注册自己有三个开关控制 HASS网页和 ...
随机推荐
- keil5 使用JLink 向nrf52840DK 下载程序出现No Cortex-M SW Device Found
今天打开52840 keil5 工程,下载程序无法下载成功,提示如下: 在Jlink 配置中(Option for target....-> Debug->Setting )SWDIO也无 ...
- Go Channel 详解
原文链接:Go Channel 详解 Channel类型 Channel类型的定义格式如下: ChannelType = ( "chan" | "chan" & ...
- ubuntu 构建 deb 安装包
源码包下载:http://mirrors.163.com/ubuntu/ 编译工具安装: apt-get install dpkg-dev 以openvswitch为例: wget http://mi ...
- DHCPV6 vs DHCPV4
原文链接:https://blog.csdn.net/kdb_viewer/article/details/83310904 一.DHCPv4 vs DHCPv6 1. 相同点 使用DHCP clie ...
- ReplayingDecoder 解码器:别以为我有多厉害,也只不过是使用了一下装饰器模式而已~
原文地址 一.设计模式为啥老是用不好? 想要写出更屌的代码,提高代码的健壮性和可扩展性,那么设计模式可谓是必学的技能. 关于学习设计模式,大家可能都觉得设计模式的概念太过于抽象,理解起来有点费劲:又或 ...
- 程序员深夜惨遭老婆鄙视,原因竟是CAS原理太简单?| 每一张图都力求精美
悟空 种树比较好的时间是十年前,其次是现在. 自主开发了Java学习平台.PMP刷题小程序.目前主修Java.多线程.SpringBoot.SpringCloud.k8s. 本公众号不限于分享技术,也 ...
- asp.net Core3.1自定义权限体系-菜单和操作按钮权限
我们在做项目项目,经常会碰到权限体系,权限体系属于系统架构的一个最底层的功能,也是非常重要的功能,几乎在每个项目都会用到.那么我们该如何设计一个比较合理的且扩展性较强的权限体系呢? 经过多天的摸索,参 ...
- 超级码力编程赛带着6万奖金和1200件T恤向你跑来了~
炎炎夏日,总是感觉很疲劳,提不起一点精神怎么办?是时候参加一场比赛来唤醒你的激情了!阿里云超级码力在线编程大赛震撼携手全国数百所高校震撼来袭. 它来了,它来了,它带着60000现金和1200件T恤向你 ...
- 你还在用a标签吗?——用button替代a
前言:a标签,不止你在用,我也在用.但某些时候我们可以考虑用button替代a. 在多页应用中,a标签很常见,我们常用来作为一个普通超链接,进行页面跳转. 而在单页应用中,我们使用路由进行页面切换,a ...
- 位运算处理字符大小写转换 - 关联Leetcode 709. 转成小写字母
大写变小写.小写变大写 : 字符 ^= 32; 大写变小写.小写变小写 : 字符 |= 32; 小写变大写.大写变大写 : 字符 &= -33; 题目 实现函数 ToLowerCase(),该 ...