func (oc *OauthController) GetCallback(w http.ResponseWriter, r *http.Request) { // Generate config conf := oc.generateConfig() // Get the code from the request to callback handler code := r.URL.Query().Get("code") // Exchange code for access token token, err := conf.Exchange(oauth2.NoContext, code) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } // Get user details client := conf.Client(oauth2.NoContext, token) userDetails, err := oc.retrieveUserDetails(client) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } // Create or update user/token, persist to database userModel := new(models.User) _, isAlreadyRegistered := userModel.CreateOrUpdateUser(userDetails["data"].(map[string]interface{}), token) // Redirect user to appropriate landing page redirectPath := "/login" if !isAlreadyRegistered { redirectPath = "/register" } // Generate user cookie if cookie, err := oc.createSecureCookie(userModel); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } else { http.SetCookie(w, cookie) } // Do not forget the path prefix http.Redirect(w, r, pathPrefix+redirectPath, http.StatusMovedPermanently) }