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

OAuth2返回invalid_grant错误:未登录授权码格式异常求助

解决OAuth2示例代码未授权就出现invalid_grant错误的方案

问题根源

你的代码直接用硬编码的"authorization-code"调用conf.Exchange(),但这个授权码需要用户访问生成的链接、完成授权流程后才能获取到。程序跳过授权步骤直接执行交换逻辑,自然会触发invalid_grant错误。

修复步骤

  • 添加用户输入等待逻辑:输出授权链接后暂停程序,让用户复制链接到浏览器完成授权,再将页面返回的授权码输入到程序中。
  • 替换无效的硬编码值:把Exchange方法里的"authorization-code"替换为用户输入的真实授权码。
  • 校验重定向URL配置:确保Google开发者控制台中配置的重定向URL和代码里的RedirectURL完全一致(包含协议、端口、路径),否则授权码会被判定无效。
  • 注意授权码时效性:授权码仅单次有效,且有效期极短,获取后需立即使用。

修改后的示例代码

package main

import (
    "bufio"
    "fmt"
    "log"
    "os"

    "golang.org/x/oauth2"
    "golang.org/x/oauth2/google"
)

func main() {
    // 从Google开发者控制台获取你的凭证
    conf := &oauth2.Config{
        ClientID:     "YOUR_CLIENT_ID",
        ClientSecret: "YOUR_CLIENT_SECRET",
        RedirectURL:  "YOUR_REDIRECT_URL",
        Scopes: []string{
            "https://www.googleapis.com/auth/bigquery",
            "https://www.googleapis.com/auth/blogger",
        },
        Endpoint: google.Endpoint,
    }
    // 生成授权链接
    url := conf.AuthCodeURL("state")
    fmt.Printf("请访问以下链接完成授权:%v\n", url)
    fmt.Print("请输入授权码:")

    // 读取用户输入的授权码
    scanner := bufio.NewScanner(os.Stdin)
    scanner.Scan()
    authCode := scanner.Text()

    // 用授权码交换令牌
    tok, err := conf.Exchange(oauth2.NoContext, authCode)
    if err != nil {
        log.Fatal(err)
    }
    client := conf.Client(oauth2.NoContext, tok)
    // 替换为你实际要调用的API接口
    _, err = client.Get("https://www.googleapis.com/blogger/v3/users/self/blogs")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("授权成功,API调用完成")
}

内容的提问来源于stack exchange,提问作者H.Okan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 02:16:16