HTTP API 认证技术详解(三):JWT Authentication

这篇具有很好参考价值的文章主要介绍了HTTP API 认证技术详解(三):JWT Authentication。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

什么是 JWT Authentication 认证

JWT 的组成部分

JWT 的工作流程

使用 Golang 实现 JWT  Authentication 认证

安全注意事项

JWT Authentication 认证的优缺点

小结


HTTP API 认证技术主要用于验证客户端身份,并确保只有经过授权的实体才能访问受保护的资源。随着安全需求的日益增长,API 认证技术也在不断发展和演进。本文将详细讲解 Digest Access Authentication 认证技术。

什么是 JWT Authentication 认证

JWT(JSON Web Tokens)是一种开放标准(RFC 7519),定义了一种紧凑的、自包含的格式,用于实现网络应用程序中的身份验证和授权机制。

JWT 的组成部分

一个 JWT 通常由三部分组成,分别是头部(Header)、负载(Payload)和签名(Signature)。

  • 头部 (Header):这部分包含了 JWT 的元数据,如类型(通常是JWT)和所使用的签名算法(如 AES256 或 RSA)。
  • 负载 (Payload): 包含了实际需要传递的数据,通常包括用户的身份信息(如用户 ID)以及一些元数据(如令牌的有效期)。
  • 签名 (Signature):对前两部分进行签名以确保数据的完整性和真实性。服务端生成签名时会使用一个密钥,客户端使用这个密钥(或者公钥)来验证签名的有效性。

JWT 的工作流程

  1. 用户在客户端使用登录凭证(如用户名和密码)登录系统。
  2. 系统验证登录凭证的有效性,如果验证通过的话生成一个 JWT 并返回给客户端。
  3. 客户端存储 JWT,并在随后的请求中将其作为认证凭证发送给服务端。
  4. 服务端验证 JWT 的签名,并从中提取用户信息以完成认证过程。

使用 Golang 实现 JWT  Authentication 认证

  1. 实现生成 JWT 令牌的函数,首先需要一个处理 JWT 的库。github.com/dgrijalva/jwt-go 是 Go 中一个比较流行的 JWT 库,接下来会使用这个库来实现。简单示例代码如下:
package main

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

var jwtKey = []byte("my_secret_key")

type Claims struct {
    Username string `json:"username"`
    jwt.StandardClaims
}

func GenerateJWT(username string) (string, error) {
    expirationTime := time.Now().Add(5 * time.Minute)
    claims := &Claims{
       Username: username,
       StandardClaims: jwt.StandardClaims{
          ExpiresAt: expirationTime.Unix(),
       },
    }

    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    tokenString, err := token.SignedString(jwtKey)
    if err != nil {
       return "", err
    }
    return tokenString, nil
}

func main() {
    tokenString, err := GenerateJWT("user1")
    if err != nil {
       fmt.Println("Error generating token:", err)
       return
    }
    fmt.Println("Generated Token:", tokenString)
}

定义了一个 Claims 结构体,包含用户的用户名和标准 JWT 声明,使用了一个简单的密钥来签名令牌,并设置了5分钟的过期时间。

  1. 实现验证 JWT 令牌的函数,用户每次请求时,服务端需要验证 JWT 令牌。解析和验证JWT的示例代码如下:
func ValidateJWT(tokenString string) (*Claims, error) {
    claims := &Claims{}
    token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
       return jwtKey, nil
    })
    if err != nil {
       return nil, err
    }
    if !token.Valid {
       return nil, fmt.Errorf("invalid token")
    }
    return claims, nil
}
  1. 创建一个 HTTP 服务,完整代码如下:
package main

import (
    "encoding/json"
    "fmt"
    "github.com/dgrijalva/jwt-go"
    "net/http"
    "time"
)

var jwtKey = []byte("my_secret_key")

type Claims struct {
    Username string `json:"username"`
    jwt.StandardClaims
}

func GenerateJWT(username string) (string, error) {
    expirationTime := time.Now().Add(5 * time.Minute)
    claims := &Claims{
       Username: username,
       StandardClaims: jwt.StandardClaims{
          ExpiresAt: expirationTime.Unix(),
       },
    }

    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    tokenString, err := token.SignedString(jwtKey)
    if err != nil {
       return "", err
    }
    return tokenString, nil
}

