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

Blazor Server应用集成YouTubeService时Google Web授权出现redirect_uri_mismatch错误的解决咨询

Blazor Server应用集成YouTubeService时Google Web授权出现redirect_uri_mismatch错误的解决咨询

嗨,我来帮你搞定这个redirect_uri_mismatch的问题,这在Blazor Server集成Google OAuth的时候确实是个常见的坑,咱们一步步来梳理解决办法:

首先,搞懂问题根源

你现在用的LocalServerCodeReceiver是Google OAuth SDK为桌面/控制台应用设计的,它会在本地随机开一个临时端口来接收授权回调,但你在Google Cloud控制台只配置了https://localhost:5001,这就导致回调地址不匹配,直接抛出400错误。Blazor Server是服务器端Web应用,得用适合Web场景的授权流程才行。

解决步骤拆解

1. 修正Google Cloud控制台的重定向URI配置

你需要添加一个固定的回调地址到Google Cloud的“Authorised redirect URIs”里,比如:

  • 用Razor页面做回调:https://localhost:5001/OAuthCallback
  • 用API端点做回调:https://localhost:5001/api/youtube/callback

注意:一定要和你后续代码里设置的回调地址完全一致,包括HTTP/HTTPS、端口、路径,不能有任何差异。

2. 不需要专门的Blazor组件页面,用Razor页面/API端点就行

Blazor组件是交互式的,不适合做OAuth回调(因为回调是Google直接发起的HTTP请求,不需要Blazor的SignalR连接)。你只需要创建一个简单的Razor页面或者API控制器来处理回调请求:

  • 比如新建一个Pages/OAuthCallback.cshtml页面,用来接收Google返回的授权码,然后完成令牌交换流程。

3. 修改你的YouTubeApiService代码,适配Web应用流程

放弃GoogleWebAuthorizationBroker(它不适合Web场景),改用手动的授权码流程,大致步骤如下:
首先,生成授权URL让用户跳转:

public string GetAuthorizationUrl()
{
    var flow = new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
    {
        ClientSecrets = _clientSecrets,
        Scopes = Scopes,
        DataStore = new FileDataStore("YouTubeOAuthToken")
    });

    return flow.CreateAuthorizationCodeRequest("https://localhost:5001/OAuthCallback").Build();
}

然后,在回调页面的后台代码(比如OAuthCallback.cshtml.cs)里处理授权码交换:

public async Task<IActionResult> OnGetAsync(string code)
{
    var flow = new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
    {
        ClientSecrets = new ClientSecrets
        {
            ClientId = Configuration["YourClientId"],
            ClientSecret = Configuration["YourClientSecret"]
        },
        Scopes = new[] { YouTubeService.Scope.YoutubeReadonly },
        DataStore = new FileDataStore("YouTubeOAuthToken")
    });

    var token = await flow.ExchangeCodeForTokenAsync("user", code, "https://localhost:5001/OAuthCallback", CancellationToken.None);
    
    // 这里可以把令牌存储起来,后续用来初始化YouTubeService
    return RedirectToPage("/Index"); // 跳回你的Blazor页面
}

最后,在你的Blazor组件里,调用GetAuthorizationUrl()生成链接,让用户点击跳转授权,授权完成后回到回调页面处理令牌,再初始化YouTubeService。

4. 代码里的小错误要修正

你的代码里有个笔误:onfiguration["xxxxxxxx"]少了个字母c,应该是configuration["xxxxxxxx"],这个小问题也可能导致认证失败哦。

额外提醒

  • 如果你坚持要用GoogleWebAuthorizationBroker(不推荐),那你得把LocalServerCodeReceiver默认的回调地址(比如http://localhost:8080/)加到Google Cloud的重定向URI里,但这种方式在生产环境没法用,因为端口是随机的,所以还是建议用固定回调地址的Web流程。
  • 生产环境部署时,记得把实际的域名地址(比如https://yourdomain.com/OAuthCallback)加到Google Cloud的重定向URI里,替换本地的localhost地址。

备注:内容来源于stack exchange,提问作者Jim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 10:34:33