经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
go gin+token(JWT)验证实现登陆验证
来源:jb51  时间:2021/12/9 13:46:04  对本文有异议

1.准备

  1. go get github.com/dgrijalva/jwt-go
  2. go get github.com/gin-gonic/gin

?2.代码

  1. package main
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/dgrijalva/jwt-go"
  6. "github.com/gin-gonic/gin"
  7. "net/http"
  8. "time"
  9. )
  10. func main() {
  11. r := gin.Default()
  12. r.GET("/login/:username/:password", login)
  13. r.GET("/verify/:token", verify)
  14. r.GET("/refresh/:token", refresh)
  15. r.GET("/sayHello/:token", sayHello)
  16. r.Run(":9090")
  17. //http://localhost:9090/login/dong/123456
  18. //http://localhost:9090/verify/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NjA1MTIyMTAsImlhdCI6MTU2MDUwODYxMCwidXNlcl9pZCI6MSwicGFzc3dvcmQiOiIxMjM0NTYiLCJ1c2VybmFtZSI6ImRvbmciLCJmdWxsX25hbWUiOiJkb25nIiwicGVybWlzc2lvbnMiOltdfQ.Esh1Zge0vO1BAW1GeR5wurWP3H1jUIaMf3tcSaUwkzA
  19. //http://localhost:9090/refresh/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NjA1MTIyNDMsImlhdCI6MTU2MDUwODYxMCwidXNlcl9pZCI6MSwicGFzc3dvcmQiOiIxMjM0NTYiLCJ1c2VybmFtZSI6ImRvbmciLCJmdWxsX25hbWUiOiJkb25nIiwicGVybWlzc2lvbnMiOltdfQ.Xkb_J8MWXkwGUcBF9bpp2Ccxp8nFPtRzFzOBeboHmg0
  20. }
  21. const(
  22. ErrorReason_ServerBusy = "服务器繁忙"
  23. ErrorReason_ReLogin = "请重新登陆"
  24. )
  25. func sayHello(c *gin.Context) {
  26. strToken := c.Param("token")
  27. claim,err := verifyAction(strToken)
  28. if err != nil {
  29. c.String(http.StatusNotFound, err.Error())
  30. return
  31. }
  32. c.String(http.StatusOK, "hello,",claim.Username)
  33. }
  34. type JWTClaims struct { // token里面添加用户信息,验证token后可能会用到用户信息
  35. jwt.StandardClaims
  36. UserID int `json:"user_id"`
  37. Password string `json:"password"`
  38. Username string `json:"username"`
  39. FullName string `json:"full_name"`
  40. Permissions []string `json:"permissions"`
  41. }
  42. var (
  43. Secret = "dong_tech" // 加盐
  44. ExpireTime = 3600 // token有效期
  45. )
  46. func login(c *gin.Context) {
  47. username := c.Param("username")
  48. password := c.Param("password")
  49. claims := &JWTClaims{
  50. UserID: 1,
  51. Username: username,
  52. Password: password,
  53. FullName: username,
  54. Permissions: []string{},
  55. }
  56. claims.IssuedAt = time.Now().Unix()
  57. claims.ExpiresAt = time.Now().Add(time.Second * time.Duration(ExpireTime)).Unix()
  58. signedToken,err:=getToken(claims)
  59. if err!=nil{
  60. c.String(http.StatusNotFound, err.Error())
  61. return
  62. }
  63. c.String(http.StatusOK, signedToken)
  64. }
  65. func verify(c *gin.Context) {
  66. strToken := c.Param("token")
  67. claim,err := verifyAction(strToken)
  68. if err != nil {
  69. c.String(http.StatusNotFound, err.Error())
  70. return
  71. }
  72. c.String(http.StatusOK, "verify,",claim.Username)
  73. }
  74. func refresh(c *gin.Context) {
  75. strToken := c.Param("token")
  76. claims,err := verifyAction(strToken)
  77. if err != nil {
  78. c.String(http.StatusNotFound, err.Error())
  79. return
  80. }
  81. claims.ExpiresAt = time.Now().Unix() + (claims.ExpiresAt - claims.IssuedAt)
  82. signedToken,err:=getToken(claims)
  83. if err!=nil{
  84. c.String(http.StatusNotFound, err.Error())
  85. return
  86. }
  87. c.String(http.StatusOK, signedToken)
  88. }
  89. func verifyAction(strToken string) (*JWTClaims, error) {
  90. token, err := jwt.ParseWithClaims(strToken, &JWTClaims{}, func(token *jwt.Token) (interface{}, error) {
  91. return []byte(Secret), nil
  92. })
  93. if err != nil {
  94. return nil, errors.New(ErrorReason_ServerBusy)
  95. }
  96. claims, ok := token.Claims.(*JWTClaims)
  97. if !ok {
  98. return nil, errors.New(ErrorReason_ReLogin)
  99. }
  100. if err := token.Claims.Valid(); err != nil {
  101. return nil, errors.New(ErrorReason_ReLogin)
  102. }
  103. fmt.Println("verify")
  104. return claims, nil
  105. }
  106. func getToken(claims *JWTClaims)(string,error){
  107. token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
  108. signedToken, err := token.SignedString([]byte(Secret))
  109. if err != nil {
  110. return "",errors.New(ErrorReason_ServerBusy)
  111. }
  112. return signedToken,nil
  113. }

运行结果如图:

访问接口

登陆
验证
刷新
http://localhost:9090/login/
http://localhost:9090/verify/
http://localhost:9090/refresh/

到此这篇关于go gin+token(JWT)验证实现登陆验证的文章就介绍到这了,更多相关go gin token JWT登陆验证内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号