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
相关产品推荐
相关产品推荐

