ERR_EMPTY_RESPONSE on refreshing page using google oauth2

Viewed 157

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!

0 Answers
Related