前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >构建一个即时消息应用

构建一个即时消息应用

作者头像
用户8870853
修改于 2021-09-13 09:51:14
修改于 2021-09-13 09:51:14
50900
代码可运行
举报
运行总次数:0
代码可运行

我们已经实现了通过 GitHub 登录,但是如果想把玩一下这个 app,我们需要几个用户来测试它。在这篇文章中,我们将添加一个为任何用户提供登录的端点,只需提供用户名即可。该端点仅用于开发。

首先在 main() 函数中添加此路由

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
router.HandleFunc("POST", "/api/login", requireJSON(login))

登录

此函数处理对 /api/login 的 POST 请求,其中 JSON body 只包含用户名,并以 JSON 格式返回通过认证的用户、令牌和过期日期。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 令牌。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
}

该函数执行的操作与 前文 相同。我只是将其移过来以重用代码。

创建令牌后,它将使用用户、令牌和到期日期进行响应。

种子用户

现在,你可以将要操作的用户添加到数据库中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSERT INTO users (id, username) VALUES
    (1, 'john'),
    (2, 'jane');

你可以将其保存到文件中,并通过管道将其传送到 Cockroach CLI。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cat seed_users.sql | cockroach sql --insecure -d messenger

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

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

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Go使用JWT完成认证
在应用开发中,使用令牌(Token)是一种常见的身份验证和授权机制。以下是一些使用令牌的主要原因:
孟斯特
2023/12/08
7494
Go使用JWT完成认证
Fabric区块链浏览器(2):用户认证
在上一篇文章[1]介绍如何解析区块数据时,使用session对客户端上传的pb文件进行区分,到期后自动删除。
孟斯特
2023/10/16
1900
Fabric区块链浏览器(2):用户认证
Go语言(十二)web编程
web编程 web编程基础 web的工作方式 http协议介绍 http请求体 http响应体 Web程序开发 基于“net/http”封装的web服务相关的功能 使用简单 func sayhel
alexhuiwang
2020/09/24
1.1K0
Go语言(十二)web编程
Kubernetes 中的用户与身份认证授权
本章主要简单阐述 Kubernetes 认证相关原理,最后以实验来阐述 Kubernetes 用户系统的思路。主要内容:
从大数据到人工智能
2023/02/21
2K0
Kubernetes 中的用户与身份认证授权
构建一个即时消息应用
对于实时消息,我们将使用 服务器发送事件(Server-Sent Events)。这是一个打开的连接,我们可以在其中传输数据流。我们会有个端点,用户会在其中订阅发送给他的所有消息。
用户8870853
2021/09/13
4860
从零开始实现简单的webapi框架【Golang 入门系列十一】
之前,已经讲过很多Golang的东西,比如基础语法,mysql的使用,redis的使用等等,感兴趣的可以看看以前的文章,https://www.cnblogs.com/zhangweizhong/category/1275863.html,
架构师精进
2019/08/23
7310
从零开始实现简单的webapi框架【Golang 入门系列十一】
使用JWT做RESTful API的身份验证-Go语言实现
在 使用Golang和MongoDB构建 RESTful API已经实现了一个简单的 RESTful API应用,但是对于有些API接口需要授权之后才能访问,在这篇文章中就用 jwt 做一个基于Token的身份验证,关于 jwt 请访问 JWT有详细的说明,而且有各个语言实现的库,请根据需要使用对应的版本。
李海彬
2018/07/26
1.5K0
使用JWT做RESTful API的身份验证-Go语言实现
使用Golang和MySQL开发预约系统
在当今数字化的时代,预约系统在各个领域都得到了广泛的应用,如医院挂号预约、餐厅预订、旅行酒店预订等。本文将详细介绍如何使用Golang和MySQL开发一个简单的预约系统,涵盖系统的需求分析、数据库设计、代码实现以及测试和部署等方面。
用户3484293
2025/01/21
1160
Go sql-web
今天把database/sql部分的内容学习了一下,然后写了一个小项目,巩固一下,代码整体不难。
f1sh
2024/08/01
642
Beego学习——Jwt实现用户登录注册
启动: bee run -gendoc=true -downdoc=true 文章内容中有的注释是个人的理解,可能不严谨 使用 mysql 的话记得导入包: _ "github.com/go-sql-driver/mysql" 1. models包 1.1 jwt.go // JWT : header payload signature // json web token: 标头 有效负载 签名 const ( SecretKEY string = "JWT-Se
传说之下的花儿
2023/04/16
7930
Gin框架dgrijalva/jwt-go实例(JWT用户认证)
JWT(JSON Web Token)是一个非常轻巧的规范,这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息, 一个JWT由三部分组成,
OwenZhang
2021/12/08
8530
Gin框架dgrijalva/jwt-go实例(JWT用户认证)
Go语言的测试:编写单元测试和性能测试
在实际开发中,测试是保证代码质量和稳定性的重要手段。Go语言的testing包提供了一种简单而强大的方法来编写单元测试和性能测试。通过编写单元测试,可以验证每个函数和方法的正确性;通过编写性能测试评估代码的运行效率并进行优化。
数字扫地僧
2024/06/22
1620
朝花夕拾-后端-golang&mangodb-登录登出token失效
在线体验 https://cssbattle.wuwenzhou.com.cn/index 在线体验地址 设计 登录逻辑 业务请求token拦截逻辑 登出逻辑 技术预演 数据库 redis比mangodb更适合在这样的高频读写场景 网站初期访问量是个位数级别的 mangodb的TTL索引功能可以实现文档数据指定失效时间golang mongo-driver是一个较高使用的包 gin框架也是在golang的web框架中比较知名 gin的中间件方法在当前项目机制下面能够很好的实现token拦
吴文周
2022/03/10
5580
朝花夕拾-后端-golang&mangodb-登录登出token失效
Beego JWT 鉴权
谈起web应用,登录鉴权是必不可少的一步。beego应用当然也需要鉴权。今天我结合我目前在做的项目谈一下jwt鉴权。
会呼吸的Coder
2020/02/17
3.9K0
Beego JWT 鉴权
基于Openresty+Lua实现微服务Api 网关
微服务网关(Microservices Gateway)是微服务架构中的一种关键组件,它作为一个入口点,接收客户端的请求并将其路由到相应的微服务上。它起到了前端与后端微服务之间的“门户”的作用,协调整个微服务系统的请求流量和服务访问。具备的功能如下:
用户1107783
2023/09/11
1.7K0
基于Openresty+Lua实现微服务Api 网关
上机面试:三分钟把JWT算法改成RSA
所以实战点的东西来了,当面试官让你把 RSA 签名算法整合到 JWT 里面,该怎么处理呢?
小锟哥哥
2022/05/10
5460
上机面试:三分钟把JWT算法改成RSA
Fabric区块链浏览器(3)
在上一篇文章[2]中给浏览器增加了简单的用户认证,至此浏览器的基本功能就已经大致完成了。
孟斯特
2023/10/19
2910
Fabric区块链浏览器(3)
基于gin的golang web开发:实现用户登录
前文分别介绍过了Resty和gin-jwt两个包,Resty是一个HTTP和REST客户端,gin-jwt是一个实现了JWT的Gin中间件。本文将使用这两个包来实现一个简单的用户登录功能。
huofo
2022/03/18
1.6K0
使用dex搭建一个身份认证系统
一个成熟的软件系统一般必须有一个可靠的身份认证与权限验证功能。这一块要自研快速实现还是需要花费挺多精力的,幸好开源领域目前已经有不错的解决方案,一般拿过来按项目的实际需求进行一些简单的定制基本就可以实现业务目标了。最近刚好在这方面进行了一些工作,这里将如何实现身份认证及权限验证分两篇博文大概梳理一下,这篇先讲身份认证。
jeremyxu
2019/08/07
2.9K0
gin博客项目复盘--05 JWT全面解读、详细使用步骤
JWT由3部分组成:标头(Header)、有效载荷(Payload)和签名(Signature)。在传输的时候,会将JWT的3部分分别进行Base64编码后用.进行连接形成最终传输的字符串。
微客鸟窝
2022/11/07
5310
gin博客项目复盘--05 JWT全面解读、详细使用步骤
相关推荐
Go使用JWT完成认证
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验