使用NestJS时Auth0交换授权码遇invalid_grant错误求助
invalid_grant错误 以下是针对该问题的具体排查和解决建议:
检查授权码的时效性与复用性
Auth0的授权码(code)仅在生成后60秒内有效,且只能使用一次。如果是复制code后间隔了一段时间才发起请求,或是之前已用该code请求过token,都会触发此错误。解决方式:重新走登录流程获取新的code,拿到后立刻发起token请求。确保
audience参数一致
你的express配置中在authorizationParams里指定了audience,但换取token的curl请求中未携带该参数。授权码与请求时的audience绑定,换token必须传入完全相同的audience。修改curl请求,添加--data 'audience={你的AUTH0_AUDIANCE值}'。核对回调地址的完全一致性
确认Auth0客户端配置的回调URL、express配置的baseURL、curl里的redirect_uri三者完全一致,包括协议(http/https)、端口、路径,不能有多余斜杠或大小写差异。比如要确保都是http://localhost:8080/callback,而非http://localhost:8080/callback/。确认客户端类型正确
在Auth0控制台检查客户端类型是否为Regular Web Application,授权码流程仅支持该类型。如果是SPA或其他类型,需切换客户端类型或调整认证流程。检查授权码的完整性
从开发者工具复制code时,确保没有遗漏字符或多复制空格。可直接在网络面板右键复制响应参数,避免手动输入出错。验证state参数(可选)
若登录流程生成了state参数,手动换token时需确保state与登录返回的一致(部分场景下Auth0要求验证)。express-openid-connect中间件通常会自动处理,但手动请求建议带上--data 'state={登录返回的state值}'。
修改后的curl示例:
curl --request POST \ --url 'https://<domain_name>.eu.auth0.com/oauth/token' \ --header 'content-type: application/x-www-form-urlencoded' \ --data grant_type=authorization_code \ --data 'client_id={My client ID}' \ --data 'client_secret={My client secret}' \ --data 'code={code returned from authenticating user}' \ --data 'redirect_uri=http://localhost:8080/callback' \ --data 'audience={你的AUTH0_AUDIANCE值}'
内容的提问来源于stack exchange,提问作者Lola Nolan

