没有来自 Google OAuth2 的刷新令牌

问题描述 投票:0回答:1

我似乎无法从 oauth2.Exchange() 获取正在测试的应用程序的刷新令牌。

config.Exchange(ctx, code, oauth2.AccessTypeOffline, oauth2.ApprovalForce)

返回没有refresh_token的访问令牌。更烦人的是,由于某种原因,

oauth2.ApprovalForce
不会提示OAuth同意屏幕。它仅在第一次提示,并且即使在第一次同意后,也不会返回刷新令牌。

通过调试器检查请求,请求正文中发送以下内容:

access_type=offline&client_id=...&client_secret=...&grant_type=authorization_code&prompt=consent&redirect_uri=...

所以图书馆应该运转良好。我添加了自定义选项

SetAuthURLParam("approval_prompt", "force")

这似乎也不起作用

编辑:添加代码片段

启动 OAuth 流程:

func TestRegister(ctx context.Context, c *app.RequestContext) {
    var err error
    var req register.RegisterReq

    // ...

    var oauthState string
    if oauthState, err = getOAuthState(c); err != nil {
        c.JSON(400, map[string]any{"Error": err.Error()})
        return
    }

    url := config.AuthCodeURL(oauthState)
    c.Redirect(http.StatusTemporaryRedirect, []byte(url))
    return
}

func getOAuthState(c *app.RequestContext) (string, error) {
    expiration := 60 * 60 * 24
    cookieName := "authstate"
    b := make([]byte, 16)
    var err error
    if _, err = rand.Read(b); err != nil {
        return "", err
    }
    state := base64.URLEncoding.EncodeToString(b)
    c.SetCookie(cookieName, state, expiration, "/", "localhost", protocol.CookieSameSiteLaxMode, false, false)
    return state, nil
}

OAuth 回调

func TestOauthCallback(ctx context.Context, c *app.RequestContext) {
    var err error
    var req register.OauthCallbackReq

    // ...

    queryArgs := &register.OauthCallbackReq{}
    if err = c.BindQuery(queryArgs); err != nil {
        c.JSON(500, map[string]any{"Error": err.Error()})
        return
    }

    var token *oauth2.Token
    if token, err = oauthAuthorize(ctx, queryArgs); err != nil {
        c.JSON(500, map[string]any{"Error": err.Error()})
        return
    }

    _ = token

    // ...
}

func oauthAuthorize(ctx context.Context, queryArgs *register.OauthCallbackReq) (*oauth2.Token, error) {
    var token *oauth2.Token
    var err error
    if token, err = config.Exchange(ctx, code, oauth2.AccessTypeOffline, oauth2.ApprovalForce); err != nil {
        return nil, err
    }
    return token, err
}

编辑2

看来您应该在 AuthCodeURL() 中提供

oauth2.AccessTypeOffline
oauth2.ApprovalForce
参数,而不是在请求访问令牌时提供 🤡

go oauth-2.0 oauth google-oauth
1个回答
2
投票

您似乎应该在启动 OAuth 进程时而不是在请求访问令牌时在 AuthCodeURL() 中提供 oauth2.AccessTypeOffline 和 oauth2.ApprovalForce 参数🤡

url := googleproject.OauthConfig.AuthCodeURL(oauthState, oauth2.ApprovalForce, oauth2.AccessTypeOffline)

@LindaLawton-DaImTo 感谢您提供的示例

© www.soinside.com 2019 - 2024. All rights reserved.