func ValidateJWT(tokenString string) (*Claims, error) {
    claims := &Claims{}
    token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
       return jwtKey, nil
    })
    if err != nil {
       return nil, err
    }
    if !token.Valid {
       return nil, fmt.Errorf("invalid token")
    }
    return claims, nil
}

func Login(w http.ResponseWriter, r *http.Request) {
    // 假设我们从请求中获取用户名和密码
    username := r.FormValue("username")
    // password = r.FormValue("password")
    // 这里应该验证用户名和密码的正确性
    // 为了示例,我们假设任何用户名密码组合都是有效的
    tokenString, err := GenerateJWT(username)
    if err != nil {
       w.WriteHeader(http.StatusInternalServerError)
       return
    }
    w.Write([]byte(tokenString))
}

func Home(w http.ResponseWriter, r *http.Request) {
    tokenString := r.Header.Get("Authorization")
    claims, err := ValidateJWT(tokenString)
    if err != nil {
       w.WriteHeader(http.StatusUnauthorized)
       return
    }
    json.NewEncoder(w).Encode(claims)
}

func main() {
    http.HandleFunc("/login", Login)
    http.HandleFunc("/home", Home)
    http.ListenAndServe(":8080", nil)
}

有两个路由处理函数,Login 函数生成 JWT 并返回给用户。Home 函数则需要用户将 JWT作为 Authorization(也可以使用其他字段) 头部发送,以验证用户的请求。

安全注意事项

  • 应该使用满足复杂度要求的密钥,密钥不能硬编码在代码中。在生产环境中,应该使用配置中心或密钥管理系统来安全地存储密钥。
  • 尽量使用 HTTPS 协议通信,防止中间人攻击。
  • 应该给 JWT 设置一个合理的过期时间,减少令牌被盗用的风险。

JWT Authentication 认证的优缺点

JWT 的优点如下:

  • JWT 所有必要的信息都储存在令牌本身,不需要在服务器存储。这一特性非常适合分布式系统和微服务架构。
  • JWT 包含验证所需的所有信息,减少了查询数据库或存储系统的次数。
  • JWT 是基于 JSON 的,可以在不同的编程语言和平台之间轻松传输和处理。
  • 由于无需查询数据库验证用户的每个请求,可以提高应用程序的响应速度和性能。
  • JWT 可以通过 URL、POST 参数或在 HTTP 头中传输,使用起来非常灵活。
  • JWT 是一个开放标准(RFC 7519),有良好的社区支持和大量的库可以使用。
  • JWT 支持多种签名算法,如 AES256 和 RSA 等,可以确保令牌在传输过程中不被篡改。

JWT 的缺点如下:

  • JWT 一旦被颁发,在过期之前很难被吊销,除非在服务器端引入额外的逻辑来控制。
  • 由于 JWT 是自包含的,大小通常比其他的会话信息要大,可能会增加传输数据的负担。
  • 生成 JWT 使用的签名算法不够强大或者使用的密钥被泄露,那么 JWT 的信息就可能被解码。
  • JWT 的有效性依赖于时间戳,因此需要确保服务器和客户端之间的时间同步。
  • 对于需要细粒度控制用户会话的应用程序,使用 JWT 可能会增加实现的复杂性,因为需要在服务器端实现额外的逻辑来处理令牌的失效和刷新。

小结

JWT 是一种非常灵活的认证方式,可以用于多种场景,例如用户认证、服务间 API 调用认证等。但是 JWT 也存在固有的缺点,需要根据自己的使用场景做出最合适的选择。文章来源地址https://www.toymoban.com/news/detail-818768.html

