Golang Google云端硬盘Oauth2不返回刷新令牌

I am able to go through the oauth procedure to get a token which I'm able to successfully use to to interact with GDrive. The token has an AccessToken but no RefreshToken. How do I get a RefreshToken?

This is in a web service. Here's the code that initiates the oauth authorization procedure:

// Set up a configuration.
oauthconfig := &oauth2.Config{
    ClientID:     XXX,
    ClientSecret: XXX,
    RedirectURL:  "https://MYDOMAIN/gdrivecb",
    Scopes:       []string{"https://www.googleapis.com/auth/userinfo.profile", "https://www.googleapis.com/auth/drive"},
    Endpoint: oauth2.Endpoint{
        AuthURL:  "https://accounts.google.com/o/oauth2/auth",
        TokenURL: "https://accounts.google.com/o/oauth2/token",
    },
}
url := oauthconfig.AuthCodeURL(MYSCOPEDATA, oauth2.AccessTypeOffline)
http.Redirect(w, r, url, http.StatusFound)

Here's the relevant code that's called when /gdrivecb is called (oauthconfig is the same as before, code is the code URL parameter:

token, err = oauthconfig.Exchange(nil, code)

That token contains an AccessToken but no RefreshToken. And it works for an hour (the length of Expiry), but then stops working after that.

The problem was not with the code, and the code works if you've never gone through the authorization process before. The problem occurs if you go through the authorization process a second time. You are not shown the privileges being asked for, and a refresh token is not sent. You must force the privileges dialog to be shown again. To do so, add approval_prompt=force to the redirect URL.