当前位置: 首页 > wzjs >正文

网站文章更新要求wordpress html5

网站文章更新要求,wordpress html5,西安 北郊网站建设,大学生活网页制作模板Go语言实现双Token登录的思路与实现 引言 在现代Web应用中,身份认证是保障系统安全的重要环节。传统的单Token认证方式存在一些安全隐患,如Token泄露可能导致长期风险。双Token机制(Access Token Refresh Token)提供了更好的安…

Go语言实现双Token登录的思路与实现

引言

在现代Web应用中,身份认证是保障系统安全的重要环节。传统的单Token认证方式存在一些安全隐患,如Token泄露可能导致长期风险。双Token机制(Access Token + Refresh Token)提供了更好的安全性和用户体验。本文将介绍如何使用Go语言实现双Token登录系统。

双Token机制概述

双Token机制包含两种令牌:

  1. Access Token:短期有效的令牌,用于访问受保护资源
  2. Refresh Token:长期有效的令牌,用于获取新的Access Token

这种机制的优势在于:

  • Access Token有效期短,即使泄露影响有限
  • Refresh Token不直接用于资源访问,降低了泄露风险
  • 无需频繁重新登录,保持用户体验

实现思路

1. 数据结构设计

首先定义Token相关的数据结构:

type TokenDetails struct {AccessToken  stringRefreshToken stringAccessUuid   stringRefreshUuid  stringAtExpires    int64RtExpires    int64
}type AccessDetails struct {AccessUuid stringUserId     uint64
}

2. Token生成与存储

使用JWT(JSON Web Token)生成Token,并存储在Redis中:

func CreateToken(userid uint64) (*TokenDetails, error) {td := &TokenDetails{}td.AtExpires = time.Now().Add(time.Minute * 15).Unix()td.AccessUuid = uuid.New().String()td.RtExpires = time.Now().Add(time.Hour * 24 * 7).Unix()td.RefreshUuid = uuid.New().String()// 创建Access TokenatClaims := jwt.MapClaims{}atClaims["authorized"] = trueatClaims["access_uuid"] = td.AccessUuidatClaims["user_id"] = useridatClaims["exp"] = td.AtExpiresat := jwt.NewWithClaims(jwt.SigningMethodHS256, atClaims)td.AccessToken, _ = at.SignedString([]byte(os.Getenv("ACCESS_SECRET")))// 创建Refresh TokenrtClaims := jwt.MapClaims{}rtClaims["refresh_uuid"] = td.RefreshUuidrtClaims["user_id"] = useridrtClaims["exp"] = td.RtExpiresrt := jwt.NewWithClaims(jwt.SigningMethodHS256, rtClaims)td.RefreshToken, _ = rt.SignedString([]byte(os.Getenv("REFRESH_SECRET")))return td, nil
}func CreateAuth(userid uint64, td *TokenDetails) error {at := time.Unix(td.AtExpires, 0)rt := time.Unix(td.RtExpires, 0)now := time.Now()// 存储Access TokenerrAccess := client.Set(td.AccessUuid, strconv.Itoa(int(userid)), at.Sub(now)).Err()if errAccess != nil {return errAccess}// 存储Refresh TokenerrRefresh := client.Set(td.RefreshUuid, strconv.Itoa(int(userid)), rt.Sub(now)).Err()if errRefresh != nil {return errRefresh}return nil
}

3. 登录接口实现

func Login(c *gin.Context) {var user Userif err := c.ShouldBindJSON(&user); err != nil {c.JSON(http.StatusUnprocessableEntity, "Invalid json provided")return}// 验证用户凭据// ...// 生成Tokentd, err := CreateToken(user.ID)if err != nil {c.JSON(http.StatusUnprocessableEntity, err.Error())return}// 存储TokensaveErr := CreateAuth(user.ID, td)if saveErr != nil {c.JSON(http.StatusUnprocessableEntity, saveErr.Error())return}tokens := map[string]string{"access_token":  td.AccessToken,"refresh_token": td.RefreshToken,}c.JSON(http.StatusOK, tokens)
}

4. Token刷新机制

func Refresh(c *gin.Context) {mapToken := map[string]string{}if err := c.ShouldBindJSON(&mapToken); err != nil {c.JSON(http.StatusUnprocessableEntity, err.Error())return}refreshToken := mapToken["refresh_token"]// 验证Refresh Tokentoken, err := jwt.Parse(refreshToken, func(token *jwt.Token) (interface{}, error) {if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])}return []byte(os.Getenv("REFRESH_SECRET")), nil})if err != nil {c.JSON(http.StatusUnauthorized, "Refresh token expired")return}// 检查Token是否有效if _, ok := token.Claims.(jwt.Claims); !ok && !token.Valid {c.JSON(http.StatusUnauthorized, err)return}// 提取claimsclaims, ok := token.Claims.(jwt.MapClaims)if ok && token.Valid {refreshUuid, ok := claims["refresh_uuid"].(string)if !ok {c.JSON(http.StatusUnprocessableEntity, err)return}userId, err := strconv.ParseUint(fmt.Sprintf("%.f", claims["user_id"]), 10, 64)if err != nil {c.JSON(http.StatusUnprocessableEntity, "Error occurred")return}// 删除旧的Refresh Tokendeleted, delErr := DeleteAuth(refreshUuid)if delErr != nil || deleted == 0 {c.JSON(http.StatusUnauthorized, "unauthorized")return}// 创建新的Token对ts, createErr := CreateToken(userId)if createErr != nil {c.JSON(http.StatusForbidden, createErr.Error())return}// 保存新的TokensaveErr := CreateAuth(userId, ts)if saveErr != nil {c.JSON(http.StatusForbidden, saveErr.Error())return}tokens := map[string]string{"access_token":  ts.AccessToken,"refresh_token": ts.RefreshToken,}c.JSON(http.StatusCreated, tokens)} else {c.JSON(http.StatusUnauthorized, "refresh expired")}
}

