新聞中心
本文是該系列的第六篇。

- 第一篇: 模式
- 第二篇: OAuth
- 第三篇: 對話
- 第四篇: 消息
- 第五篇: 實時消息
我們已經(jīng)實現(xiàn)了通過 GitHub 登錄,但是如果想把玩一下這個 app,我們需要幾個用戶來測試它。在這篇文章中,我們將添加一個為任何用戶提供登錄的端點,只需提供用戶名即可。該端點僅用于開發(fā)。
首先在 main() 函數(shù)中添加此路由。
- router.HandleFunc("POST", "/api/login", requireJSON(login))
登錄
此函數(shù)處理對 /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)
- }
首先,它檢查我們是否在本地主機上,或者響應(yīng)為 404 Not Found。它解碼主體跳過驗證,因為這只是為了開發(fā)。然后在數(shù)據(jù)庫中查詢給定用戶名的用戶,如果沒有,則返回 404 NOT Found。然后,它使用用戶 ID 作為主題發(fā)布一個新的 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
- }
該函數(shù)執(zhí)行的操作與 前文 相同。我只是將其移過來以重用代碼。
創(chuàng)建令牌后,它將使用用戶、令牌和到期日期進行響應(yīng)。
種子用戶
現(xiàn)在,你可以將要操作的用戶添加到數(shù)據(jù)庫中。
- INSERT INTO users (id, username) VALUES
- (1, 'john'),
- (2, 'jane');
你可以將其保存到文件中,并通過管道將其傳送到 Cockroach CLI。
- cat seed_users.sql | cockroach sql --insecure -d messenger
就是這樣。一旦將代碼部署到生產(chǎn)環(huán)境并使用自己的域后,該登錄功能將不可用。
本文也結(jié)束了所有的后端開發(fā)部分。
- 源代碼
本文標題:構(gòu)建一個即時消息應(yīng)用(六):僅用于開發(fā)的登錄
文章起源:http://m.fisionsoft.com.cn/article/cdgssgo.html


咨詢
建站咨詢
