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

创建网站的工具金峰辉网站建设

创建网站的工具,金峰辉网站建设,如何快速找到公司网站,360建demo里提供了三个接口#xff0c;认证取token#xff0c;刷新token#xff0c;获取信息#xff0c;token过期前也会在header里写上新token#xff08;便于客户端更换#xff09; package mainimport (fmtnet/httpsynctime认证取token刷新token获取信息token过期前也会在header里写上新token便于客户端更换 package mainimport (fmtnet/httpsynctimegithub.com/gin-gonic/gingithub.com/golang-jwt/jwt/v5 )const (TOKEN_SECRET_KEY secret // 密钥TOKEN_EXPIRE_TIME 2 * time.Hour // 2小时过期TOKEN_REFRESH_TIME 10 * time.Minute // 接近过期时会在header里面加上新token客户端可以识别也可以自行拉取新 )var tb *TokenBucketfunc init() {tb NewTokenBucket(100, 5000) }func main() {// 创建一个Gin引擎r : gin.Default()// 限流r.Use(rateMiddWare(tb))// 登录接口r.POST(/login, loginHandler)// 受保护接口v1 : r.Group(/v1).Use(authReqMiddWare()){v1.GET(/user, userHandler)v1.GET(/refresh-token, refreshTokenHandler)}// 监听并在8080端口上启动服务r.Run(:8080) }/*** 登陆* curl 127.0.0.1:8080/login -X POST* return {token:eyJhbGciO...}*/ func loginHandler(c *gin.Context) {// TODO 验证账户密码// account passwd 需要从db中拉取信息校验// 获取用户信息userId : 123userName : test 123// 签名JWTtokenString, err : generateJWTToken(userId, userName)if err ! nil {c.JSON(http.StatusInternalServerError, gin.H{message: Failed to generate token})return}// 返回JWT给客户端c.JSON(http.StatusOK, gin.H{token: tokenString}) }/*** 用户信息* curl 127.0.0.1:8080/v1/user -H token:eyJhbGciO...* return {UserId:123,UserName:test 123,exp:1694741333,nbf:1694734133,iat:1694734133}*/ func userHandler(c *gin.Context) {claims, bool : c.Get(claims)if bool {// TODO 其他用户信息可以用UID查 缓存 和 数据库// findbyId()c.JSON(http.StatusOK, claims)return}c.JSON(http.StatusOK, gin.H{message: not found}) }/*** 刷新token* curl 127.0.0.1:8080/v1/refresh-token -H token:eyJhbGciO...* return {token:eyJhbGciO...}*/func refreshTokenHandler(c *gin.Context) {claims, bool : c.Get(claims)if !bool {c.JSON(http.StatusOK, gin.H{message: not found claims})return}fmt.Println(claims)val, ok : claims.(*jwtClaims)if !ok {c.JSON(http.StatusOK, gin.H{message: not found})return}tokenString, err : generateJWTToken(val.UserId, val.UserName)if err ! nil {c.JSON(http.StatusInternalServerError, gin.H{message: Failed to generate token})return}c.JSON(http.StatusOK, gin.H{token: tokenString})return }//jwt type jwtClaims struct {UserId stringUserName stringjwt.RegisteredClaims // jwt中标准格式 }/*** 校验token* 如果想从服务端控制发出的token可以通过redis标记也能达到让指定token提前过期的目的*/ func authReqMiddWare() gin.HandlerFunc {return func(c *gin.Context) {// 读取TOKENtokenStr : c.GetHeader(token)if tokenStr {c.JSON(http.StatusForbidden, gin.H{message: Token not exist})c.Abort()return}// 解析tokentoken, err : jwt.ParseWithClaims(tokenStr, jwtClaims{}, func(token *jwt.Token) (interface{}, error) {return []byte(TOKEN_SECRET_KEY), nil})if err ! nil {c.JSON(http.StatusForbidden, gin.H{message: err.Error()})c.Abort()return}claims, ok : token.Claims.(*jwtClaims)// 这里默认会检查ExpiresAt是否过期if ok token.Valid { now : time.Now()// 检查过期时间对快要过期的添加http header refresh-tokenif t : claims.ExpiresAt.Time.Add(-TOKEN_REFRESH_TIME); t.Before(now) {tokenString, err : generateJWTToken(claims.UserId, claims.UserName)if err ! nil {c.JSON(http.StatusInternalServerError, gin.H{message: Failed to generate token})c.Abort()return}c.Header(refresh-token, tokenString) //}c.Set(claims, claims)}} }// 生成JWT token func generateJWTToken(userId, userName string) (string, error) {now : time.Now()claims : jwtClaims{UserId: userId,UserName: userName,RegisteredClaims: jwt.RegisteredClaims{ExpiresAt: jwt.NumericDate{Time: time.Now().Add(TOKEN_EXPIRE_TIME)}, // 过期时间IssuedAt: jwt.NewNumericDate(now), // 签发时间NotBefore: jwt.NewNumericDate(now), // 生效时间},}token : jwt.NewWithClaims(jwt.SigningMethodHS256, claims)return token.SignedString([]byte(TOKEN_SECRET_KEY)) }// 限流 func rateMiddWare(tb *TokenBucket) gin.HandlerFunc {return func(c *gin.Context) {if !tb.AllowRequest() {c.JSON(http.StatusTooManyRequests, gin.H{message: http.StatusText(http.StatusTooManyRequests)})c.Abort()return}} }// 令牌 type TokenBucket struct {cap int // 桶容量rate float64 // 每秒生产个数tokenNum int // 当前计数lastTime time.Time // 上一个产生时间mu sync.Mutex }func NewTokenBucket(cap int, rate float64) *TokenBucket {return TokenBucket{cap: cap,rate: rate,tokenNum: cap,lastTime: time.Now(),} }// 拿令牌 func (tb *TokenBucket) AllowRequest() bool {tb.mu.Lock()defer tb.mu.Unlock()now : time.Now()second : now.Sub(tb.lastTime).Seconds() // 计算经过多少秒newTokens : int(second * tb.rate) // 计算产生的令牌数量if newTokens 0 {tb.tokenNum tb.tokenNum newTokensif tb.tokenNum tb.cap { // 不能超过容量tb.tokenNum tb.cap}tb.lastTime now}if tb.tokenNum 0 {tb.tokenNum--return true}return false }
http://www.dnsts.com.cn/news/189626.html

