OAuth2 RestClient获取Token失败但Postman可正常获取的问题求助
问题排查与解决方法
- 缺失核心必填参数
Authorization Code授权码模式兑换访问令牌时,必须携带此前从授权端点获取到的code参数值,你的代码中完全未添加该参数,这是触发授权失败的核心原因之一。 - 参数命名与取值不符合OAuth2标准规范
OAuth2标准定义的令牌接口参数均为小写格式,你的代码中参数名和取值都存在错误:Grant_Type需改为grant_type,取值需改为authorization_code(全小写,中间用下划线连接,不能带空格)Client_ID需改为client_idClient_Secret需改为client_secretCallback_URL需改为redirect_uriScope需改为scope- 令牌接口不需要传递
Auth_URL参数,可直接删除该参数
- 客户端认证方式不匹配
你在Postman中配置的客户端认证方式为Send as Basic Auth header,该模式要求你将client_id:client_secret拼接后的字符串做Base64编码,再放到请求头Authorization: Basic 编码后的值中,你当前代码将客户端ID、密钥放在请求体中传递,不符合认证要求,会直接触发401未授权错误。 - 参数一致性校验
需确认redirect_uri的取值和你此前请求授权码时传递的回调地址完全一致,包括路径、参数、末尾斜杠都不能有差异,否则也会导致授权失败。
修正后代码参考
// 构造Basic Auth认证头 string clientId = "你的客户端ID"; string clientSecret = "你的客户端密钥"; string authHeaderValue = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{clientId}:{clientSecret}")); var client = new RestClient("https://id.sage.com/oauth/token"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", $"Basic {authHeaderValue}"); request.AddHeader("cache-control", "no-cache"); request.AddHeader("content-type", "application/x-www-form-urlencoded"); // 替换为你实际获取到的授权码code值 request.AddParameter("grant_type", "authorization_code"); request.AddParameter("code", "你从授权接口拿到的authorization_code值"); request.AddParameter("redirect_uri", "https://dummyaddress"); request.AddParameter("scope", "openid profile email offline_access"); IRestResponse response = client.Execute(request);
内容的提问来源于stack exchange,提问作者Shezad Ahmed
相关产品推荐
相关产品推荐

