前端的JWT怎么进行用户认证?

简介: 前端的JWT怎么进行用户认证?

实现用户认证和权限控制是Web应用开发中的重要部分,关系到用户的隐私和数据安全。在Go语言的后端开发中,一般会使用JSON Web Tokens(JWT)搭配存储中间件(如Redis)来处理用户认证和权限控制。JWT是一个开放标准 (RFC 7519),它定义了一种自包含的方式,用于在各方之间安全地传输信息作为一个 JSON 对象。这种信息可以被验证和信任,因为它是数字签名的。


在用户认证的背景下,当用户使用他们的凭证(比如,用户名和密码)首次登录时,服务器会创建一个JWT,并将其发送回用户。此后,用户每次发出请求都会携带这个JWT,服务器接收到请求后会验证JWT,如果验证通过,就认为这是一个有效的、已经登录的用户。这种方式很好地解决了无状态的HTTP协议如何持久化用户状态的问题。


JWT的主题部分通常会包括用户ID及其他一些元数据,例如角色信息、过期时间等,作为后续授权过程的依据。一般来说,每个JWT会在创建时指定一个过期时间,以减少因为令牌泄露后被滥用的风险。


用户认证

用户在登录时,后端需要验证用户的用户名和密码。如果验证通过,后端将会创建一个JWT,并将其发送给用户。JWT包含了用户的一些基本信息,例如用户ID等,并且通过密钥加密,确保数据不会被篡改。

import (
  "github.com/dgrijalva/jwt-go"
  "time"
)

// 创建JWT
func createToken(user User) (string, error) {
  token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
    "id": user.ID,
    "expires":  time.Now().Add(time.Hour * time.Duration(1)).Unix(),
  })

  // Sign and get the complete encoded token as a string using the secret
  tokenString, err := token.SignedString([]byte("yourSecretKey"))

  return tokenString, err
}

权限控制

在用户完成登录后,每次发起的请求都必须包含JWT。服务器接收到请求后,将解码JWT,然后获取到用户的身份信息,此时我们可以针对不同的用户实施不同的权限控制。

// 验证JWT并检查用户权限
func authenticateMiddleware(endpoint func(http.ResponseWriter, *http.Request)) http.HandlerFunc {
  return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    tokenStr := r.Header.Get("Authorization")
    token, err := jwt.Parse(tokenStr, func(token *jwt.Token) (interface{}, error) {
      return []byte("yourSecretKey"), nil
    })

    if err != nil {
      http.Error(w, "Not authorized", 401)
      return
    }

    if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
      userId := claims["id"].(string)
      // get user from db and check user's roles
      user := getUserFromDB(userId)
      if user.Role != "admin" {
        http.Error(w, "Not authorized", 401)
        return
      }
    } 
    endpoint(w,r)
  })
}

这样,我们就可以在路由中使用此中间件函数来进行权限检查:

router.HandleFunc("/admin", authenticateMiddleware(adminHandler)).Methods("GET")

JWT安全性

在使用JWT(JSON Web Tokens)进行用户认证时,确保其安全性是非常重要的。以下是一些可以帮助提高JWT安全性的技巧和最佳实践:

  1. 使用安全的签名算法:JWT 支持多种签名算法,其中 HS256 是最常用的一种。然而,更安全的选择是使用 RS256,这是一种基于公钥/私钥的签名方式,只有持有私钥的服务器才能创建和签名 JWT,而公钥可以分发给任何需要验证 JWT 的人。
  2. 不在 JWT 中存储敏感数据:即使 JWT 是加密的,但任何人都可以解码并查看 JWT 的内容。因此,你应该避免在 JWT 中存储敏感信息,例如用户的密码或者其他私人信息。
  3. 设置短一些的过期时间:为 JWT 设置适当的过期时间可以降低其被盗用的风险。过期时间的设置应基于你的应用:如果你的应用安全性要求很高,那么你应该设置比较短的过期时间,例如 15 分钟;相反,如果不需要很高的安全性,那么你可以设置较长的过期时间。
  4. 使用 HTTPS:你应该始终通过 HTTPS 来传输 JWT,这样可以防止 JWT 在传输过程中被拦截。
  5. 使用“黑名单”:如果你的应用需要支持登出功能或者你希望能够主动废除 JWT,那么你可以维护一个 JWT 黑名单。每次接收到请求时,你都检查一下该 JWT 是否在黑名单中。一旦用户登出或者 JWT 被废除,就将其加入黑名单。

如果上面的内容对你有帮助,请点赞收藏哦,我会分享更多的知识。

相关文章
|
API PHP
PHP使用jwt生成token,做api的用户认证firebase/php-jwt
PHP使用jwt生成token,做api的用户认证firebase/php-jwt
548 0
|
4月前
|
JSON 安全 Java
使用Spring Boot和JWT实现用户认证
使用Spring Boot和JWT实现用户认证
|
3月前
|
JSON 前端开发 Java
Spring Boot JWT 用户认证
Spring Boot JWT 用户认证
17 0
|
存储 安全 前端开发
SpringBoot整合Spring Security + JWT实现用户认证
SpringBoot整合Spring Security + JWT实现用户认证的实现
5466 1
SpringBoot整合Spring Security + JWT实现用户认证
|
6月前
|
JSON 安全 网络安全
超详细的用户认证、权限、安全原理详解(认证、权限、JWT、RFC 7235、HTTPS、HSTS、PC端、服务端、移动端、第三方认证等等)
超详细的用户认证、权限、安全原理详解(认证、权限、JWT、RFC 7235、HTTPS、HSTS、PC端、服务端、移动端、第三方认证等等)
1025 0
|
安全 Java 数据库
Spring Security并结合JWT实现用户认证(Authentication) 和用户授权(Authorization)
在Web应用开发中,安全一直是非常重要的一个方面。Spring Security基于Spring 框架,提供了一套Web应用安全性的完整解决方案。
633 0
|
缓存 安全 算法
用户认证(Authentication)进化之路:由Basic Auth到Oauth2再到jwt
用户认证是一个在web开发中亘古不变的话题,因为无论是什么系统,什么架构,什么平台,安全性是一个永远也绕不开的问题 在HTTP中,基本认证(Basic access authentication)是一种用来允许网页浏览器或其他客户端程序在请求时提供用户名和口令形式的身份凭证的一种登录验证方式。
用户认证(Authentication)进化之路:由Basic Auth到Oauth2再到jwt
|
开发框架 缓存 小程序
ASP.NET Core: 二十六. 应用JWT进行用户认证及Token的刷新(二)
本文将通过实际的例子来演示如何在ASP.NET Core中应用JWT进行用户认证以及Token的刷新方案.
330 0
ASP.NET Core: 二十六. 应用JWT进行用户认证及Token的刷新(二)
|
监控 前端开发 数据可视化
前端:vue3+ts,后端:koa2+jwt,实现登陆功能(后端部分上篇)
前端:vue3+ts,后端:koa2+jwt,实现登陆功能(后端部分上篇)
|
前端开发 JavaScript
前端:vue3+ts,后端:koa2+jwt,实现登陆功能(前端部分)
前端:vue3+ts,后端:koa2+jwt,实现登陆功能(前端部分)