From 527745ad15b6464f231282a460af94809813e06c Mon Sep 17 00:00:00 2001 From: steven Date: Fri, 10 Dec 2021 15:14:20 +0800 Subject: [PATCH] update github oauth callback api --- .gitignore | 3 + api/auth.go | 127 ++++++++++++++++++++++++ main.go | 2 +- resources/memos.db | Bin 45056 -> 45056 bytes web/src/App.tsx | 1 - web/src/components/MyAccountSection.tsx | 2 +- 6 files changed, 132 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 78660904..abc64caf 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,9 @@ *.log tmp +# Config +config + # Air (hot reload) generated .air diff --git a/api/auth.go b/api/auth.go index 7d69d15f..b93215bf 100644 --- a/api/auth.go +++ b/api/auth.go @@ -1,8 +1,14 @@ package api import ( + "bytes" + "database/sql" "encoding/json" + "fmt" + "io/ioutil" "memos/api/e" + "memos/common" + "memos/config" "memos/store" "net/http" @@ -88,10 +94,131 @@ func handleUserSignOut(w http.ResponseWriter, r *http.Request) { }) } +func handleGithubAuthCallback(w http.ResponseWriter, r *http.Request) { + code := r.URL.Query().Get("code") + + requestBody := map[string]string{ + "client_id": config.GITHUB_CLIENTID, + "client_secret": config.GITHUB_SECRET, + "code": code, + } + + requestJSON, _ := json.Marshal(requestBody) + + // POST request to get access_token + req, err := http.NewRequest( + "POST", + "https://github.com/login/oauth/access_token", + bytes.NewBuffer(requestJSON), + ) + + if err != nil { + e.ErrorHandler(w, "REQUEST_BODY_ERROR", "Error in request github api") + return + } + + req.Header.Set("Content-Type", "application/json") + req.Header.Set("Accept", "application/json") + + resp, err := http.DefaultClient.Do(req) + if err != nil { + e.ErrorHandler(w, "REQUEST_BODY_ERROR", "Error in request github api") + return + } + + // Response body converted to stringified JSON + respBody, _ := ioutil.ReadAll(resp.Body) + + // Represents the response received from Github + type GithubAccessTokenResponse struct { + AccessToken string `json:"access_token"` + TokenType string `json:"token_type"` + Scope string `json:"scope"` + } + + ghResp := GithubAccessTokenResponse{} + json.Unmarshal(respBody, &ghResp) + + githubAccessToken := ghResp.AccessToken + + // Get request to a set URL + req, err = http.NewRequest( + "GET", + "https://api.github.com/user", + nil, + ) + if err != nil { + e.ErrorHandler(w, "REQUEST_BODY_ERROR", "Error in request github api") + return + } + + authorizationHeaderValue := fmt.Sprintf("token %s", githubAccessToken) + req.Header.Set("Authorization", authorizationHeaderValue) + + resp, err = http.DefaultClient.Do(req) + + if err != nil { + e.ErrorHandler(w, "REQUEST_BODY_ERROR", "Error in request github api") + return + } + + respBody, _ = ioutil.ReadAll(resp.Body) + + githubData := string(respBody) + + type GithubUser struct { + Login string `json:"login"` + Name string `json:"name"` + } + + githubUser := GithubUser{} + json.Unmarshal([]byte(githubData), &githubUser) + + session, _ := SessionStore.Get(r, "session") + userId := fmt.Sprintf("%v", session.Values["user_id"]) + + if userId != "" { + githubNameUsable, err := store.CheckGithubNameUsable(githubUser.Login) + + if err != nil { + e.ErrorHandler(w, "DATABASE_ERROR", "Error in CheckGithubNameUsable") + return + } + + if !githubNameUsable { + e.ErrorHandler(w, "DATABASE_ERROR", "Error in CheckGithubNameUsable") + return + } + + userPatch := store.UserPatch{ + GithubName: &githubUser.Login, + } + + store.UpdateUser(userId, &userPatch) + } + + user, err := store.GetUserByGithubName(githubUser.Login) + + if err == sql.ErrNoRows { + username := githubUser.Name + usernameUsable, _ := store.CheckUsernameUsable(username) + if !usernameUsable { + username = username + common.GenUUID() + } + user, _ = store.CreateNewUser(username, username, githubUser.Login, "") + } + + session.Values["user_id"] = user.Id + session.Save(r, w) + + http.Redirect(w, r, "/", http.StatusTemporaryRedirect) +} + func RegisterAuthRoutes(r *mux.Router) { authRouter := r.PathPrefix("/api/auth").Subrouter() authRouter.HandleFunc("/signup", handleUserSignUp).Methods("POST") authRouter.HandleFunc("/signin", handleUserSignIn).Methods("POST") authRouter.HandleFunc("/signout", handleUserSignOut).Methods("POST") + authRouter.HandleFunc("/github", handleGithubAuthCallback).Methods("GET") } diff --git a/main.go b/main.go index 50bc2e90..a8f2b8b4 100644 --- a/main.go +++ b/main.go @@ -13,8 +13,8 @@ func main() { r := mux.NewRouter().StrictSlash(true) - api.RegisterUserRoutes(r) api.RegisterAuthRoutes(r) + api.RegisterUserRoutes(r) api.RegisterMemoRoutes(r) api.RegisterQueryRoutes(r) diff --git a/resources/memos.db b/resources/memos.db index e420b8d2c0538112aba7df00e609736db8ac91e2..5f0e267e6150493bf7aa4bac986b790f9ff8e526 100644 GIT binary patch delta 71 zcmZp8z|`=7X@WFk`$QRM)^-Lx>yH~#R{Aq4ZDte@=Vwfx*qFSzGrmQD@eEMlAU~t# b#70$aR%U)i111(`eon*1i~<6SCMW;^M>7<0 delta 69 zcmZp8z|`=7X@WFk>qHr6)>a0+;Dn7SEBzV$HZux1^D|mcY&7588Q&tn_#P = () => {

关联账号

-