相关文章:

  • 腾达建设集团股份有限公司网站大都会是什么软件
  • 丰都网站建设报价wordpress中文免费模板
  • pascal建设网站网络营销渠道
  • 自己做网站用花钱吗公司logo设计理念
  • 网站建设费用明细表零起步如何做设计师
  • 查询域名后缀网站企业用酒解决方案
  • 那些公司做网站局域网站建设
  • 郑州网站建设喝彩重庆荣昌网站建设费用
  • 嘉兴本地推广网站海外打开网站慢
  • 海尔集团电商网站建设食品网站开发
  • 重庆最专业的房产网站建设网站备案 时间更新
  • 网站建设论文开题报告范文哈尔滨网页设计师人才招聘
  • 免费帮朋友做网站网站建设方案评标原则
  • 凡科做的网站怎么打不开了wordpress折叠目录
  • 做网站和优化的公司深圳市勘察设计
  • 网站内页怎样做优化客厅装修效果图片大全
  • 网站后台上传图片无法显示网站管理员在哪里
  • 网站运营费用预算wordpress 爱
  • 怎么看一个网站做没做优化丹东搜索引擎优化
  • 厦门微网站开发西安网站排名推广
  • 做贸易注册网站用自己名字青海个人旅游网站建设
  • 温岭新站seo一个人免费视频在线观看高清
  • 电商网站规划拼多多网站建设框架图
  • 现在什么省网站备案最快网站进入沙盒期
  • 化妆品做备案的网站网页模版之家
  • 陕西网站建设方案高端企业网站建设蓦然郑州网站建设6
  • 自己建设网站需要哪些cpanel应用不显示wordpress
  • 推荐设计网站黄骅港务
  • 成都的网站店铺网站怎么建
  • python制作视频网站开发插画师零基础自学