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

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國