1. 生成解析token

如今有很多将身份验证内置到API中的方法 -JSON Web令牌只是其中之一。JSON Web令牌(JWT)作为令牌系统而不是在每次请求时都发送用户名和密码,因此比其他方法(如基本身份验证)具有固有的优势。要了解更多信息,请直接进入jwt.io上的介绍,然后再直接学习。

以下是JWT的实际应用示例。主要有两个部分:提供用户名和密码以获取令牌;并根据请求检查该令牌。

在此示例中,我们使用了两个库,即Go中的JWT实现以及将其用作中间件的方式。

最后,在使用此代码之前,您需要将APP_KEY常量更改为机密(理想情况下,该常量将存储在代码库外部),并改进用户名/密码检查中的内容,TokenHandler以检查不仅仅是myusername/ mypassword组合。

下面的代码是gin框架对jwt的封装

  1. package main
  2. import (
  3. "fmt"
  4. "net/http"
  5. "time"
  6. "github.com/dgrijalva/jwt-go"
  7. "github.com/gin-gonic/gin"
  8. )
  9. //自定义一个字符串
  10. var jwtkey = []byte("www.topgoer.com")
  11. var str string
  12. type Claims struct {
  13. UserId uint
  14. jwt.StandardClaims
  15. }
  16. func main() {
  17. r := gin.Default()
  18. r.GET("/set", setting)
  19. r.GET("/get", getting)
  20. //监听端口默认为8080
  21. r.Run(":8080")
  22. }
  23. //颁发token
  24. func setting(ctx *gin.Context) {
  25. expireTime := time.Now().Add(7 * 24 * time.Hour)
  26. claims := &Claims{
  27. UserId: 2,
  28. StandardClaims: jwt.StandardClaims{
  29. ExpiresAt: expireTime.Unix(), //过期时间
  30. IssuedAt: time.Now().Unix(),
  31. Issuer: "127.0.0.1", // 签名颁发者
  32. Subject: "user token", //签名主题
  33. },
  34. }
  35. token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
  36. // fmt.Println(token)
  37. tokenString, err := token.SignedString(jwtkey)
  38. if err != nil {
  39. fmt.Println(err)
  40. }
  41. str = tokenString
  42. ctx.JSON(200, gin.H{"token": tokenString})
  43. }
  44. //解析token
  45. func getting(ctx *gin.Context) {
  46. tokenString := ctx.GetHeader("Authorization")
  47. //vcalidate token formate
  48. if tokenString == "" {
  49. ctx.JSON(http.StatusUnauthorized, gin.H{"code": 401, "msg": "权限不足"})
  50. ctx.Abort()
  51. return
  52. }
  53. token, claims, err := ParseToken(tokenString)
  54. if err != nil || !token.Valid {
  55. ctx.JSON(http.StatusUnauthorized, gin.H{"code": 401, "msg": "权限不足"})
  56. ctx.Abort()
  57. return
  58. }
  59. fmt.Println(111)
  60. fmt.Println(claims.UserId)
  61. }
  62. func ParseToken(tokenString string) (*jwt.Token, *Claims, error) {
  63. Claims := &Claims{}
  64. token, err := jwt.ParseWithClaims(tokenString, Claims, func(token *jwt.Token) (i interface{}, err error) {
  65. return jwtkey, nil
  66. })
  67. return token, Claims, err
  68. }