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

高端公司网站设计建个微网站多少钱

高端公司网站设计,建个微网站多少钱,怀化优化办,做网站 点击跳转一、JWT JWT全称JSON Web Token是一种跨域认证解决方案#xff0c;属于一个开放的标准#xff0c;它规定了一种Token实现方式#xff0c;目前多用于前后端分离项目和OAuth2.0业务场景下。 二、为什么要用在你的Gin中使用JWT 传统的Cookie-Sesson模式占用服务器内存, 拓展性…一、JWT JWT全称JSON Web Token是一种跨域认证解决方案属于一个开放的标准它规定了一种Token实现方式目前多用于前后端分离项目和OAuth2.0业务场景下。 二、为什么要用在你的Gin中使用JWT 传统的Cookie-Sesson模式占用服务器内存, 拓展性不好,遇到集群或者跨服务验证的场景的话, 要支持Sesson复制或者sesson持久化 1.JWT的基本原理 在服务器验证之后, 得到用户信息JSON 1 2 3 4 5 {      user_id: xxxxxx,     role: xxxxxx,     refresh_token: xxxxx } 1JWT TOKEN怎么组成 JWT是一个很长的字符串 eyJhbGciOiJI123afasrwrqqewrcCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c 它由三部分组成, 每部分用点(.)分隔, 三个部分依次如下 Header(头部)Payload(负载)Signature(签名) 1Header Header是一个经过BASE64URL算法加密过的JSON对象, 解密后如下 1 2 3 4 {   alg: HS256,   typ: JWT } 其中, alg属性表示签名所用的算法,默认是HS256; typ则表示当前token的类型, 而JWT的类型则为jwt Base64URL 与BASE64类似, 由于、/、这几个符号在URL中有特殊含义, 因此BASE64RUL算法, 把这几个符号进行了替换 - -  - 被忽略 / - _ 2Payload Payload部分也是JSON对象经过BASE64URL算法转成字符串的, Payload部分包含7个基本字段 iss (issuer)签发人exp (expiration time)过期时间sub (subject)主题aud (audience)受众nbf (Not Before)生效时间iat (Issued At)签发时间jti (JWT ID)编号 也可以往里面塞入自定义的业务字段, 如下 user_id role 3Signature Signature 部分是对前两部分的签名防止数据篡改。 首先需要指定一个密钥secret。这个密钥只有服务器才知道不能泄露给用户。然后使用 Header 里面指定的签名算法默认是 HMAC SHA256按照下面的公式产生签名。 HMACSHA256(   base64UrlEncode(header) .   base64UrlEncode(payload),   secret) 2解密过程 当系统接收到TOKEN时, 拿出Header和Payload的字符串用.拼接在一起之后, 用Header里面指定的哈希方法通过公式 HMACSHA256(   base64UrlEncode(header) .   base64UrlEncode(payload),   secret) 进行加密得出密文 然后用刚刚得出的密文与TOKEN传过来的密文对比, 如果相等则表明密文没有更改. 三、JWT一些特点优点与缺点 JWT 默认是不加密但也是可以加密的。生成原始 Token 以后可以用密钥再加密一次。JWT 不加密的情况下不能将秘密数据写入 JWT。JWT 不仅可以用于认证也可以用于交换信息。有效使用 JWT可以降低服务器查询数据库的次数。JWT 的最大缺点是由于服务器不保存 session 状态因此无法在使用过程中废止某个 token或者更改 token 的权限。也就是说一旦 JWT 签发了在到期之前就会始终有效除非服务器部署额外的逻辑。JWT 本身包含了认证信息一旦泄露任何人都可以获得该令牌的所有权限。为了减少盗用JWT 的有效期应该设置得比较短。对于一些比较重要的权限使用时应该再次对用户进行认证。为了减少盗用JWT 不应该使用 HTTP 协议明码传输要使用 HTTPS 协议传输。 1.GIN整合JWT 1 2 go get -u github.com/dgrijalva/jwt-go go get github.com/gin-gonic/gin 编写jwtutil 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 var Secret []byte(whatasecret) // jwt过期时间, 按照实际环境设置 const expiration 2 * time.Minute type Claims struct {     // 自定义字段, 可以存在用户名, 用户ID, 用户角色等等     Username string     // jwt.StandardClaims包含了官方定义的字段     jwt.StandardClaims } func GenToken(username string) (string, error) {     // 创建声明     a : Claims{         Username: username,         StandardClaims: jwt.StandardClaims{             ExpiresAt: time.Now().Add(expiration).Unix(), // 过期时间             IssuedAt:  time.Now().Unix(),                 // 签发时间             Issuer:    gin-jwt-demo,                    // 签发者             Id:        ,                                // 按需求选这个, 有些实现中, 会控制这个ID是不是在黑/白名单来判断是否还有效             NotBefore: 0,                                 // 生效起始时间             Subject:   ,                                // 主题         },     }     // 用指定的哈希方法创建签名对象     tt : jwt.NewWithClaims(jwt.SigningMethodHS256, a)     // 用上面的声明和签名对象签名字符串token     // 1. 先对Header和PayLoad进行Base64URL转换     // 2. Header和PayLoadBase64URL转换后的字符串用.拼接在一起     // 3. 用secret对拼接在一起之后的字符串进行HASH加密     // 4. 连在一起返回     return tt.SignedString(Secret) } func ParseToken(tokenStr string) (*Claims, error) {     // 第三个参数: 提供一个回调函数用于提供要选择的秘钥, 回调函数里面的token参数,是已经解析但未验证的,可以根据token里面的值做一些逻辑, 如kid的判断     token, err : jwt.ParseWithClaims(tokenStr, Claims{}, func(token *jwt.Token) (interface{}, error) {         return Secret, nil     })     if err ! nil {         return nil, err     }     // 校验token     if claims, ok : token.Claims.(*Claims); ok token.Valid {         return claims, nil     }     return nil, errors.New(invalid token) } Secret是秘钥, 用于加密签名expiration是TOKEN过期时间Claims是签名声明对象, 包含自定义的字段和JWT规定的字段 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 type Claims struct {     // 自定义字段, 可以存在用户名, 用户ID, 用户角色等等     Username string     // jwt.StandardClaims包含了官方定义的字段     jwt.StandardClaims } type StandardClaims struct {     Audience  string json:aud,omitempty     ExpiresAt int64  json:exp,omitempty     Id        string json:jti,omitempty     IssuedAt  int64  json:iat,omitempty     Issuer    string json:iss,omitempty     NotBefore int64  json:nbf,omitempty     Subject   string json:sub,omitempty } 1GenToken方法 GenToken方法为某个username生成一个token, 每次生成都不一样 jwt.NewWithClaims(jwt.SigningMethodHS256, a)声明了一个签名对象, 并且指定了HS256的哈希算法 token.SignedString(Secret)表明用刚刚的声明对象和SECRET利用指定的哈希算法去加密,包含下面流程 先对Header和PayLoad进行Base64URL转换Header和PayLoadBase64URL转换后的字符串用.拼接在一起用secret对拼接在一起之后的字符串进行HASH加密BASE64URL(Header).BASE64URL(Payload).signature连在一起的字符串返回 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 func GenToken(username string) (string, error) {     // 创建声明     a : amp;Claims{         Username: username,         StandardClaims: jwt.StandardClaims{             ExpiresAt: time.Now().Add(expiration).Unix(), // 过期时间             IssuedAt:  time.Now().Unix(),                 // 签发时间             Issuer:    gin-jwt-demo,                    // 签发者             Id:        ,                                // 按需求选这个, 有些实现中, 会控制这个ID是不是在黑/白名单来判断是否还有效             NotBefore: 0,                                 // 生效起始时间             Subject:   ,                                // 主题         },     }     // 用指定的哈希方法创建签名对象     tt : jwt.NewWithClaims(jwt.SigningMethodHS256, a)     // 用上面的声明和签名对象签名字符串token     // 1. 先对Header和PayLoad进行Base64URL转换     // 2. Header和PayLoadBase64URL转换后的字符串用.拼接在一起     // 3. 用secret对拼接在一起之后的字符串进行HASH加密     // 4. 连在一起返回     return tt.SignedString(Secret) } 2ParseToken方法 ParseToken方法解析一个Token, 并验证Token是否生效 jwt.ParseWithClaims方法, 用于解析Token, 其第三个参数: 提供一个回调函数用于提供要选择的秘钥, 回调函数里面的token参数,是已经解析但未验证的,可以根据token里面的值做一些逻辑, 如判断kid来选用不同的secret KID可选): 代表秘钥序号。开发人员可以用它标识认证token的某一秘钥 1 2 3 4 5 6 7 8 9 10 11 12 13 14 func ParseToken(tokenStr string) (*Claims, error) {     // 第三个参数: 提供一个回调函数用于提供要选择的秘钥, 回调函数里面的token参数,是已经解析但未验证的,可以根据token里面的值做一些逻辑, 如kid的判断     token, err : jwt.ParseWithClaims(tokenStr, amp;Claims{}, func(token *jwt.Token) (interface{}, error) {         return Secret, nil     })     if err ! nil {         return nil, err     }     // 校验token     if claims, ok : token.Claims.(*Claims); ok amp;amp; token.Valid {         return claims, nil     }     return nil, errors.New(invalid token) } 编写中间件 从Header中取出Authorization并拿去解析jwt.ParseToken, 验证token是否被串改, 是否过期 从token取出有效信息并设置到上下文 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 func JWTAuthMiddleware() func(ctx *gin.Context) {     return func(ctx *gin.Context) {         // 根据实际情况取TOKEN, 这里从request header取         tokenStr : ctx.Request.Header.Get(Authorization)         if tokenStr {             ctx.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{                 code: code.ERR_AUTH_NULL,                 msg:  code.GetMsg(code.ERR_AUTH_NULL),             })             return         }         claims, err : jwt.ParseToken(tokenStr)         if err ! nil {             ctx.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{                 code: code.ERR_AUTH_INVALID,                 msg:  code.GetMsg(code.ERR_AUTH_INVALID),             })             return         } else if time.Now().Unix() gt; claims.ExpiresAt {             ctx.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{                 code: code.ERR_AUTH_EXPIRED,                 msg:  code.GetMsg(code.ERR_AUTH_EXPIRED),             })             return         }         // 此处已经通过了, 可以把Claims中的有效信息拿出来放入上下文使用         ctx.Set(username, claims.Username)         ctx.Next()     } } 使用中间件 /login不用中间件 中间件指定在authorizedrouter, 因此authorized下的所有路由都会使用此中间件 1 2 3 4 5 6 7 8 9 10 func main() {     r : gin.Default()     r.POST(/login, router.Login)     authorized : r.Group(/auth)     authorized.Use(jwt.JWTAuthMiddleware())     {         authorized.GET(/getUserInfo, router.GetUserInfo)     }     r.Run(:8082) } 测试 login请求获取token POST http://localhost:8082/login 把token放入getUserInfo请求 GET  http://localhost:8082/auth/getUserInfo 其他 完整的JWT登录还应该包括 使TOKEN失效(过期或者黑名单等功能)refresh token…
http://www.hkea.cn/news/14359421/

