调用LinkedIn分享帖子API返回401未授权,求排查方案
先修正你已经发现的代码错误,给出可运行的正确示例,再排查其他可能导致401的原因:
一、修正核心代码错误
你提到的两个代码问题是直接诱因,先把它们修复:
import axios from 'axios'; export default async function(req) { // 从请求体获取前端传入的accessToken const { accessToken } = await req.json(); const linkedInApiUrl = 'https://api.linkedin.com/v2/ugcPosts'; try { // axios.post的参数顺序:url、请求体、配置项(含headers) const postResponse = await axios.post(linkedInApiUrl, { // 符合LinkedIn UGC Post规范的请求体 "author": "urn:li:person:你的个人ID", // 替换为实际的person URN "lifecycleState": "PUBLISHED", "specificContent": { "com.linkedin.ugc.ShareContent": { "shareCommentary": { "text": "测试发布的LinkedIn帖子内容" }, "shareMediaCategory": "NONE" } }, "visibility": { "com.linkedin.ugc.MemberNetworkVisibility": "PUBLIC" } }, { // headers必须放在第三个config参数中,而非请求体 headers: { 'Authorization': `Bearer ${accessToken}`, // 使用传入的accessToken而非未定义的token 'Content-Type': 'application/json', 'X-Restli-Protocol-Version': '2.0.0' // LinkedIn V2 API强制要求的协议头 } }); // 直接访问response的data属性,而非调用data()方法 return new Response(JSON.stringify(postResponse.data), { status: 200 }); } catch (err) { const errorMsg = err.response?.data || err.message; return new Response(JSON.stringify({ error: errorMsg }), { status: err.response?.status || 500 }); } }
二、排查其他导致401的潜在原因
如果代码修正后仍返回401,检查以下几点:
- 权限范围(Scope)缺失:授权流程中必须请求
w_member_social(个人账号发帖)或w_organization_social(企业账号发帖)权限。如果授权时没加这个scope,即使token有效,也没有发帖权限。 - Author URN格式错误:
author字段必须是正确的URN格式,个人账号为urn:li:person:XXX,企业账号为urn:li:organization:XXX。可以调用https://api.linkedin.com/v2/me接口获取当前用户的person URN,确保填写正确。 - Supabase边缘函数网络策略:确认Supabase边缘函数允许访问
api.linkedin.com域名,部分边缘环境会限制对外请求,需要在Supabase控制台检查网络规则。 - Token受众不匹配:确保生成token时使用的客户端ID/密钥,与你在LinkedIn开发者平台创建的应用完全对应,错误的凭证会导致token权限无效。
- API版本或端点错误:确认使用的是LinkedIn V2 API的
ugcPosts端点,而非旧版的shares端点,旧版端点已逐步废弃。
关于SDK返回426错误的说明
426(Upgrade Required)通常是因为SDK版本过旧,或SDK默认使用了非HTTPS请求,建议直接用axios等轻量HTTP库手动调用API,兼容性和可控性更强。
内容的提问来源于stack exchange,提问作者ibok kegbo
相关产品推荐
相关产品推荐

