我希望用户在网络上使用 tikok 登录并获取他的基本信息,例如:
avarat_url
union_id
(抖音提供的uniq用户标识)display_name
用于 Web 文档的Tiktok 登录工具包似乎缺少有关如何实现完整调用序列的完整示例。还有一些事情根本没有解释(比如回调 URL)。有人可以通过代码示例分享他们的完整解决方案,了解如何将 tiktok 登录集成到网页上。
我希望用户在网络上使用 tikok 登录并获取他的基本信息,例如:
avarat_url
union_id
(抖音提供的uniq用户标识)display_name
用于 Web 文档的Tiktok 登录工具包似乎缺少有关如何实现完整调用序列的完整示例。还有一些事情根本没有解释(比如回调 URL)。有人可以通过代码示例分享他们的完整解决方案,了解如何将 tiktok 登录集成到网页上。
设置 tiktok 开发者账号https://developers.tiktok.com/
创建一个新应用程序,这将生成一个CLIENT_KEY
and CLIENT_SECRET
。
创建您控制的 2 个后端端点,例如:
在“平台信息”部分:插入callback URL
and redirect domain
。回调 URL是上面列出的 2 个服务器端点中的第二个。一旦用户成功登录并授予或拒绝所需的权限,Tiktok 将向该 URL 发送授权响应。在重定向域中,只需添加没有确切路径的域。
填写您的应用的所有信息并等待批准,这可能需要 1-3 天。
一旦获得批准,您就可以实施包含多个步骤/请求的完整流程。
(A)将用户从您的前端发送到您的第一个后端端点https://example.com/auth
。从那里,用户将被重定向到 tiktok 身份验证页面。
(B)一旦用户完成授权,tiktok 会向你的回调 URL ( https://example.com/authCallback
) 发送一个授权响应,其中包含一个变量code
。使用 ,code
您可以请求用户的access_token
and open_id
。
(C)使用access_token
andopen_id
请求基本用户信息。
在您的前端,将用户重定向到https://example.com/auth
. /auth
然后在您的路线上运行以下 nodejs 后端代码。对于这个例子,我们使用一个快速应用程序(req
= 请求对象,res
= 响应对象):
// IMPORTANT, it is your responsibility to store a csrf token
// in your database, to be able to prevent xss attacks, read more
// here (section 2.1) => https://developers.tiktok.com/doc/login-kit-web
const createCsrfState = () => Math.random().toString(36).substring(7);
const csrfState = createCsrfState();
res.cookie('csrfState', csrfState, { maxAge: 60000 });
let url = 'https://open-api.tiktok.com/platform/oauth/connect/';
url += `?client_key=${CLIENT_KEY}`;
url += '&scope=user.info.basic';
url += '&response_type=code';
url += `&redirect_uri=${encodeURIComponent('https://example.com/authCallback')}`;
url += '&state=' + csrfState;
// redirect the user to the generated URL
// user will be prompted to login with tiktok
// and authorize needed permissions
res.redirect(url);
此代码将用户重定向到 tiktok url,提示用户使用 tiktok 登录并授予访问权限。
authorizationResponse
,用于code
获取access_token
和open_id
用户完成登录过程后,tiktok 会向您的第二个后端服务器端点https://example.com/authCallback发送一个授权响应。在该回调中,您收到变量state
和code
.
// express example with
// `req` = request object
// `res` = response object
// check if the csrf token is valid
// its the developers responsibility
// to setup a validation logic.
if (!validateCsrfToken(req.query.state)) {
throw new Error("invalid csrf token");
}
async function getAccessTokenAndOpenId(code, TIKTOK_CLIENT_KEY, TIKTOK_CLIENT_SECRET) {
let urlAccessToken = 'https://open-api.tiktok.com/oauth/access_token/';
urlAccessToken += '?client_key=' + TIKTOK_CLIENT_KEY;
urlAccessToken += '&client_secret=' + TIKTOK_CLIENT_SECRET;
urlAccessToken += '&code=' + code;
urlAccessToken += '&grant_type=authorization_code';
const resp = await axios.post(urlAccessToken);
return {
accessToken: resp.data.data.access_token,
openId: resp.data.data.open_id,
};
}
const code = req.query.code;
const { openId, accessToken } = await getAccessTokenAndOpenId(code, TIKTOK_CLIENT_KEY, TIKTOK_CLIENT_SECRET);
basic user info
async function getBasicInfo(accessToken, openId) {
let urlBasicInfo = `https://open-api.tiktok.com/user/info/`;
const data = {
access_token: accessToken,
open_id: openId,
fields: [
"open_id",
"union_id",
"avatar_url",
"avatar_url_100",
"avatar_url_200",
"avatar_large_url",
"display_name",
],
};
const resp = await axios.post(urlBasicInfo, data);
return resp.data.data.user;
}
const userBasicInfo = await getBasicInfo(accessToken, openId);
// done!