go gin+token(JWT)验证实现登陆验证

收集整理的这篇文章主要介绍了go gin+token(JWT)验证实现登陆验证,觉得挺不错的,现在分享给大家,也给大家做个参考。

1.准备

go get gIThub.COM/dgrijalva/jwt-gogo get github.com/gin-gonic/gin

 2.代码

package main import (	"errors"	"fmt"	"github.com/dgrijalva/jwt-go"	"github.com/gin-gonic/gin"	"net/http"	"time") func main() {
	r := gin.Default()	r.GET("/LOGin/:username/:password", login)	r.GET("/verify/:token", verify)	r.GET("/refresh/:token", refresh)	r.GET("/sayHello/:token", sayHello)	r.Run(":9090") 	//http://localhost:9090/login/dong/123456	//http://localhost:9090/verify/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NjA1MTIymtasIMLhdCI6MTU2MDUwODYXMCwidXNlcl9pZCI6MSwicGFzc3dvcmQiOiIxMjM0NTYiLCJ1c2VybmFtZSI6ImRvbmciLCJmdWxsX25hbWUiOiJkb25nIiwicGVybWlzc2lvbnMiOltDFQ.Esh1Zge0vO1BAW1GeR5wurWP3H1jUIaMf3tcSaUwkzA	//http://localhost:9090/refresh/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NjA1MTIyNDMsImlhdCI6MTU2MDUwODYxMCwidXNlcl9pZCI6MSwicGFzc3dvcmQiOiIxMjM0NTYiLCJ1c2VybmFtZSI6ImRvbmciLCJmdWxsX25hbWUiOiJkb25nIiwicGVybWlzc2lvbnMiOltdfQ.Xkb_J8MWXkwGUcBF9bpp2Ccxp8nFPtRzFzOBeboHmg0}
 const(	ErrorReason_ServerBusy = "服务器繁忙"	ErrorReason_ReLogin = "请重新登陆") func sayHello(c *gin.Context) {
	strToken := c.Param("token")	claim,err := verifyAction(strToken)	if err != nil {
		c.String(http.statusNotFound, err.Error())		return	}
	c.String(http.StatusOK, "hello,",claim.Username)}
 tyPE JWTClaims struct {
 // token里面添加用户信息,验证token后可能会用到用户信息	jwt.StandardClaims	UserID      int      `json:"user_id"`	Password    string   `json:"password"`	Username    string   `json:"username"`	FullName    string   `json:"full_name"`	Permissions []string `json:"permissions"`}
 VAR (	Secret     = "dong_tech" // 加盐	ExpireTime = 3600        // token有效期) func login(c *gin.Context) {
    	username := c.Param("username")	password := c.Param("password")	claims := &
JWTClaims{
		UserID:      1,		Username:    username,		Password:    password,		FullName:    username,		Permissions: []string{
}
,	}
	claims.IssuedAt = time.Now().Unix()	claims.ExpiresAt = time.Now().Add(time.Second * time.Duration(ExpireTime)).Unix()	signedToken,err:=getToken(claims)	if err!=nil{
		c.String(http.StatusNotFound, err.Error())		return	}
	c.String(http.StatusOK, signedToken)}
 func verify(c *gin.Context) {
	strToken := c.Param("token")	claim,err := verifyAction(strToken)	if err != nil {
		c.String(http.StatusNotFound, err.Error())		return	}
	c.String(http.StatusOK, "verify,",claim.Username)}
 func refresh(c *gin.Context) {
	strToken := c.Param("token")	claims,err := verifyAction(strToken)	if err != nil {
		c.String(http.StatusNotFound, err.Error())		return	}
	claims.ExpiresAt = time.Now().Unix() + (claims.ExpiresAt - claims.IssuedAt)	signedToken,err:=getToken(claims)	if err!=nil{
		c.String(http.StatusNotFound, err.Error())		return	}
	c.String(http.StatusOK, signedToken)}
 func verifyAction(strToken string) (*JWTClaims, error) {
    	token, err := jwt.ParseWithClaims(strToken, &
JWTClaims{
}
, func(token *jwt.Token) (interface{
}
, error) {
		return []byte(Secret), nil	}
)	if err != nil {
		return nil, errors.New(ErrorReason_ServerBusy)	}
	claims, ok := token.Claims.(*JWTClaims)	if !ok {
		return nil, errors.New(ErrorReason_ReLogin)	}
    	if err := token.Claims.Valid();
 err != nil {
		return nil, errors.New(ErrorReason_ReLogin)	}
	fmt.PRintln("verify")	return claims, nil}
 func getToken(claims *JWTClaims)(string,error){
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)	signedToken, err := token.SignedString([]byte(Secret))	if err != nil {
		return "",errors.New(ErrorReason_ServerBusy)	}
	return signedToken,nil}
    

运行结果如图:

访问接口

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

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

您可能感兴趣的文章:

  • golang中gin框架接入jwt使用token验证身份
  • 使用Nginx和Lua进行JWT校验介绍
  • 基于gin的golang web开发之认证利器jwt
  • gin框架中使用JWT的定义需求及解析