到了这里,关于HTTP API 认证技术详解(三):JWT Authentication的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《开放平台鉴权方式详解:OAuth 2.0、API Key、HTTP Basic Authentication》

    当今开放平台已经成为了很多应用程序的核心,如何在保证用户数据安全的前提下,为第三方应用程序提供必要的数据访问权限,是开放平台鉴权方式设计的关键问题之一。本文将从 OAuth 2.0 、 API Key 和 HTTP Basic Authentication 三个方面来介绍开放平台主要鉴权方式。 之前写过一

    2024年02月10日
    浏览(35)
  • Golang实现更安全的HTTP基本认证(Basic Authentication)

    当搜索使用Go的HTTP基本身份验证示例时,我能找到的每个结果都不幸包含了过时的代码(即不使用Go1.4中引入的r.BasicAuth()功能)或不能防止定时攻击。本文介绍如何实现更安全的HTTP基本认证代码。 你一定遇到,当通过浏览器访问一些URL时提示输入用户名和密码。再你输入用户名

    2024年02月10日
    浏览(46)
  • API身份认证JWT

    是一种身份认证的开放标准(RFC 7519),可以在网络应用间传输信息作为Json对象。由三部分组成:头部(Header)、载荷(payload)和签名(Signature). 头部(Header) 两部分组成,令牌类型和所使用的的签名算法   载荷(payload) 包含要传输的信息,包括用户的身份信息、权限等。载

    2024年02月13日
    浏览(39)
  • 使用 Go HTTP 框架 Hertz 进行 JWT 认证

    上一篇文章简单介绍了一个高性能的 Go HTTP 框架——Hertz,本篇文章将围绕 Hertz 开源仓库的一个 demo,讲述如何使用 Hertz 完成 JWT 的认证与授权流程。 这里要说明的是,hertz-jwt 是 Hertz 众多外部扩展组件之一,Hertz 丰富的扩展生态为开发者带来了很大的便利,值得你在本文之

    2024年02月22日
    浏览(41)
  • 【跨域认证】详解JWT,JWT是什么?

    JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案,本文介绍它的原理和用法。 互联网服务离不开用户认证。一般流程是下面这样。 1、用户向服务器发送用户名和密码。 2、服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等。

    2024年02月12日
    浏览(27)
  • Java中JWT技术解析与实践:安全高效的身份认证

    什么是JWT(JSON Web Token)? JWT是一种用于身份验证和授权的开放标准(RFC 7519),它是基于JSON格式的轻量级安全令牌。JWT由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。通常,JWT被用于在不同的系统之间传递安全性的声明信息,以便用户在跨域应用中进行身

    2024年02月05日
    浏览(59)
  • web学习--登录认证--会话技术--cookie--session--令牌--java-jwt使用--jjwt使用

    前置学习: http springmvc 会话:用户打开浏览器,访问web服务器资源,会话建立,直到有一方断开连接会话结束,一次会话可以多次请求和连接 会话跟踪:一种维护浏览器状态的方式,服务器需要识别多次请求是否来自同一浏览器,以便同一次会话多次请求间共享数据。 cooki

    2024年02月15日
    浏览(67)
  • 3-1. SpringBoot项目集成【用户身份认证】实战 【技术选型篇】基于Session、Token、JWT怎么选?

    通过第二章2-2. SpringBoot API开发详解 --SpringMVC注解+封装结果+支持跨域+打包,我们实现了基于SpringBoot项目的 API接口开发 ,并实现 API结果统一封装、支持跨域请求 等等功能,接下来开始第三章,主要做用户身份认证,主要实现一套 统一鉴权的用户身份认证的机制 。 我已经提

    2024年01月22日
    浏览(55)
  • JWT令牌技术(详解)

    全称:JSON Web Token 官网:https://jwt.io/ 定义了一种简洁的、自包含的格式,用于在通信双方以 json 数据格式 安全 的传输信息。由于数字签名的存在,这些信息是 可靠 的。 第一部分: Header(头) ,记录令牌类型、签名算法等。例如: {\\\"alg\\\":\\\"HS256\\\", \\\"type\\\":\\\"JwT\\\"} 第二部分: Payload(有效载荷

    2024年02月11日
    浏览(45)
  • Django DRF - 认证Authentication

    身份验证是将传入请求与一组标识凭据(例如,请求来自的用户或与其进行签名的令牌)相关联的机制。然后,权限和限制策略可以使用这些凭据来确定是否应允许该请求。 身份验证本身不会允许或不允许传入的请求,它只会标识发出请求的凭据。 认证管理一般和权限管理

    2023年04月12日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包