构建一个即时消息应用(六):仅用于开发的登录
创始人
2024-03-02 05:55:24
0

本文是该系列的第六篇。

我们已经实现了通过 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中国 荣誉推出

相关内容

硬核观察 #353 X.o...
X.org “大眼睛” 11 年来发布第一个小版本X.Org/X1...
2024-03-02 08:11:09
构建一个即时消息应用(九)...
本文是该系列的第九篇,也是最后一篇。第一篇: 模式第二篇: OAu...
2024-03-02 05:59:04
构建一个即时消息应用(八)...
本文是该系列的第八篇。第一篇: 模式第二篇: OAuth第三篇: ...
2024-03-02 05:58:13
构建一个即时消息应用(七)...
本文是该系列的第七篇。第一篇: 模式第二篇: OAuth第三篇: ...
2024-03-02 05:56:54
构建一个即时消息应用(四)...
本文是该系列的第四篇。第一篇: 模式第二篇: OAuth第三篇: ...
2024-03-02 05:55:36
构建一个即时消息应用(六)...
本文是该系列的第六篇。第一篇: 模式第二篇: OAuth第三篇: ...
2024-03-02 05:55:24

热门资讯

使用 KRAWL 扫描 Kub... 用 KRAWL 脚本来识别 Kubernetes Pod 和容器中的错误。当你使用 Kubernet...
Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
通过 SaltStack 管理... 我在搜索Puppet的替代品时,偶然间碰到了Salt。我喜欢puppet,但是我又爱上Salt了:)...
Epic 游戏商店现在可在 S... 现在可以在 Steam Deck 上运行 Epic 游戏商店了,几乎无懈可击! 但是,它是非官方的。...
如何在 Github 上创建一... 学习如何复刻一个仓库,进行更改,并要求维护人员审查并合并它。你知道如何使用 git 了,你有一个 G...
2024 开年,LLUG 和你... Hi,Linuxer,2024 新年伊始,不知道你是否已经准备好迎接新的一年~ 2024 年,Lin...
什么是 KDE Connect... 什么是 KDE Connect?它的主要特性是什么?它应该如何安装?本文提供了基本的使用指南。科技日...
JStock:Linux 上不... 如果你在股票市场做投资,那么你可能非常清楚投资组合管理计划有多重要。管理投资组合的目标是依据你能承受...
Opera 浏览器内置的 VP... 昨天我们报道过 Opera 浏览器内置了 VPN 服务,用户打开它可以防止他们的在线活动被窥视。不过...
Bazzite:专为 Stea... 为 Linux 桌面或者 Steam Deck 做好游戏准备,听起来都很刺激!对于一个专为 Linu...