首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TikTok oAuth API auth代码总是过期的。

TikTok oAuth API auth代码总是过期的。
EN

Stack Overflow用户
提问于 2022-02-10 08:02:31
回答 2查看 1.5K关注 0票数 2

我正在尝试使用TikTok oAuth API登录

基于TikTok API文档,我设置了一个Firebase函数(Nodejs)来完成oauth流,但是当我到达点(令牌)以获得实际的用户访问令牌时,它会失败,我会得到一个错误。

我得到的回应是状态200和

代码语言:javascript
复制
{
    "data": {
        "captcha": "",
        "desc_url": "",
        "description": "Authorization code expired",
        "error_code": 10007
    },
    "message": "error"
}

TikTok API总是给我相同的授权代码。所以我猜是出了什么问题。欢迎任何建议。

下面是后端的代码示例,/linkTikTok/oauth和用于将用户重定向到tikTok oauth的点,/linkTikTok/validate用于请求访问令牌。代码运行良好,但当它到达const URL = https://open-api.tiktok.com/oauth/access_token时;实际上,请求用户访问令牌时,我会得到上面的响应。

代码语言:javascript
复制
import * as express from 'express';
import * as cors from 'cors';
import axios from 'axios';
import * as cookieParser from 'cookie-parser';
import { config } from 'firebase-functions';
import { firestore } from 'firebase-admin';
import { colRefs } from '../../constants/db-refs';

const app = express();
app.use(cors());
app.use(cookieParser());
app.listen();
const { client_key, client_secret } = config().tikTokCredentials;
const redirectURI = `https://xxxxx.firebaseapp.com/linkTikTok/validate`;


app.get('/linkTikTok/oauth', async (req, res) => {
 // The user's id;
 const uid = 'a_user_id';
 if (!uid) {
  return res.status(401).send('This action requires user authentication');
 }
 // Random state
 const csrfState = Math.random().toString(36).substring(7);
 const state: any = {
  state: csrfState,
  timestamp: firestore.Timestamp.now(),
  uid,
 };
 // A state object kepts in firestore
 await colRefs.tikTokAuthState.doc(uid).set(state);
 res.cookie('__session', { state: csrfState });
 let url = 'https://open-api.tiktok.com/platform/oauth/connect/';

 url += `?client_key=${client_key}`;
 url += '&scope=user.info.basic,video.list';
 url += '&response_type=code';
 url += `&redirect_uri=${redirectURI}`;
 url += '&state=' + csrfState;

 return res.redirect(url);
});


app.get('/linkTikTok/validate', async (req, res) => {
 // Query state
 const state = req.query.state as string;

 if (!state) {
  return res.status(403).send('No state found');
 }
 const code = req.query.code as string;
 if (!code) {
  return res.status(403).send('No code found');
 }
 const sessionCookie = req.cookies['__session'] ?? {};
 const sessionState = sessionCookie.state;

 if (state !== sessionState) {
  return res.status(403).send('Wrong state');
 }
 // Retrieve the uid from firestore
 const uid = await (async () => {
  const states = (await colRefs.tikTokAuthState.where('state', '==', state).get()).docs.map(d => d.data());
  if (states.length !== 0 && states.length > 1) {
   console.warn('More than one state');
  }
  return states[0].uid;
 })();
console.log({ uid });

const URL = `https://open-api.tiktok.com/oauth/access_token`;

const params = {
 client_key,
 client_secret,
 code,
 grant_type: 'authorization_code',
};

try {
 const result = await axios.post<any>(URL, '', {
   params,
 });
 const data = result.data.data;
 const {
   access_token: accessToken,
   refresh_token,
   refresh_expires_in,
   open_id: openId,
   expires_in,
 } = data;

 if (!accessToken) {
   throw new Error('No access token found');
 }
 // Application logic
 ...
});
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71061600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档