前后端分离项目——后端如何使用Token

定义

token的意思是“令牌”,在代码中本质上是一种字符串,是用户身份的验证方式。

使用方式

  1. 在登陆时,服务端接收到客户端发来的登录信息(账号密码),在数据库中校验成功后,生成一个token,并将其响应给客户端。每个token对应一个用户。
  2. 客户端接收到token后,将其存储起来,之后每次调取后端接口时,都要在请求头中加上token。
  3. 服务端在后续的接口中,可以获取到请求头中的token,进而获取到token中附带的用户基本信息。

代码实现

1. 生成Token

在登录接口中,我们核对用户账号密码正确后,即可生成该用户的token。

// 生成token的密钥
var JwtKey = []byte("hahahahha")	// 小项目密钥值随便定义

// 存放关于token的基本信息
type Claims struct {
	User gorm_model.User	// 附带的该用户的信息
	jwt.StandardClaims
}

// 生成token
func ReleaseToken(user gorm_model.User) (tokenString string,err error) {
	expire := time.Now().Add(7 * 24 * time.Hour)	
	claims := &Claims{
		User: user,	// 用户个人信息
		StandardClaims: jwt.StandardClaims{
			ExpiresAt: expire.Unix(),    //token的有效时长
			IssuedAt: time.Now().Unix(), //token的创建时间
			Issuer: "xunxun",   //作者
			Subject: "user token",	     //主题
		},
	}
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	tokenString, err = token.SignedString(jwtKey) //根据前面自定义的Jwt秘钥生成token
	tokenString = "Bearer " + tokenString
	if err != nil {
		return "", err
	}
	return tokenString, nil
}

2. 解析Token

在生成完token并完成登录之后,后续的业务中,我们如何通过token获取到用户信息呢?我们先获取到请求头中的token,将其进行解析,解析之后就能取到其包含的用户信息。信息就包含在Claims结构体对象中。

// 解析token
func ParseToken(tokenString string) (*jwt.Token, *Claims, error) {
	claims := &Claims{}
	token,err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
		return jwtKey, nil
	})
	return token, claims, err
}

3.定义token中间件

token中间件用于判断token是否有效,并将用户信息注入到gin.Context中。这一步是必须要的,是项目安全性的保证。

// AuthMiddleware 中间件检验token是否合法
func AuthMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		// 获取请求头中的token
		tokenString := c.GetHeader("token")
		//验证token格式,不为空,开头为Bearer
		if tokenString == "" || !strings.HasPrefix(tokenString, "Bearer ") {
			response.ResponseErrorWithMsg(c, 400, "token不合法")
			c.Abort()
			return
		}
		//验证通过,提取有效部分(除去Bearer)
		tokenString = tokenString[7:] //截取字符
		//解析token
		token, _, err := ParseToken(tokenString)
		//解析失败||解析后的token无效
		if err != nil || !token.Valid {
			response.ResponseErrorWithMsg(c, 400, "token解析失败")
			c.Abort()
			return
		}
		c.Set("claim", token.Claims)
		c.Next()
	}
}

4. 给需要用到token的接口加上该token中间件

在这里插入图片描述

5. 在接口中获取到token附带的用户信息

	tokenString := c.GetHeader("token")	// 获取到请求头中的token
	tokenString = tokenString[7:]	
	token, _, _ := token.ParseToken(tokenString) // 解析token
	user := token.Claims.(*models.Claims).User	// 获取到token中附带的用户信息
### 前后端分离架构下后端HTTP升级HTTPS的方法 在前后端分离架构中,将后端服务从HTTP协议迁移到HTTPS涉及多个方面的工作。这不仅提升了通信的安全性,也确保了数据传输过程中的隐私性和完整性。 #### 配置Nginx支持SSL/TLS加密 为了使外部网络能够通过HTTPS访问应用服务器,可以在反向代理层——即Nginx上配置SSL证书来启用HTTPS连接[^2]。具体操作如下: 1. 获取有效的SSL证书文件(通常由受信任的CA颁发) 2. 将这些证书安装至Nginx所在的服务器 3. 修改Nginx配置文件以监听443端口,并设置相应的ssl参数指向私钥和公钥位置 4. 设置重定向规则,强制所有来自80端口(HTTP)的请求都转向443端口(HTTPS) ```nginx server { listen 80; server_name example.com; location / { return 301 https://$host$request_uri; } } server { listen 443 ssl http2; server_name example.com; ssl_certificate /etc/nginx/ssl/example.crt; ssl_certificate_key /etc/nginx/ssl/example.key; ... } ``` #### 更新应用程序内部链接为HTTPS 除了调整Nginx配置外,还需要检查并更新项目内的静态资源路径以及API接口地址,使其全部采用`https://`开头的形式。对于基于Spring Cloud Gateway构建的服务网关而言,则需特别注意路由定义部分是否已正确指定了目标微服务的新URL方案[^3]。 ```java @Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { return builder.routes() .route(r -> r.path("/hello") .filters(f -> f.addRequestHeader("Authorization", "Bearer")) .uri("https://httpbin.org")) // 使用 HTTPS URL .build(); } ``` #### 关闭不必要的HTTP功能特性 当完成上述更改之后,建议进一步优化安全性措施。例如,在前后端完全解耦的情况下可以考虑停用CSRF防护机制与Session管理组件,因为此时的身份验证依赖于Token而非传统的Cookie方式传递凭证信息[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值