如何从 Google OpenID Connect 获取 ID_token 的示例

我正在尝试从 OpenID 获取用户信息


https://developers.google.com/identity/protocols/OpenIDConnect#exchangecode


我从以下方面得到了象征性的回应:


tok, err := bookshelf.OAuthConfig.Exchange(context.Background(), code)

我可以检查tok并看到有一个id_token元素:


log.Printf("************ tok  contains %#v", tok)


2019/05/13 15:11:24 ************ tok  contains &oauth2.Token{AccessToken:"XXXXXXXXXXX", TokenType:"Bearer", RefreshToken:"", Expiry:time.Time{wall:0xbf2f2c6b181f7b0f, ext:3608126524112, loc:(*time.Location)(0x18516e0)}, raw:map[string]interface {}{"scope":"openid https://www.googleapis.com/auth/profile.emails.read", "token_type":"Bearer", "id_token":"Base64-encodedJSONobject", "access_token":"HASH", "expires_in":3600}}

我不明白如何从id_token. 在哪里可以找到从 JWT 获取负载的示例id_token?


当我试图解码id_token


id_token := base64.StdEncoding.DecodeString(tok.id_token)

我收到这些错误:


multiple-value base64.StdEncoding.DecodeString() in single-value context


/var/folders/mw/0y88j8_54bjc93d_lg3120qw0000gp/T/tmpbPyjTZappengine-go-bin/auth.go:133:49: tok.id_token undefined (type *oauth2.Token has no field or method id_token)

如何使用 OpenID 而不是 Google+ 实现与下面的fetchProfile函数等效的功能?


我能找到的唯一示例使用已弃用的 Google+ 库:

func oauthCallbackHandler(w http.ResponseWriter, r *http.Request) *appError {

    oauthFlowSession, err := bookshelf.SessionStore.Get(r, r.FormValue("state"))

    if err != nil {

        return appErrorf(err, "invalid state parameter. try logging in again.")

    }


    redirectURL, ok := oauthFlowSession.Values[oauthFlowRedirectKey].(string)

    // Validate this callback request came from the app.

    if !ok {

        return appErrorf(err, "invalid state parameter. try logging in again.")

    }


    code := r.FormValue("code")

    tok, err := bookshelf.OAuthConfig.Exchange(context.Background(), code)

    if err != nil {

        return appErrorf(err, "could not get auth token: %v", err)

    }


Golang 文档中有多少漏洞令人惊讶。


暮色呼如
浏览 192回答 2
2回答

海绵宝宝撒

尝试这个:type jwtClaims struct {    Iss string `json:"iss"`    Azp string `json:"azp"`    Aud string `json:"aud"`    Sub string `json:"sub"`    Hd string `json:"hd"`    Email string `json:"email"`    EmailVerified bool `json:"email_verified"`    AtHash  string `json:"at_hash"`    Nonce string `json:"nonce"`    Iat int `json:"iat"`    Exp int `json:"exp"`}func extractJwtClaims(token string) (*jwtClaims, error) {    tokenStruct := &jwtClaims{}    jwtParts := strings.Split(token, ".")    out, _ := base64.RawURLEncoding.DecodeString(jwtParts[1])    err := json.Unmarshal(out, &tokenStruct)    if err != nil {        return nil, err    }    return tokenStruct, nil}func main() {    token, _ := extractJwtClaims(tok.id_token)}

梦里花落0921

我得到了“id_token”,就像下面的代码一样。import "golang.org/x/oauth2"func GetIDTokenWithTokenInfo(tokenInfo *oauth2.Token) string {    rawIDToken := tokenInfo.Extra("id_token").(string)    return rawIDToken}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go