go - oauth2 无法获取 token : bad request

标签 go oauth request google-oauth token

我编写了一个回调处理程序来使用 Google 帐户登录:

func GoogleCallbackHandler(w http.ResponseWriter, r *http.Request) {
    conf:=&oauth2.Config{
        ClientID:"700740834863-m4om9r91htn19htq2b6a05fu6vu4j7i5.apps.googleusercontent.com",
        ClientSecret:"...-rB",
        RedirectURL:"http://localhost:3000/auth/google/callback",
        Scopes:[]string{"profile"},
        Endpoint:google.Endpoint,
    }

    fmt.Println(conf.AuthCodeURL("state"))

    code := r.URL.Query().Get("code")

    token, err := conf.Exchange(oauth2.NoContext, code)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    client := conf.Client(oauth2.NoContext, token)
    resp, err := client.Get("https://www.googleapis.com/userinfo/v2/me")
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    raw, err := ioutil.ReadAll(resp.Body)
    defer resp.Body.Close()
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    var profile map[string]interface{}
    if err := json.Unmarshal(raw, &profile); err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    session, _ := util.GlobalSessions.SessionStart(w, r)
    defer session.SessionRelease(w)

    session.Set("id_token", token.Extra("id_token"))
    session.Set("access_token", token.AccessToken)
    session.Set("profile", profile)

    // // Redirect to logged in page

    http.Redirect(w, r, "/user", http.StatusMovedPermanently)
}

main 中,我为处理程序提供服务

http.HandleFunc("/",route.IndexHandler)
http.HandleFunc("/auth/google/",route.GoogleCallbackHandler)
http.Handle("/user",negroni.New(
    negroni.HandlerFunc(route.IsAuthenticated),
    negroni.Wrap(http.HandlerFunc(route.UserHandler)),
))

我遇到了与我的旧问题相同的问题: oauth2 cannot fetch token: bad request

oauth2: cannot fetch token: 400 Bad Request
Response: {
  "error" : "invalid_request",
  "error_description" : "Missing required parameter: code"
}

我上次问过这个问题后,用我上面的代码搞定了,访问和获取数据成功了,但是昨晚突然又报这个错,上次之后怎么就不行了使用完全相同的代码几天

如何从 AuthCodeURL 获取 code?有没有办法在不重定向到任何其他处理程序的情况下获取用于交换的代码?我想在一个这个处理程序中处理所有事情

最佳答案

我可以通过添加一个处理程序来解决它

var (
    conf *oauth2.Config
)

func GoogleCallbackHandler(w http.ResponseWriter, r *http.Request) {
    conf=&oauth2.Config{
        ClientID:"700740834863-m4om9r91htn19htq2b6a05fu6vu4j7i5.apps.googleusercontent.com",
        ClientSecret:"...-rB",
        RedirectURL:"http://localhost:3000/auth/google/callback",
        Scopes:[]string{"profile"},
        Endpoint:google.Endpoint,
    }

    http.Redirect(w, r, conf.AuthCodeURL("state"), http.StatusMovedPermanently)
}

func GoogleLoginHandler(w http.ResponseWriter, r *http.Request) {
    code := r.URL.Query().Get("code")

    token, err := conf.Exchange(oauth2.NoContext, code)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    client := conf.Client(oauth2.NoContext, token)
    resp, err := client.Get("https://www.googleapis.com/userinfo/v2/me")
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    raw, err := ioutil.ReadAll(resp.Body)
    defer resp.Body.Close()
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    var profile map[string]interface{}
    if err := json.Unmarshal(raw, &profile); err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    session, _ := util.GlobalSessions.SessionStart(w, r)
    defer session.SessionRelease(w)

    session.Set("id_token", token.Extra("id_token"))
    session.Set("access_token", token.AccessToken)
    session.Set("profile", profile)

    http.Redirect(w, r, "/user", http.StatusMovedPermanently)
}

关于go - oauth2 无法获取 token : bad request,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36002536/

相关文章:

swift - 如何在 Swift 中使用 DispatchQueue 循环遍历 Alamofire 请求后收到通知?

go - 在 Go 上编译之前如何预检查和设置变量?

google-app-engine - 是否有可能从谷歌应用引擎的 panic 中恢复过来?

sql - 在 Go 中为 PGSQL 函数提供参数

android - 谷歌+安卓 : sign in failed

oauth - 如何简单地获取不记名 token 以向 Azure DevOps API 发送请求?

multithreading - 如何在使用 golang 创建的 wasm 中实现多线程?

c# - 使用 C# 和 OAuth 从 Twitter 获取用户的电子邮件地址

php - 如何在 codeigniter 中检查请求是 POST 还是 GET 请求?

python - 如何在python中使用beautifulsoup获取完整的href链接