5. 中间件实现Token验证

func TokenAuthMiddleware() gin.HandlerFunc {return func(c *gin.Context) {err := TokenValid(c.Request)if err != nil {c.JSON(http.StatusUnauthorized, err.Error())c.Abort()return}c.Next()}
}func TokenValid(r *http.Request) error {token, err := VerifyToken(r)if err != nil {return err}if _, ok := token.Claims.(jwt.Claims); !ok && !token.Valid {return err}return nil
}func VerifyToken(r *http.Request) (*jwt.Token, error) {tokenString := ExtractToken(r)token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])}return []byte(os.Getenv("ACCESS_SECRET")), nil})if err != nil {return nil, err}return token, nil
}func ExtractToken(r *http.Request) string {bearToken := r.Header.Get("Authorization")strArr := strings.Split(bearToken, " ")if len(strArr) == 2 {return strArr[1]}return ""
}

完整流程

  1. 用户登录:提供用户名密码,服务端验证后返回Access Token和Refresh Token
  2. 访问受保护资源:客户端在请求头中携带Access Token
  3. Access Token过期:服务端返回401错误
  4. 刷新Token:客户端使用Refresh Token请求新的Token对
  5. 继续访问:使用新的Access Token访问资源

总结

通过Go语言实现双Token认证机制,我们能够构建更安全的身份认证系统。这种机制在保证安全性的同时,也提供了良好的用户体验。实际应用中,可以根据业务需求调整Token的有效期和实现细节。

希望这篇文章对你理解和使用双Token认证有所帮助!


文章转载自:

http://DpmZYFqE.wcrcy.cn
http://KIdkUvYI.wcrcy.cn
http://USplO1t0.wcrcy.cn
http://q1inHywR.wcrcy.cn
http://ydVsQaqS.wcrcy.cn
http://hhXhhCSg.wcrcy.cn
http://P13sN2DQ.wcrcy.cn
http://harqOIBv.wcrcy.cn
http://BAIdxNep.wcrcy.cn
http://avMSw5PH.wcrcy.cn
http://qTbTPdvU.wcrcy.cn
http://lGcUtQIF.wcrcy.cn
http://6HleX317.wcrcy.cn
http://JNxhr0fZ.wcrcy.cn
http://B2KoIc8r.wcrcy.cn
http://qihbRdmF.wcrcy.cn
http://Nes19q6q.wcrcy.cn
http://97hQhNki.wcrcy.cn
http://WanZpfl9.wcrcy.cn
http://phBYG1WA.wcrcy.cn
http://tr0EBFGe.wcrcy.cn
http://eFRl58ee.wcrcy.cn
http://S4bdif5k.wcrcy.cn
http://xubir7Wv.wcrcy.cn
http://LBZG74R8.wcrcy.cn
http://nBrJPx5U.wcrcy.cn
http://7XYLO3g2.wcrcy.cn
http://Dkuh4aZX.wcrcy.cn
http://pVahgGLu.wcrcy.cn
http://18J4wd4h.wcrcy.cn
http://www.dtcms.com/wzjs/719199.html

相关文章:

  • 伊利集团网站建设实训公司网站建设外包流程
  • 网站策划书我与音乐广州骏域网站建设专家 V
  • 广州哪个网站建设公司好wordpress博客破解主题
  • 每个企业都要做网站吗住房城乡建设局网站首页
  • 宜宾网站建设网站手机移动网站开发
  • 手机如何网站模板seo搜索引擎优化人员
  • wordpress网站加密码破解上海华亮建设集团网站
  • 城市建设者官方网站网店美工课程心得体会
  • 揭阳专业网站制作公司响应式网站 外贸
  • 网站建站建设价格建设工程施工合同和承揽合同区别
  • 做网站建设的网络公司经营范围怎样填泉州城乡建设网站
  • 合肥做网站推荐 晨飞网络网络舆情分析案例
  • 网站开发数据库专业的上海网站建设公司
  • 网站建设专家工作总结网站seo问题诊断工具
  • 做三个月网站广告收入网页设计培训机构学什么好
  • 北京梦创义网站建设w3 wordpress
  • 行业垂直网站开发自定义导航网站 源码
  • 百度免费网站制作wordpress中文模板
  • 网站建设公司的服务公司网站域名重定向怎么做
  • 怎么修改网站默认首页中国企业500强山东
  • 知名小蚁人网站建设wordpress导入媒体查看
  • 网站的百度推广怎么做的哪些网站容易被百度收录
  • 搜索大全引擎入口网站wordpress设置会员时效
  • 手表网站 欧米茄wordpress免签支付插件
  • 岭南地区网站建设12306网站花多少钱做的
  • 织梦免费企业模板网站新中式装修风格样板房
  • wordpress网站百度收录首页湖南营销型网站建设 A磐石网络
  • 自己给公司做网站该怎么做外包加工拿货网
  • 网站建设需要做的事情详情页模板 套用
  • 免费企业网站建立wordpress 视差模板