授权是指插件通过调用淘宝开放平台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
修改为number
start
单位从秒变更为毫秒。通过页面参数获取授权信息时,可对参数进行加签校验
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用于下次刷新。