授权是指插件通过调用淘宝开放平台API获取用户隐私数据(如商品、订单等)时,为保证用户数据的安全与隐私,需要取得的用户授权令牌Access Token。
插件开发者(ISV)可使用如下两种方式获取用户数据:
授权示例
{
"access_token": "50008401113yNbaZzmwHqtCVr1d6d8918g8bFvinuXEHIOi0jrXDDWkTxCQGECOxLZ6",
"expires_in": 600,
"start": 1502423982571,
"refresh_token": "50003401a13kQLspddeFy7NVw1e7dd9fcgHdymagtWlEbDqtgKTzQLOa4gv3ZxI48uw",
"re_expires_in": 15474443,
"usession_id": "1d9540000475fb30f58b444e5de958be66264ee101fe0d8aee8012867328171",
"sub_taobao_user_nick": "qn店铺测试账号002:fh",
"taobao_user_id": "2256639411",
"sub_taobao_user_id": "2867328171",
"taobao_user_nick": "qn店铺测试账号002",
"r1_expires_in": 8843,
"r2_expires_in": 8843,
"w1_expires_in": 8843,
"w2_expires_in": 0
}
| Key | 类型 | 示例 | 说明 |
|---|---|---|---|
| access_token | string | 2YotnFZFEjr1zCsicMWpAA | 标准的OAuth2 Access token |
| usession_id | string | 1d9540000475fb30f58b4 | 用户会话id,可用于用户会话跟踪 |
| start | number | 1502423982571 | token创建时间,根据这个值和失效时长来计算当前是否失效 |
| expires_in | number | 10(表示10秒后过期) | Access token过期时间 |
| refresh_token | string | 2YotnFZFEjr1zCsicMWpAA | Refresh token,可用来刷新access_token |
| re_expires_in | number | 10(表示10秒后过期) | Refresh token过期时间 |
| r1_expires_in | number | 10(表示10秒后过期) | r1级别API或字段的访问过期时间; |
| r2_expires_in | number | 10(表示10秒后过期) | r2级别API或字段的访问过期时间; |
| w1_expires_in | number | 10(表示10秒后过期) | w1级别API或字段的访问过期时间; |
| w2_expires_in | number | 10(表示10秒后过期) | w2级别API或字段的访问过期时间; |
| taobao_user_nick | string | 测试账号 | 淘宝账号 |
| taobao_user_id | string | 706388888 | 淘宝帐号对应id |
| sub_taobao_user_id | string | 2343535 | 淘宝子账号对应id |
| sub_taobao_user_nick | string | 测试账号test:123 | 淘宝子账号 |
插件通过自有服务端调用淘宝开放平台api获取用户数据时,需要向QAP获取授权信息。QAP会确保返回的授权信息R1安全级别的授权有效性,安全级别详见淘宝开放平台插件授权介绍。
授权信息有两种方式可以获取
插件在打开之前,QAP会通过授权功能获取授权信息,然后将授权信息以插件打开URL参数的形式给到插件开发者(ISV),帮助插件实现授权。
该获取方式只针对打开插件的第一个页面有效。
import {Util} from 'nuke';
const getSearchParameter = Util.urlHelper.getSearchParameter;
const search = Util.Location.search;
console.log('authString==>',getSearchParameter(search,'authString'));
插件在打开之后,可以通过QN.sso获取QAP中的授权信息。
该获取方式在所有页面中都能调用。
QN.sso({
}).then(result => {
console.log(result.data);
}, error => {
console.log(error);
});
当插件自有服务端使用QAP提供的授权信息向淘宝开放平台请求用户数据出错时,如果错误跟授权信息相关,需要请求QAP更新用户的授权信息。
授权信息在下列两种情况下需要更新:
当QAP提供的授权信息出现异常或者在调用链路中出错,需要重新刷新授权
| 错误码 | 英文描述 | 中文描述 | 说明 |
|---|---|---|---|
| 27 | Invalid Session 、 unmix-sessionkey-failure | 无效的Access Token参数 | 传入的session必需是用户绑定session拿到的,如果报session不合法可能是用户没有绑定session或session过期造成的,用户需要重新绑定一下然后传入新的sessionKey |
更新示例
QN.sso({
query: {
forceRefresh: true //强制刷新授权,更新r1,r2,w1,w2授权有效期
},
}).then(result => {
console.log(result.data);
}, error => {
console.log(error);
});
为了更加灵活的对淘宝开放平台开放的数据进行安全管控,降低用户数据泄露或者被恶意修改的风险,淘宝开放平台推出了安全等级的概念。
淘宝开放平台对API(或者API字段)及 应用分别打了r1、r2、w1、w2 和 0,1,2,3四种安全级别的标记。与 r1、r2、w1、w2对应的是在access token(session key)颁发时增加了4个过期时间。
因QAP无法判断给出的授权信息会被使用于请求哪个安全级别的API,插件获取到的授权信息只确保了access_token与r1的有效性。当淘宝开放平台服务返回如下错误码时,需要插件调用QN.sso刷新授权。
父错误码 code
| 错误码 | 应用描述 | 中文描述 | 说明 |
|---|---|---|---|
| 53 | Insufficient security level | 安全等级不足 | 提高应用安全等级或刷新授权安全等级 |
子错误码 sub_code
| 子错误码 | 中文描述 | 解决方案 |
|---|---|---|
| R1 security authorize missing | 未进行R1级别授权 | 进行R1级别授权(用户重新授权或刷新授权) |
| R1 security authorize invalid | R1级别授权过期 | 进行R1级别授权(用户重新授权或刷新授权) |
| R2 security authorize missing | 未进行R2级别授权 | 进行R2级别授权(用户重新授权或刷新授权) |
| R2 security authorize invalid | R2级别授权过期 | 进行R2级别授权(用户重新授权或刷新授权) |
| W1 security authorize missing | 未进行W1级别授权 | 进行W1级别授权(用户重新授权或刷新授权 |
| W1 security authorize invalid | W1级别授权过期 | 进行W1级别授权(用户重新授权或刷新授权) |
| W2 security authorize invalid | 未进行W2级别授权 | 进行W2级别授权(用户重新授权或刷新授权) |
| W2 security authorize invalid | W2级别授权过期 | 进行W2级别授权(用户重新授权或刷新授权) |
更新示例
QN.sso({
query: {
forceRefresh: true //强制刷新授权,更新r1,r2,w1,w2授权有效期
},
}).then(result => {
console.log(result.data);
}, error => {
console.log(error);
});
forceReAuth选项,当插件订购过期、用户取消授权、权限受限等时,强制弹出授权页面引导用户重新授权。r1_valid、r2_valid、w1_valid、w2_valid字段,保持与iOS端一直r1_expire_in、r2_expires_in、w1_expires_in、w2_expires_in数据类型从string修改为numberstart单位从秒变更为毫秒。通过页面参数获取授权信息时,可对参数进行加签校验
md5(utf-8:AppSecret+k1+v1+k2+v2+…+kn+vn + AppSecret) 与 URL中sign参数进行比对,相同则校验通过。
千牛授权的refresh_token可以通过taobao.top.auth.token.refresh接口刷新获取新的token。每次刷新后原来refresh_token作废,都要更新成最新返回的refresh_token用于下次刷新。