You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#发送x-www-form-urlencoded POST请求对接Google OAuth报错排查

问题定位

你遇到的校验失败完全是请求参数格式和配置错误导致的,核心问题有3个:

  • redirect_uri参数存在双重编码+多余字符:你传入的参数值是http%3A%2F%2Flocalhost%2Foauth2callback&。FormUrlEncodedContent会自动对传入的键值对做标准URL编码,你提前把地址编码相当于做了双重转义,再加上末尾多了&转义残片,最终传给Google的回调地址和你在控制台配置、拿授权码时传入的地址完全不匹配,这是触发安全校验拦截的核心原因。
  • 令牌接口地址过时:你调用的https://accounts.google.com/o/oauth2/token是Google废弃的旧版端点,当前服务端Web应用授权流程的标准令牌端点为https://oauth2.googleapis.com/token,旧端点会触发更严格的合规校验规则。
  • 冗余设置ContentType头:FormUrlEncodedContent实例化后默认就会携带符合规范的application/x-www-form-urlencoded请求头,手动重新赋值该头在部分.NET运行时版本下会丢失charset声明,反而触发请求格式校验错误。
修复后代码
using System;
using System.Collections.Generic;
using System.Net.Http;

namespace ConsoleApp1
{
    class Program
    {
        private static readonly HttpClient client = new HttpClient();
        
        static void Main(string[] args)
        {
            var endpoint = new Uri("https://oauth2.googleapis.com/token");

            var payload = new FormUrlEncodedContent(new[]
            {
                new KeyValuePair<string, string>("code", "替换为实际获取到的授权码,授权码单次有效、有效期10分钟"),
                new KeyValuePair<string, string>("client_id", "替换为Google Cloud控制台对应Web应用的Client ID"),
                new KeyValuePair<string, string>("client_secret", "替换为对应Client Secret"),
                // 直接传入原始未编码的回调地址,必须和控制台配置、获取授权码时传入的redirect_uri完全一致
                new KeyValuePair<string, string>("redirect_uri", "http://localhost/oauth2callback"),
                new KeyValuePair<string, string>("grant_type", "authorization_code"),
            });
            
            // 无需手动设置ContentType,FormUrlEncodedContent会自动生成合规请求头
            var response = client.PostAsync(endpoint, payload).Result;
            var result = response.Content.ReadAsStringAsync().Result;
            
            Console.WriteLine(result);
        }
    }
}
后续排查清单

如果修改后仍返回同类错误,按以下优先级核对配置:

  • 确认Google Cloud控制台中该应用的OAuth同意屏幕配置完成:如果应用处于「测试中」发布状态,你当前用于测试的谷歌账号必须添加到测试用户列表内
  • 确认全流程参数一致性:获取授权码时传入的client_id、redirect_uri,必须和兑换令牌时传入的两个参数值完全一致,末尾多斜杠、端口号不匹配、http/https混用都会直接触发校验失败
  • 确认授权码有效性:授权码仅能使用一次,获取后10分钟内失效,且和发起授权请求的客户端环境绑定,不可跨设备、跨IP复用

注意:对接x-www-form-urlencoded格式接口时最常见的错误就是手动提前编码参数,所有官方提供的表单内容实现类都会自动完成编码工作,双重编码会直接导致参数值和服务端预期不匹配。

内容的提问来源于stack exchange,提问作者CobaltGecko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 10:39:16