登录
首页 >  Golang >  Go问答

学会正确处理golang oauth2 的错误

来源:stackoverflow

时间:2024-02-28 16:45:26 130浏览 收藏

“纵有疾风来,人生不言弃”,这句话送给正在学习Golang的朋友们,也希望在阅读本文《学会正确处理golang oauth2 的错误》后,能够真的帮助到大家。我也会在后续的文章中,陆续更新Golang相关的技术文章,有好的建议欢迎大家在评论留言,非常感谢!

问题内容

token, err := googleoauthconfig.exchange(context.background(), code)
if err != nil {
 fmt.fprintf(w, "err: %+v", err)
}

fprintf 的输出是:

err: oauth2: cannot fetch token: 401 unauthorized
response: {"error":"code_already_used","error_description":"code_already_used"}

我想检查“error”是否=“code_already_used”。对于我的生活,我无法弄清楚如何。

如何检查/返回/读取错误的“error”或“error_description”?

我查看了 oauth2 代码,它有点超出我的范围。

// retrieveToken takes a *Config and uses that to retrieve an *internal.Token.
// This token is then mapped from *internal.Token into an *oauth2.Token which is returned along
// with an error..
func retrieveToken(ctx context.Context, c *Config, v url.Values) (*Token, error) {
    tk, err := internal.RetrieveToken(ctx, c.ClientID, c.ClientSecret, c.Endpoint.TokenURL, v)
    if err != nil {
        if rErr, ok := err.(*internal.RetrieveError); ok {
            return nil, (*RetrieveError)(rErr)
        }
        return nil, err
    }
    return tokenFromInternal(tk), nil
}

怎么猜我正在尝试查看 (*retrieveerror) 部分。对吗?

谢谢!


解决方案


表达式:

(*retrieveerror)(rerr)

rerr 的类型从 *internal.retrieveerror 转换为 *retrieveerror。由于 retrieveerror 是在 oauth2 包中声明的,因此您可以将收到的错误输入到 *oauth2.RetrieveError 以获取详细信息。详细信息作为字节片包含在该类型的 body 字段中。

由于字节切片不是要检查的最佳格式,并且在您的情况下,字节似乎包含 json 对象,因此您可以通过预定义可以将这些详细信息解组到的类型来使您的生活更轻松。

即:

type errordetails struct {
    error            string `json:"error"`
    errordescription string `json:"error_description"`
}

token, err := googleoauthconfig.exchange(context.background(), code)
if err != nil {
    fmt.fprintf(w, "err: %+v", err)

    if rerr, ok := err.(*oauth2.retrieveerror); ok {
        details := new(errordetails)
        if err := json.unmarshal(rerr.body, details); err != nil {
            panic(err)
        }

        fmt.println(details.error, details.errordescription)
    }        
}

可以这样做。

arr := strings.Split(err.Error(), "\n")
        str := strings.Replace(arr[1], "Response: ", "", 1)
        var details ErrorDetails
        var json = jsoniter.ConfigCompatibleWithStandardLibrary

        err := json.Unmarshal([]byte(str), &details)
        if err == nil {
            beego.Debug(details.Error)
            beego.Debug(details.ErrorDescription)
        }

今天关于《学会正确处理golang oauth2 的错误》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>