使用Slack API交换Access Token失败,提示invalid_code错误
Slack API获取Access Token时返回"invalid_code"错误
问题详情
我尝试通过Slack API获取Access Token,流程如下:
- 生成包含临时授权码的授权URL,用户授权后重定向至
/slack/oauthcallback:
const slackAuthorizeUrl = `https://slack.com/oauth/v2/authorize?client_id=${slackClientId}&redirect_uri=${encodeURIComponent(slackRedirectUri)}&scope=users:read,chat:write,channels:read` app.get('/slack/auth', (req, res) => { res.json({ authUrl: slackAuthorizeUrl }) })
- 用回调获取的授权码交换Access Token时失败,收到
invalid_code错误:
app.get('/slack/oauth2callback', (req, res) => { const { code } = req.query console.log('callback code- ', code) const tokenExchangeUrl = 'https://slack.com/api/oauth.v2.access'; const tokenExchangeData = { client_id: slackClientId, client_secret: slackClientSecret, code: code, redirect_uri: slackRedirectUri, }; axios.post(tokenExchangeUrl, tokenExchangeData).then(res => { const userToken = res.data console.log('user data - ', userToken) }) res.status(200).send('recieved code') })
返回的响应数据:
user data - { ok: false, error: 'invalid_code', warning: 'missing_charset', response_metadata: { warnings: [ 'missing_charset' ] } }
排查与解决方法
- 确保redirect_uri完全一致:授权URL中使用了
encodeURIComponent(slackRedirectUri),但交换token时直接传入了原始的slackRedirectUri。如果原始URI包含特殊字符(比如斜杠、参数),会导致两者不匹配。解决方法是交换token时也使用编码后的URI,或者确保两处的URI字符串完全相同。 - 修正POST请求格式:Slack的
oauth.v2.access接口要求POST数据采用application/x-www-form-urlencoded格式,而axios默认发送的是JSON格式。需要修改请求配置:axios.post(tokenExchangeUrl, new URLSearchParams(tokenExchangeData), { headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Accept-Charset': 'utf-8' } }).then(res => { const userToken = res.data console.log('user data - ', userToken) }) - 检查授权码有效性:授权码只能使用一次,重复调用会触发
invalid_code;同时授权码有有效期,若延迟过久请求也会失效。确认是否存在重复调用或超时问题。 - 处理字符集警告:响应中的
missing_charset提示需要指定字符集,在请求头添加Accept-Charset: utf-8即可解决该警告。
内容的提问来源于stack exchange,提问作者Nimish
相关产品推荐
相关产品推荐

