You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TikTok Business API OAuth2授权码刚生成即过期问题求助

TikTok API授权码兑换access_token时提示已过期的问题排查

问题场景

编写调用TikTok API的Python脚本时,刚生成的authorization code在请求access_token时就被提示已过期,完全无法获取令牌。

代码实现

# API key details
token_url = "https://open.tiktokapis.com/v2/oauth/token/" 
auth_url =  "https://business-api.tiktok.com/portal/auth"
redirect_uri = "https://my_company_website/"

app_id = "xxxxxxxxxx"
secret_key = "yyyyyyyyyy"

def generate_auth_url():
    csrf_state = secrets.token_hex(16)

    params = {
        'app_id': app_id,
        'scope': 'user.info.basic',
        'redirect_uri': redirect_uri,
        'state': csrf_state,
    }

    url = auth_url + '?' + urllib.parse.urlencode(params)
    
    return url, csrf_state
    
# Function to get the access token
def get_access_token(authorization_code):
    data = {
        'client_key': app_id,
        'client_secret': secret_key,
        'code': authorization_code,
        'grant_type': 'authorization_code',
        'redirect_uri': redirect_uri
    }
    headers = {
        'Content-Type': 'application/x-www-form-urlencoded'
    }

    response = requests.post(token_url, headers=headers, data=urllib.parse.urlencode(data))

    if response.status_code == 200:
        return response.json()
    else:
        print(f"Error: Received status code {response.status_code}")
        print(f"Response content: {response.content.decode()}")
        return None

def manual_test():
    # Generate authorization URL
    print("Generating authorization URL...")
    url, state = generate_auth_url()
    print("URL:", url)
    print("State:", state)
    
    # Prompt user for the redirect URL
    input_ = input("Paste the URL you were redirected to: ")
    
    # Extract authorization code from redirect URL
    code = input_.split("code=")[1].split("&")[0]

    # Decode the code (THAT'S THE EDITING PART) 
    decoded_code = urllib.parse.unquote(code)

    print("Code:", code)
    print("Decoded Code:", decoded_code)
    
    # Fetch access token without delay
    print("Fetching access token...")
    token_info = get_access_token(decoded_code)
    print(token_info)

错误返回

{'error': 'invalid_grant', 'error_description': 'Authorization code is expired.', 'log_id': '202312191447256251E59DA270380F9108'}

问题原因及修复方案

1. API环境不匹配(核心问题)

你当前使用的auth_url是TikTok商务API(Business API)的授权入口,但token_url用的是TikTok开放平台(Open Platform)的令牌端点,这两个属于不同的API体系,授权码无法跨体系兑换,因此被判定为无效(返回过期错误)。

修复:将token_url改为商务API对应的令牌端点:

token_url = "https://business-api.tiktok.com/open_api/v1.3/oauth2/access_token/"

2. Redirect URI严格一致性校验

TikTok对redirect_uri的校验非常严格,必须保证授权请求和令牌请求中的redirect_uri完全一致,包括:

  • 是否有结尾的斜杠(比如https://my_company_website/和https://my_company_website会被视为不同)
  • 域名、路径的大小写
  • 任何细微的字符差异

修复:检查redirect_uri在两个请求中的值完全相同,同时确保和TikTok开发者后台配置的回调地址完全一致。

3. 授权码提取验证

虽然你已经做了URL解码,但可以优化提取逻辑,避免split可能导致的错误:

from urllib.parse import urlparse, parse_qs

# 替换原有的提取代码
parsed_url = urlparse(input_)
query_params = parse_qs(parsed_url.query)
code = query_params.get('code', [''])[0]
decoded_code = urllib.parse.unquote(code)

验证步骤

  1. 修改token_url为商务API端点
  2. 确认redirect_uri完全一致
  3. 重新生成授权URL,完成授权后兑换令牌

内容的提问来源于stack exchange,提问作者Felix Bains

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 19:12:50