1.概述
采用通用的 OAuth2.0 开放授权协议,可以让 AliGenie 在不获取合作方用户名和密码的前提下,访问用户授权的资源,协议规范可以访问 OAuth2.0 官方网站:https://oauth.net/2/
PS:家居技能及自定义技能 Oauth2.0 需要配置的项含义一致,不区分家居和自定义技能
2.鉴权流程
(1)AliGenie 在开发商开放平台或者其他第三方平台注册一个应用,获取到相应的 Client id 和 Client secret
(2)AliGenie 应用向开发商 OAuth2.0 服务发起一个授权请求
(3)开发商 OAuth2.0 服务向用户展示一个授权页面,用户可进行登陆授权
(4)用户授权 AliGenie 客户端应用后,进行回跳到 AliGenie 的回调地址上并带上 code 相关参数
(5)AilGenie 回调地址上根据code会去合作方 Oauth 的服务上换取 access_token
(6)通过 access_token,天猫精灵设备控制时通过该 access_token 进行访问合作方的服务
3.运行流程
OAuth 2.0 的运行流程如下图
(A)用户打开客户端以后,客户端要求用户给予授权。
(B)用户同意给予客户端授权。
(C)客户端使用上一步获得的授权,向认证服务器申请令牌。
(D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。
(E)客户端使用令牌,向资源服务器申请获取资源。
(F)资源服务器确认令牌无误,同意向客户端开放资源。
4.AliGenie 智能应用平台 oauth 基础配置
PS:服务配置中请使用安全套接字层超文本传输协议 HTTPS 并且已经授信
5.请求 API
(A) 用户打开授权链接进行授权
例:https://xxx.com/auth/authorize?redirect_uri=https%3A%2F%2Fopen.bot.tmall.com%2Foauth%2Fcallback%3FskillId%3D11111111%26token%3DXXXXXXXXXX&client_id=XXXXXXXXX&response_type=code&state=111
参数说明:
redirect_uri: AliGenie 平台的回调地址,该地址会加上 AliGenie 的参数进行 urlEncode,所以合作方务必做好参数返回的兼容性
client_id: 在合作方上注册的应用 Id
response_type: 响应方式为 code
state: 表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。
注:示例中的链接 API (https://xxx.com/auth/authorize) 为开放平台中的账户授权链接字段。
(B) 通过 code 换取合作方访问令牌
例:
请求方法: POST
参数说明:
client_id: 在合厂商平台上注册的应用 Id
grant_type: 授权类型 authorization_code
client_secret: 在厂商平台上注册应用的 secret
code: 授权登陆后回调 AliGenie 的地址返回的 code
redirect_uri: AliGenie 回调地址
注:示例中的链接 API (https://XXXXX/token) 为开放平台中的 Access Token Url 字段。2018年1月4日之后,创建的技能通过 body 来传参。
通过 code 换取 access_token 响应结构如下(响应格式 application/json):
字段类型解释说明access_tokenString访问token(响应正确时必传递)
refresh_tokenString进行刷新access_token的刷新token (响应正确时必传递)
expires_inlong过期时间时长(响应正确时必传递)
errorString错误响应码 (响应错误时必传递)
error_descriptionString错误详情 (响应错误时必传递)
正常响应:
{"access_token": "XXXXXX","refresh_token": "XXXXXX","expires_in":17600000}
错误响应:
{"error":"errorCode","error_description":"description"}
注: access_token 有效期请设置成 1 天以上(2-3天最佳)
(C) 通过 refresh_token 刷新 access_token(该功能已上线,请确保厂商自己的刷新功能是完善的)
例:
请求方法: POST参数说明:grant_type:更新access_token的授权方式为refresh_tokenclient_id: 在厂商平台上注册的应用Idclient_secret:在厂商平台上注册应用的secretrefresh_token: 上一次授权获取的refresh_token注:示例中的链接API( https://XXXXX/token) 为开放平台中的Access Token Url 字段。
更新 access_token 响应结构如下(响应格式 application/json):
字段类型解释说明access_tokenString访问token(响应正确时必传递)
refresh_tokenString进行刷新access_token的刷新token (响应正确时必传递)
expires_inlong过期时间时长(响应正确时必传递)
errorString错误响应码 (响应错误时必传递)
error_descriptionString错误详情 (响应错误时必传递)
正常响应:
{"access_token": "XXXXXX","refresh_token": "XXXXXX","expires_in":17600000}
错误响应:
{"error":"errorCode","error_description":"description"}
注意事项:
获取 access_token 或者刷新 access_token 出现错误情况时 http response status code 请返回 200 ,接入方的内部异常请接入方自行包装异常信息