Linux中國
構建一個即時消息應用(六):僅用於開發的登錄
本文是該系列的第六篇。
我們已經實現了通過 GitHub 登錄,但是如果想把玩一下這個 app,我們需要幾個用戶來測試它。在這篇文章中,我們將添加一個為任何用戶提供登錄的端點,只需提供用戶名即可。該端點僅用於開發。
首先在 main()
函數中添加此路由。
router.HandleFunc("POST", "/api/login", requireJSON(login))
登錄
此函數處理對 /api/login
的 POST 請求,其中 JSON body 只包含用戶名,並以 JSON 格式返回通過認證的用戶、令牌和過期日期。
func login(w http.ResponseWriter, r *http.Request) {
if origin.Hostname() != "localhost" {
http.NotFound(w, r)
return
}
var input struct {
Username string `json:"username"`
}
if err := json.NewDecoder(r.Body).Decode(&input); err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
defer r.Body.Close()
var user User
if err := db.QueryRowContext(r.Context(), `
SELECT id, avatar_url
FROM users
WHERE username = $1
`, input.Username).Scan(
&user.ID,
&user.AvatarURL,
); err == sql.ErrNoRows {
http.Error(w, "User not found", http.StatusNotFound)
return
} else if err != nil {
respondError(w, fmt.Errorf("could not query user: %v", err))
return
}
user.Username = input.Username
exp := time.Now().Add(jwtLifetime)
token, err := issueToken(user.ID, exp)
if err != nil {
respondError(w, fmt.Errorf("could not create token: %v", err))
return
}
respond(w, map[string]interface{}{
"authUser": user,
"token": token,
"expiresAt": exp,
}, http.StatusOK)
}
首先,它檢查我們是否在本地主機上,或者響應為 404 Not Found
。它解碼主體跳過驗證,因為這只是為了開發。然後在資料庫中查詢給定用戶名的用戶,如果沒有,則返回 404 NOT Found
。然後,它使用用戶 ID 作為主題發布一個新的 JSON Web 令牌。
func issueToken(subject string, exp time.Time) (string, error) {
token, err := jwtSigner.Encode(jwt.Claims{
Subject: subject,
Expiration: json.Number(strconv.FormatInt(exp.Unix(), 10)),
})
if err != nil {
return "", err
}
return string(token), nil
}
該函數執行的操作與 前文 相同。我只是將其移過來以重用代碼。
創建令牌後,它將使用用戶、令牌和到期日期進行響應。
種子用戶
現在,你可以將要操作的用戶添加到資料庫中。
INSERT INTO users (id, username) VALUES
(1, 'john'),
(2, 'jane');
你可以將其保存到文件中,並通過管道將其傳送到 Cockroach CLI。
cat seed_users.sql | cockroach sql --insecure -d messenger
就是這樣。一旦將代碼部署到生產環境並使用自己的域後,該登錄功能將不可用。
本文也結束了所有的後端開發部分。
via: https://nicolasparada.netlify.com/posts/go-messenger-dev-login/
作者:Nicolás Parada 選題:lujun9972 譯者:gxlct008 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive
對這篇文章感覺如何?
太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
More in:Linux中國
如何通過 VLC 使用字幕
使用 VLC 媒體播放器播放和管理字幕的新手指南。
Unix 桌面:在 Linux 問世之前
僅僅開源還不足以實現開放,還需開放標準和建立共識。
Valve 對於 Ubuntu 的 Snap 版本的 Steam 並不滿意:原因何在
你可能會發現,Snap 版本的 Steam 並不如你期待的那樣好,你怎麼看?
Wine 9.0 發布,實驗性地加入了 Wayland 驅動
Wine 的這個新版本正在為未來做好準備!