专栏首页用户8870853的专栏构建一个即时消息应用

构建一个即时消息应用

我们已经实现了通过 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

就是这样。一旦将代码部署到生产环境并使用自己的域后,该登录功能将不可用。

本文也结束了所有的后端开发部分。

原文链接:https://zhuanlan.zhihu.com/p/262486407

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 构建一个即时消息应用

    对于实时消息,我们将使用 服务器发送事件(Server-Sent Events)。这是一个打开的连接,我们可以在其中传输数据流。我们会有个端点,用户会在其中订...

    用户8870853
  • 构建一个即时消息应用(七):Access 页面

    这个 HTML 文件必须为每个 URL 提供服务,并且使用 JavaScript 负责呈现正确的页面。

    用户8870853
  • 【即时通信IM】红包消息如何构建?

    红包消息的话,与@消息类似,可以通过 TIMCustomElem 来实现。需要应用在UI上做相应的特殊处理,比如检查到当前消息为红包消息后,消息展示为红包的样式...

    腾讯即时通信IM
  • 用 OpenStack Designate 构建一个 DNS 即服务(DNSaaS)

    Designate 是一个多租户的 DNS 即服务,它包括一个用于域名和记录管理的 REST API 和集成了 Neutron 的框架,并支持 Bind9。

    用户8639654
  • 【译】教你用16个小时从0构建一个Rust应用

    我们之中有的人只是单纯为了好玩,有的是想学一些新的知识,还有些人可能是想证明一些概念或想法。

    Jackeyzhe
  • 构建第一个Flink应用-WordCount

    使用maven初始化第一个flink的wordcount应用,将应用打包上传到flink-standalone集群,运行起来。

    Eights
  • [翻译]使用 Velocity 构建一个web应用

    作为JSP的替代方案,Velocity 经常被用来在应用中生成web页面。使用Velocity生成页面的一些好处有:

    LeoXu
  • 构建企业级业务高可用的延时消息中

    扫库的方案一般体量不大时可以使用,当业务发展到一定规模后就不再适用。对IM消息重发秒级别的定时需求,只能增加扫库的频率,但过于频繁的扫库很可能会将数据库拖垮。显...

    孙玄@奈学教育
  • 构建Flink第一个应用程序

    Flink 可以运行在 Linux、Mac 以及 Windows 上。在这我们使用的是 Mac 系统。为了开发 Flink 应用程序,需要提前安装 Java 和...

    smartsi
  • 【笔记】快应用QuickApp(hap) -- 构建一个微博应用

    一、背景   在上次和小伙伴分享了快应用(后面简称hap)后,有很多待定的思路没有去尝试。这周有时间简单开发了一个热门微博的应用,主要涉及到的难点:富文本、长列...

    SmileSmith
  • 一个时代即将终结!安卓应用告别APK格式

    APK全称Android application package,意为“Android应用程序包”,是Android操作系统使用的一种应用程序包文件格式,用于分...

    昱良
  • 如何构建一套高可用的移动消息推送平台?

    消息推送作为移动 APP 运营中的一项关键技术,已经被越来越广泛的运用。本文追溯了推送技术的发展历史,剖析了其核心原理,并对推送服务的关键技术进行深入剖析,围...

    Java3y
  • Vuebnb:一个用vue.js和Laravel构建的全栈应用

    今年我一直在写一本新书叫全栈Vue网站开发:Vue.js,Vuex和Laravel。它会在Packt出版社在2018年初出版。

    笔阁
  • 如何使用wxPython构建一个GUI应用程序

    wxPython是Python语言的一套优秀的GUI图形库。我们可以使用Python程序很方便的创建完整的、功能键全的GUI用户界面。 wxPython是作为优...

    TalkPython
  • 构建一个带身份验证的 Deno 应用

    Node.js 的创建者 Ryan Dahl 创建了一个用于设计 Web 应用程序的新框架。他回过头来,利用在最初编写 Node 时还不可用的新技术,纠正了事后...

    疯狂的技术宅
  • 一小时内搭建一个全栈Web应用框架

    把想法变为现实的能力是空想家与实干家的区别。不管你是在一家跨国公司工作,还是正在为自己的创业公司而努力,那些有能力将创意转化为真正产品的人,都具有宝贵的技能并拥...

    疯狂的技术宅
  • Unity应用架构设计(11)——一个网络层的构建

    对于客户端应用程序,免不了和远程服务打交道。设计一个良好的『服务层』能帮我们规范和分离业务代码,提高生产效率。服务层最核心的模块一定是怎样发送请求,虽然Mon...

    用户1161731
  • [翻译]使用 Velocity 构建一个稳定安全的Web应用

    <p> draft document -- 2003年6月11日 </p> <p> 作为一名web开发者,任何时候当你构建一个Web应用时,有责任确保你的应用程...

    LeoXu
  • 仅用18行JavaScript构建一个倒数计时器

    因此,事不宜迟,这里介绍了如何仅用18行JavaScript来制作自己的倒计时时钟。

    Lemon黄

扫码关注云+社区

领取腾讯云代金券