抖音web应用移动端授权验证踩坑记

由 夕空 撰写于  2025年5月30日

web跳转方式

从抖音开放平台注册好并申请功能,配置回调地址

1.跳转

https://open.douyin.com/platform/oauth/connect?client_key=CLIENT_KEY&response_type=code&scope=SCOPE&redirect_uri=REDIRECT_URI&state=STATE

此跳转方式官方介绍可以兼容全端(APP内打开、移动端、PC端),但经我测试抖音APP内调用总是有风险提示,PC扫码没问题。

2.在回调地址后端通过拿到的code获取access_token

https://open.douyin.com/oauth/access_token/

(注意是POST,详情请看官方文档:https://developer.open-douyin.com/docs/resource/zh-CN/dop/develop/openapi/account-permission/get-access-token

到此返回的格式如下:

{
"data": {
"access_token": "act.f7094fbf******",
...
"open_id": "b9b71865-7fea-44cc-******",
"refresh_token": "rft.713900b7******",
"scope": "user_info"
},
"message": "success"
}

3.获取用户信息

https://open.douyin.com/oauth/userinfo/

open_id和access_token通过以上接口POST获取用户信息(跟微信一样也就昵称和头像)

以上感觉挺简单,但发现抖音APP内打开总是风险提示,没办法,接着搞JS授权

JS获取授权方式

此方法就复杂些了,且官方文档有记录错误,导致找问题好久。。。

H5端:

页面引入:

https://unpkg.byted-static.com/bridge/douyin_open/1.0.10/lib/douyin_open.umd.js
const dySDK = window.douyin_open;
var dy_client_key;

function setToken(ticket) {
axios({
method: 'post',
url: '获取access_token URL',
data: { code: ticket }
}).then(res => {
var { state, result } = res.data;
if (state) {
window.localStorage.setItem('flashmeDYToken', JSON.stringify(result));
store.dyToken = result;
}
})
}
export function dyLogin(login) {
var browser = fBrowserRedirect();
store.browser = browser;
if (browser != 'douyin') {
return login?'请使用抖音打开!':null;
}
const url = window.location.href;
const timestamp = String(parseInt(Date.now() / 1000)); // 生成签名用的时间戳
const nonce_str = "Dofbydgbviyfg618"; // 生成签名用的随机字符串

var configStatus = ''
if (dySDK) {
configStatus = 'SDK Loaded'
axios({
method: 'post',
url: '获取签名URL',
data: { timestamp, nonce_str, url }
}).then(res => {
var { state, client_key, signature } = res.data;
if (state) {
dy_client_key = client_key;
dySDK.config({
params: {
client_key,
signature,
timestamp,
nonce_str,
url
}
});
}
}).catch(err => {
const res = err.response;
});

dySDK.ready(() => {
configStatus = 'SDK Config Ready'
// 打开原生授权页面JSB
dySDK.showOpenAuth({
params: {
client_key: dy_client_key,
state: '',
scopes: { user_info: 0 },
response_type: 'code',
},
success: ({ ticket }) => {
console.log(`Auth Success: ${ticket}`);
setToken(ticket)
},
error: (res) => {
resultMsg.value = `Auth Error: ${JSON.stringify(res)}`
},
})
})
dySDK.error((res) => {
configStatus = `SDK Config Error: ${JSON.stringify(res)}`
console.log(configStatus);
})
}
}


后端:获取签名URL

为了上面H5端的dySDK.config(),需要先调用后端的计算签名接口

https://open.douyin.com/oauth/client_token/

通过此地址POST获取所需access_token(此token非前面所需token)

https://open.douyin.com/js/getticket/?access_token=刚刚拿到的token

在通过此地址GET获取 ticket,这里官方文档写的是access-token参数,再加上没注意突然变成GET方式,导致找问题好久!!!

计算签名

// 详细说明见 https://developer.open-douyin.com/docs/resource/zh-CN/dop/develop/sdk/web-app/js/signature
const calcSignature = ({ ticket, nonce_str, timestamp, url }) => {
const str = `jsapi_ticket=${ticket}&nonce_str=${nonce_str}×tamp=${timestamp}&url=${url}`;
const sig = crypto.createHash('md5').update(str).digest('hex');
return sig;
};

通过刚刚拿到的ticket计算返回签名

获取access_token URL

前端执行dySDK.showOpenAuth()得到的 ticket 相当于web跳转方式获取到的code,使用此参数调用后端接口获取真正的access_token,与web跳转方式的第二步一样:

https://open.douyin.com/oauth/access_token/

后面获取用户信息同理,不再赘述。

声明:星耀夕空|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 抖音web应用移动端授权验证踩坑记


欢迎光顾我的小站!