I'm using google oauth services, provided by golang.org/x/oauth2 library. I can successfully login and get data as needed. Also, store token values in DB.
However, when logged in and I refresh the page, it results in an error,
This page isn’t working
localhost didn’t send any data.
ERR_EMPTY_RESPONSE
After getting some online references, I tried refresh_tokens, however, the error still persists.
Code for oauth2 client
const OauthGoogleUrlAPI = "https://www.googleapis.com/oauth2/v2/userinfo?access_token="
func OAuthClient(ctx context.Context, userId string) (client *http.Client, err error) {
var userToken *oauth2.Token
if userToken, err = GetToken(userId); err != nil {
if userToken, err = newToken(ctx, userId); err != nil {
return
}
}
if !userToken.Valid() { // if user token is expired
updatedToken, err := GoogleOauthConfig.TokenSource(context.TODO(), userToken).Token()
if err != nil {
log.Printf("\n\nError refreshing token ; Error : %s\n\n", err)
}
return GoogleOauthConfig.Client(ctx, updatedToken), err
}
return GoogleOauthConfig.Client(ctx, userToken), err
}
Here, GetToken retrieves existing tokens from db, newToken updates them in db.
The Callback Handler Code,
func GoogleCallBackHandler(w http.ResponseWriter, r *http.Request) {
var code string
temp = r.URL.Query()["code"]
for i := range temp {
code = temp[i]
}
token, err := GoogleOauthConfig.Exchange(context.Background(), code)
HandleError(err)
response, err := http.Get(OauthGoogleUrlAPI + token.AccessToken)
HandleError(err)
defer response.Body.Close()
user, err := ioutil.ReadAll(response.Body)
HandleError(err)
session, err := Store.Get(r, "authSession")
HandleError(err)
session.Values["user"] = string(user)
err = session.Save(r, w)
HandleError(err)
//Get user data in struct form
var userJson User
json.Unmarshal(user, &userJson)
//resp, err := client.Get("")
//database Store
err = InsertUserDetails(userJson, token.AccessToken, token.RefreshToken, token.Expiry)
HandleError(err)
w.Write([]byte("<html><head><title>Golang OAuth</title></head><body>" +
"Hi, " + string(user) + "<br>" +
"<a href='/logout'><button>Logout</button></a><br>" +
"</body></html>"))
client, err := UserOAuthClient(oauth2.NoContext, userJson.ID)
//resp, err := client.Get("")
}
the callback URL is of the form
http://localhost:3002/google/callback?state=state-token&code=4%2F0QGia33kbVbx2lsk92KFGEivY240zjnw9pnwmqJX_zZVCLbn_YASIMVcORIfK_ysNNYzCiBVzMc7qFJbjVjgfTM&scope=email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+openid&authuser=0&prompt=consent#
I'm confused about putting things together and about the flow. It'll be great if you could point out mistakes or make suggestions. Thanks!