相关文章:

  • 公司部门有哪些下载优化大师安装桌面
  • 做网站都需要买什么产品推广方案
  • 郑州建网站多少免费网站建设模版云盘
  • 深圳罗湖区网站有教做桥梁质检资料的网站吗
  • wordpress无法加载图片大小如何看网站是否优化
  • 湖州集团网站建设兴国做网站
  • 做设计想接外单去哪个网站好买什么样的主机(用来建网站的)支持下载
  • 有些网站开发人员工具无反应网店运营推广
  • 化隆县公司网站建设优秀网格员事迹材料
  • 制作网站建设规划书的结构为天津做网站找津坤科技
  • 甘肃省建设监理协会网站google怎么推广
  • 建设个人博客网站wordpress xss跨站脚本漏洞
  • WordPress轻量企业主题福州搜索优化行业
  • 在线建设网站 源代码游戏网游戏平台
  • 网站建设服务费记账分录wordpress 记录访问ip
  • 做网站建设工资多少创意装修公司
  • 北京 手机网站建设wordpress php 文件上传
  • 湖南省网站备案登记网站后台地址修改
  • 网站自然排名怎么深圳外贸网站定制
  • 蓝色网站素材定制制作网站价格表
  • 门户网站怎样做百度seo优
  • 爱站长用户管理系统admin
  • 如何建一个免费网站潍坊广告设计公司
  • 公司网站建设的方案网站系统 外贸
  • 做网站办公室图片淘宝客返利网站建设
  • 公司网站定制大兴建设网站
  • 做一个京东网站怎么做怎样做分类网站
  • 北海网站建设视频不可添加橱窗入口
  • 仙桃有哪些做网站的公司假网页生成器
  • 华侨大学英文网站建设网站初期建设的成本来源