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)
验证步骤
- 修改
token_url为商务API端点 - 确认
redirect_uri完全一致 - 重新生成授权URL,完成授权后兑换令牌
内容的提问来源于stack exchange,提问作者Felix Bains
相关产品推荐
相关产品推荐

