部署在GoDaddy的站点身份验证返回invalid_grant错误如何解决?
问题排查方案
- 请求体格式配置缺失:OAuth 2.0 密码授权模式要求请求头
Content-Type必须为application/x-www-form-urlencoded,本地开发服务器通常兼容未显式声明的请求,但GoDaddy托管的IIS环境对请求格式校验更严格,未声明格式时会无法正确解析请求体参数,导致服务端读取不到grant_type、用户名、密码等必填字段,返回invalid_grant。
你需要在ajax请求配置中显式添加contentType参数,同时建议用$.param序列化请求体,避免序列化规则差异:
function Authorize() { let bearer = "Basic Q01JUzMwOERTMzA4OndlYkFQSQ==" var email = document.getElementById("email").value; var password = document.getElementById("password").value; var userNameAndPasswordFilled = (email != "" && password != ""); if (!userNameAndPasswordFilled) { $("#formError").show('fast'); } else { // 显式序列化请求体为urlencoded格式 var bodyOfRequest = $.param({ grant_type: "password", username: email, password: password }); $.ajax({ type: "POST", url: uriManager.access, // 显式声明请求体格式 contentType: "application/x-www-form-urlencoded; charset=utf-8", beforeSend: function (request) { request.setRequestHeader("Authorization", bearer); }, data: bodyOfRequest, success: function (response) { sessionStorage.setItem(programKeyWords.BearerToken, response.access_token); $('#LogonModal').modal('hide'); }, error: function (response) { $("#formError").show('fast'); } }); } }
- 客户端凭证与生产环境不匹配:你代码中硬编码的Basic认证凭证是本地调试时的客户端ID和密钥,部署到GoDaddy后,Web API配置的客户端校验规则可能已更新,或者共享主机环境下Web.config配置未正确生效,导致服务端校验客户端凭证失败,返回错误。你可以先解码Base64凭证核对生产环境Web API的OAuth客户端配置,确认凭证与生产配置一致。
- 请求协议与路径不一致:GoDaddy托管默认开启HTTPS强制跳转,如果你前端配置的
uriManager.access是HTTP地址,跳转HTTPS时POST请求体内容会丢失,导致服务端拿不到参数。请确认请求地址的协议与站点当前访问协议一致,优先使用相对路径避免协议、域名不匹配问题。 - CORS与源校验未配置生产域名:本地调试时Web API的CORS规则通常允许
localhost源,部署后你需要将www.luig.us添加到CORS允许源列表,同时确认OAuth服务端的请求源白名单已包含生产域名,否则请求会被拦截导致参数校验失败。 - WAF拦截请求头:GoDaddy共享主机默认开启WAF防护,可能会拦截或篡改Authorization请求头,你可以到GoDaddy主机控制面板的安全设置中,临时关闭WAF测试请求是否正常,如果确认是WAF拦截,可以添加规则放行你的认证接口路径。
内容的提问来源于stack exchange,提问作者Franco Pettigrosso
相关产品推荐
相关产品推荐

