当前位置: 首页 > 知识库问答 >
问题:

错误:无效请求缺少所需参数:golang中的client_id

归鹤龄
2023-03-14

我在使用Google OAuth2进行身份验证时遇到困难。

我已经从google开发者控制台获得了客户端ID和密码,我得到了以下代码:

package main

    import (
        "fmt"
        "golang.org/x/oauth2"
        "golang.org/x/oauth2/google"
        "io/ioutil"
        "net/http"
        "os"
    )

    const htmlIndex = `<html><body>
    <a href="/GoogleLogin">Log in with Google</a>
    </body></html>
    `

    func init() {
        // Setup Google's example test keys
        os.Setenv("CLIENT_ID", "somrestring-otherstring.apps.googleusercontent.com")
        os.Setenv("SECRET_KEY", "alongcharachterjumble")
    }

    var (
        googleOauthConfig = &oauth2.Config{
            RedirectURL:  "http://127.0.0.1:8080/auth",  //defined in Google console
            ClientID:     os.Getenv("CLIENT_ID"),
            ClientSecret: os.Getenv("SECRET_KEY"),
            Scopes: []string{"https://www.googleapis.com/auth/userinfo.profile",
                "https://www.googleapis.com/auth/userinfo.email"},
            Endpoint: google.Endpoint,
        }
        // Some random string, random for each request
        oauthStateString = "random"
    )

    func main() {
        http.HandleFunc("/", handleMain)
        http.HandleFunc("/GoogleLogin", handleGoogleLogin)
        http.HandleFunc("/GoogleCallback", handleGoogleCallback)
        fmt.Println(http.ListenAndServe(":8080", nil))
    }

    func handleMain(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, htmlIndex)
        fmt.Println("another request made")
    }

    func handleGoogleLogin(w http.ResponseWriter, r *http.Request) {
        url := googleOauthConfig.AuthCodeURL(oauthStateString)
        http.Redirect(w, r, url, http.StatusTemporaryRedirect)
    }

    func handleGoogleCallback(w http.ResponseWriter, r *http.Request) {
        state := r.FormValue("state")
        if state != oauthStateString {
            fmt.Printf("invalid oauth state, expected '%s', got '%s'\n", oauthStateString, state)
            http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
            return
        }

        code := r.FormValue("code")
        token, err := googleOauthConfig.Exchange(oauth2.NoContext, code)
        if err != nil {
            fmt.Println("Code exchange failed with '%s'\n", err)
            http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
            return
        }

        response, err := http.Get("https://www.googleapis.com/oauth2/v2/userinfo?access_token=" + token.AccessToken)

        defer response.Body.Close()
        contents, err := ioutil.ReadAll(response.Body)
        fmt.Fprintf(w, "Content: %s\n", contents)
    }

但我从谷歌得到这个错误:

错误:invalid_request

缺少必需的参数:client_id

了解更多

请求详细信息client _ id = redirect _ uri = http://127 . 0 . 0 . 1:8080/auth response _ type = code scope = https://www . Google APIs . com/auth/userinfo . profile https://www.googleapis.com/auth/userinfo.email状态=随机

这是怎么回事?我该如何修复它?

共有1个答案

司马飞
2023-03-14

错误消息指示客户端 ID 未初始化。

这看起来与代码一致,因为 var 声明是在 init 函数之前执行的。

因此,当您的 var 请求 os.Getenv(“CLIENT_ID”)该值为空,因为 init 尚未执行。

从文档中:

没有导入的包的初始化方法是将初始值分配给其所有包级变量,然后按照所有初始化函数在源代码中出现的顺序调用它们,可能在多个文件中,如呈现给编译器

https://golang.org/ref/spec#Package_initialization

要解决此问题,请将字符串直接放在 var 初始化中,或者在设置值后从 init 触发初始化。

喜欢:

var (
    googleOauthConfig *oauth2.Config
)

func init() {
     // init ENV
     // initialize the variable using ENV values
     googleOauthConfig = &oauth2.Config{ ... }
}

或者,您可以在执行实际的Go程序之前在操作系统级别设置这些ENV值。

 类似资料:
  • 我正在使用一个基于json请求的API,除了一个请求之外,所有的请求都在工作。默认情况下,有问题的请求不允许跨域,但使用“Cors”可以工作。问题是,当我使用cors服务器使用javascript测试请求时,它可以工作,但当我使用node.js测试请求时,它不能工作。 不起作用的代码: 这是有效的代码: 我的网站做这个网址的请求:http://gankei-backend.herokuapp.co

  • 问题内容: 我是OSGI的新手,我试图找出解决以下错误的方法 org.osgi.framework.BundleException:包org.foo.serviceBundle中未解决的约束[253]:无法解决253.0:缺少要求[253.0]包;未解决。(&(package = org.slf4j)(版本> = 1.6.0)(!(版本> = 2.0.0))) 我使用了Maven原型来生成包,并在

  • 我运行下面的谷歌地图路线API请求: https://maps.googleapis.com/maps/api/directions/json?origin=53.8495996301,-1.46446203532 这工作正常,并得到我的旅程时间结果,但是,当我添加traffic_model参数得到悲观的旅程时间如下: https://maps.googleapis.com/maps/api/di

  • 文档(http://developers.box.com/oauth/)建议使用POSTMAN或curl。 在本例中,clientID是123,秘密代码是456,以此类推。 我在获得步骤1中的代码后的30秒内完成所有这些操作。 错误为{“error”:“invalid_request”,“error_description”:“无效的grant_type参数或缺少参数”} 我尝试过的其他方法:添加

  • 问题内容: 将JSON数据从JSP传递到ResponseBody中的控制器时出错。 Ajax电话: 控制器: AppConfig.java @豆 请帮助我摆脱困境。我正在使用Spring 4,Jakson 2.3.0 如果我尝试POST请求,它将给出:org.springframework.web.HttpRequestMethodNotSupportedException:请求方法’POST’不

  • 我在堆栈溢出中找不到完全相同的问题。抱歉,如果这是一个重复的问题。我使用此代码片段将查询传递给表。 我传递所有需要的参数,因为使用jobs.queryAPI,我得到状态代码200,与结果,但在Python程序中集成片段,我得到以下错误: 文件"D:\应用程序\Python27\lib\site-包\oAuth2Client\_helpers.py",第133行,positional_wrapper