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

生成flash的网站源码广州建立网站的公司网站

生成flash的网站源码,广州建立网站的公司网站,破解wordpress加密文件,做网站用备案吗前言 最近在学web编程的途中#xff0c;经过学长提醒#xff0c;在进行登陆#xff08;Login#xff09;操作之后#xff0c;识别是否登陆的标识应该要放入authorization中#xff0c;正好最近也在学鉴权#xff0c;就顺便来看看源码了。 正文 1. 代码示例 在进行分…前言 最近在学web编程的途中经过学长提醒在进行登陆Login操作之后识别是否登陆的标识应该要放入authorization中正好最近也在学鉴权就顺便来看看源码了。 正文 1. 代码示例 在进行分析之前先给予一段JWT生成和解析的代码示例这样可以随着代码一步一步深入到源码层面来帮助我们进一步理解JWT这一部分知识。 package api//关于jwt的所有操作都在这里 import (errorsfmtgithub.com/dgrijalva/jwt-gotime )var mySigningKey []byte(Bang dream Girls Band Part!114514Girls Band Cry!114514,Its My Go!!!!!)func GenerateJWT(username string) (string, error) {token : jwt.New(jwt.SigningMethodHS256)claims : token.Claims.(jwt.MapClaims)claims[username] usernameclaims[exp] time.Now().Add(time.Second * 30).Unix()ToKenSting, err : token.SignedString(mySigningKey)if err ! nil {return , err}return ToKenSting, nil }func VerifyJWT(tokenString string) (string, error) {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 mySigningKey, nil})if err ! nil {return , err}if claims, ok1 : token.Claims.(jwt.MapClaims); ok1 token.Valid {username : claims[username].(string)return username, nil}return , errors.New(token invalid) } 2. GenerateJWT 2.1 新建token token : jwt.New(jwt.SigningMethodHS256)在函数开头我们可以发现我们使用了jwt包中的new并传递了一个签名方法来新建了一个token 这个new函数又是如何实现的呢 我们可以发现new就是返回了一个token类型的指针而进一步向下查看NewWithClaims的实现 则是直接返回了Token结构体的指针其中的参数method.Alg()是直接返回了这个方法的Name claims则是这个token的声明也就是我们接下来需要写入数据的部分 2.2 签名方法类型 刚刚我们提到了我们在创建token对象的时候需要传递一个签名方法可以理解为我们的随后会以什么样的方式生成jwt字符串很多人可能会对这个签名方法是什么东西感到疑惑没有兴趣了解的可以跳过这一部分。 此处我们以SigningMethodHMAC为例子 这个所谓的签名方法实际上就是一个结构体源代码中我们可以看见代码为这个结构体创建了256/384/512的实例对象这就是我们真正可以访问的签名方法了但是这几个实例对象作为结构体实例的参数又是什么呢 如图所示在这个签名方法结构体所在的包中利用init函数为这些实例对象赋予了值而RegisterSigningMethod 如图所示RegisterSigningMethod的作用则是利用哈希表将签名方法的名字映射到这一结构体的实体对象相当于将签名方法注册到了实体中从逻辑上来说我觉得更美吧。 2.3 Claims claims : token.Claims.(jwt.MapClaims)claims[username] usernameclaims[exp] time.Now().Add(time.Second * 30).Unix()这一步对token中的Claims成员进行类型断言并作为MapClaims类型赋予claims变量此处由于Claims是一个接口并且MapClaims实际上是一个哈希表并且实现了Claims接口所以可以转换并且具有引用的作用意思是修改claims的值就相当于修改了token.Claims的值。 这里先不对Raw以及没讲到的成员变量做说明后面会提到。 我们可以看见MapClaims实际上是一个哈希表而这个类型实现了Valid方法所以就实现了Claims接口。 2.4 jwt字符串生成 ToKenSting, err : token.SignedString(mySigningKey)此处则是我们生成jwt字符串的一步了 此处除了两个需要注意的方法其他都很简单下面我们来看看这两个方法具体做了什么事情吧 func (t *Token) SigningString() (string, error) {var err errorparts : make([]string, 2)for i, _ : range parts {var jsonValue []byteif i 0 {if jsonValue, err json.Marshal(t.Header); err ! nil {return , err}} else {if jsonValue, err json.Marshal(t.Claims); err ! nil {return , err}}parts[i] EncodeSegment(jsonValue)}return strings.Join(parts, .), nil }首先是第一部分创建了一个长度为2的string切片随后我们对part进行遍历当遍历到第一个部分时代码将 Token 结构体中的头部信息t.Header序列化为 JSON 格式的字节切片。随后将其存储在parts[0]之中当遍历到part第二部分则是将Claims部分进行序列化并存入part[1]最后将这个切片用“.”连接起来。 随后来看看第二部分 func (m *SigningMethodHMAC) Sign(signingString string, key interface{}) (string, error) {if keyBytes, ok : key.([]byte); ok {if !m.Hash.Available() {return , ErrHashUnavailable}hasher : hmac.New(m.Hash.New, keyBytes)hasher.Write([]byte(signingString))return EncodeSegment(hasher.Sum(nil)), nil}return , ErrInvalidKeyType } 在这里首先对key进行类型断言由于此处我们传入的是字节切片所以不会出错随后再进行判断这个签名方法的hash值是否合法也就是看这个方法是否是正确的这样理解便好随后利用hmac包(对应了签名方法)中的New并传入我们的Key新建了一个哈希对象随后将之前我们在外部生成的签名写入这个哈希对象最后通过调用 hasher.Sum(nil) 计算并返回结果这个结果一般会是一个字符串形式的签名用于生成最终的 JWT而关于hash计算和生成其中的源码有点过于跑题了就不在这里展开讲了。 return strings.Join([]string{sstr, sig}, .), nil在生成签名的最后将之前生成的字符串利用“.”连接在一起这一步对于我们后面解析JWT字符串有大用到这一步就已经得到我们的JWT字符串了。 3. VerifyJWT 3.1 Parse 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 mySigningKey, nil})我们解析JWT字符串需要创建一个token来存储我们的解析后的结果而parse函数就是解析我们的JWT字符串的大杀器了在这个函数中我们需要传入原始的JWT字符串和一个匿名函数用来在Parse函数内部判断解析的方法时候正确。 func Parse(tokenString string, keyFunc Keyfunc) (*Token, error) {return new(Parser).Parse(tokenString, keyFunc) }在进入到函数内部之后我们发现又是一层套娃但是这一层新建了一个parser解析器以此来进行调用解析 func (p *Parser) Parse(tokenString string, keyFunc Keyfunc) (*Token, error) {return p.ParseWithClaims(tokenString, MapClaims{}, keyFunc) }继续进入下一步 func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyfunc) (*Token, error) {token, parts, err : p.ParseUnverified(tokenString, claims)if err ! nil {return token, err}// Verify signing method is in the required setif p.ValidMethods ! nil {var signingMethodValid falsevar alg token.Method.Alg()for _, m : range p.ValidMethods {if m alg {signingMethodValid truebreak}}if !signingMethodValid {// signing method is not in the listed setreturn token, NewValidationError(fmt.Sprintf(signing method %v is invalid, alg), ValidationErrorSignatureInvalid)}}// Lookup keyvar key interface{}if keyFunc nil {// keyFunc was not provided. short circuiting validationreturn token, NewValidationError(no Keyfunc was provided., ValidationErrorUnverifiable)}if key, err keyFunc(token); err ! nil {// keyFunc returned an errorif ve, ok : err.(*ValidationError); ok {return token, ve}return token, ValidationError{Inner: err, Errors: ValidationErrorUnverifiable}}vErr : ValidationError{}// Validate Claimsif !p.SkipClaimsValidation {if err : token.Claims.Valid(); err ! nil {// If the Claims Valid returned an error, check if it is a validation error,// If it was another error type, create a ValidationError with a generic ClaimsInvalid flag setif e, ok : err.(*ValidationError); !ok {vErr ValidationError{Inner: err, Errors: ValidationErrorClaimsInvalid}} else {vErr e}}}// Perform validationtoken.Signature parts[2]if err token.Method.Verify(strings.Join(parts[0:2], .), token.Signature, key); err ! nil {vErr.Inner errvErr.Errors | ValidationErrorSignatureInvalid}if vErr.valid() {token.Valid truereturn token, nil}return token, vErr }终于来到了我们的源代码分析环节 token, parts, err : p.ParseUnverified(tokenString, claims)if err ! nil {return token, err}首先第一步是对我们的token进行生成我们需要进入函数内部来进行分析。 func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Token, parts []string, err error) {parts strings.Split(tokenString, .)if len(parts) ! 3 {return nil, parts, NewValidationError(token contains an invalid number of segments, ValidationErrorMalformed)}token Token{Raw: tokenString}// parse Headervar headerBytes []byteif headerBytes, err DecodeSegment(parts[0]); err ! nil {if strings.HasPrefix(strings.ToLower(tokenString), bearer ) {return token, parts, NewValidationError(tokenstring should not contain bearer , ValidationErrorMalformed)}return token, parts, ValidationError{Inner: err, Errors: ValidationErrorMalformed}}if err json.Unmarshal(headerBytes, token.Header); err ! nil {return token, parts, ValidationError{Inner: err, Errors: ValidationErrorMalformed}}// parse Claimsvar claimBytes []bytetoken.Claims claimsif claimBytes, err DecodeSegment(parts[1]); err ! nil {return token, parts, ValidationError{Inner: err, Errors: ValidationErrorMalformed}}dec : json.NewDecoder(bytes.NewBuffer(claimBytes))if p.UseJSONNumber {dec.UseNumber()}// JSON Decode. Special case for map type to avoid weird pointer behaviorif c, ok : token.Claims.(MapClaims); ok {err dec.Decode(c)} else {err dec.Decode(claims)}// Handle decode errorif err ! nil {return token, parts, ValidationError{Inner: err, Errors: ValidationErrorMalformed}}// Lookup signature methodif method, ok : token.Header[alg].(string); ok {if token.Method GetSigningMethod(method); token.Method nil {return token, parts, NewValidationError(signing method (alg) is unavailable., ValidationErrorUnverifiable)}} else {return token, parts, NewValidationError(signing method (alg) is unspecified., ValidationErrorUnverifiable)}return token, parts, nil }是不是被吓到了没关系我带你来一步一步分析其实重要的部分并不多。 parts strings.Split(tokenString, .)if len(parts) ! 3 {return nil, parts, NewValidationError(token contains an invalid number of segments, ValidationErrorMalformed)}token Token{Raw: tokenString}在这里我们将原始JWT字符串利用我们之前设置的“.”分开这时候我们便可以进行初步的判断这个接受的jwt字符串是否合法判断之后我们先将原始jwt字符串存入新建的token对象的raw成员中这时候我们就需要提及我们之前没讲的raw成员他就是我们token对象的原始jwt字符串。 var headerBytes []byteif headerBytes, err DecodeSegment(parts[0]); err ! nil {if strings.HasPrefix(strings.ToLower(tokenString), bearer ) {return token, parts, NewValidationError(tokenstring should not contain bearer , ValidationErrorMalformed)}return token, parts, ValidationError{Inner: err, Errors: ValidationErrorMalformed}}if err json.Unmarshal(headerBytes, token.Header); err ! nil {return token, parts, ValidationError{Inner: err, Errors: ValidationErrorMalformed}}这里看着很复杂但是实际上抛开大量的if return真正解析的部分并不多这一部分就是将我们的jwt中的header部分进行解析随后判断是否出错而已随后将header中的信息存入token中。 // parse Claimsvar claimBytes []bytetoken.Claims claimsif claimBytes, err DecodeSegment(parts[1]); err ! nil {return token, parts, ValidationError{Inner: err, Errors: ValidationErrorMalformed}}dec : json.NewDecoder(bytes.NewBuffer(claimBytes))if p.UseJSONNumber {dec.UseNumber()}// JSON Decode. Special case for map type to avoid weird pointer behaviorif c, ok : token.Claims.(MapClaims); ok {err dec.Decode(c)} else {err dec.Decode(claims)}// Handle decode errorif err ! nil {return token, parts, ValidationError{Inner: err, Errors: ValidationErrorMalformed}} 这一步也很简单就是对我们的claims部分进行解析然后放入token中就结束了。 if method, ok : token.Header[alg].(string); ok {if token.Method GetSigningMethod(method); token.Method nil {return token, parts, NewValidationError(signing method (alg) is unavailable., ValidationErrorUnverifiable)}} else {return token, parts, NewValidationError(signing method (alg) is unspecified., ValidationErrorUnverifiable)}在最后从header获取方法的名字判断一下是否合法就可以返回了。 接下来回到上一层源代码 // Verify signing method is in the required setif p.ValidMethods ! nil {var signingMethodValid falsevar alg token.Method.Alg()for _, m : range p.ValidMethods {if m alg {signingMethodValid truebreak}}if !signingMethodValid {// signing method is not in the listed setreturn token, NewValidationError(fmt.Sprintf(signing method %v is invalid, alg), ValidationErrorSignatureInvalid)}}继续下一步p.ValidMethods是一个切片 type Parser struct {ValidMethods []string // If populated, only these methods will be considered validUseJSONNumber bool // Use JSON Number format in JSON decoderSkipClaimsValidation bool // Skip claims validation during token parsing }包含允许的签名方法。一个条件判断检查它是否为 nil如果不为 nil说明存在需要验证的方法集合随后遍历这个集合如果使用的签名方法在这个集合中便可进行下一步。 // Lookup keyvar key interface{}if keyFunc nil {// keyFunc was not provided. short circuiting validationreturn token, NewValidationError(no Keyfunc was provided., ValidationErrorUnverifiable)}if key, err keyFunc(token); err ! nil {// keyFunc returned an errorif ve, ok : err.(*ValidationError); ok {return token, ve}return token, ValidationError{Inner: err, Errors: ValidationErrorUnverifiable}}这一步很简单就是调用我们传入的匿名函数看看我们传入的签名方法是否和实际解析出来的的方法一致如果一致就进行下一步。 // Validate Claimsif !p.SkipClaimsValidation {if err : token.Claims.Valid(); err ! nil {// If the Claims Valid returned an error, check if it is a validation error,// If it was another error type, create a ValidationError with a generic ClaimsInvalid flag setif e, ok : err.(*ValidationError); !ok {vErr ValidationError{Inner: err, Errors: ValidationErrorClaimsInvalid}} else {vErr e}}}p.SkipClaimsValidation就是一个bool值这一步判断是否要跳过Claims的有效性验证如果有效进行下一步验证。 // Perform validationtoken.Signature parts[2]if err token.Method.Verify(strings.Join(parts[0:2], .), token.Signature, key); err ! nil {vErr.Inner errvErr.Errors | ValidationErrorSignatureInvalid}if vErr.valid() {token.Valid truereturn token, nil}return token, vErr }此处又要提到我们之前提到的token结构体中的signature成员了此处将jwt中的签名部分赋值给signatrue(签名) 这一部分用于确保 JWT 的完整性和身份验证。签名是通过将前两个部分的编码后结果与密钥进行哈希计算而生成的。 此处直接调用token.Method.Verify(…)进行验证便好。 最后调用 valid 方法检查当前的验证错误状态。如果没有错误即 vErr 是有效的则将 token.Valid 设置为 true直接返回就行了。 3.2 提取信息 最后回到我们的VerifyJWT函数 if claims, ok1 : token.Claims.(jwt.MapClaims); ok1 token.Valid {username : claims[username].(string)return username, nil}return , errors.New(token invalid)判断错误提取信息就好了。 那么关于源码的分析就到这里结束了如果有什么问题请留言~ 结语 其实看源码的过程还是蛮有趣的主要是可以感受着自己在一步一步变强的感觉也说不准代码的乐趣也很多关于JWT的源码分析就到这里结束了读完这篇文章你应该对JWT有更深的了解了~ 强者应该也不会到这里来吧…
http://www.ho-use.cn/article/10813851.html

相关文章:

  • 织梦资源下载站网站模板杭州比较好的景观设计公司
  • 湛江网站建设皆选小罗24专业免费游戏不用登录直接玩
  • 怎么查询网站是哪家公司做的wordpress修改发帖时间
  • 个人网站每年要多少钱织梦网站模版下载
  • 查询企业信息的官方网站长沙装修公司哪家好
  • 旅游网站的建设现状苏州市城乡建设局网站首页
  • 怎么在自己做网站网站安全建设架构
  • 商品网站建设实验报告子域名查询工具
  • 成都网站优化常识总部在上海的世界500强企业
  • 创建网站快捷方式到桌面oa办公管理系统哪个好
  • 怎么做相册的网站网站建设价格套餐
  • 阿里云个人网站制作湛江网站建设方案报价
  • 新乡高端网站建设北京seo教师
  • 天津建站模板网站模板展示
  • 网站开发维护求职信淘宝电子网站建设论文
  • 合适的网站建设明细报价表wordpress官方空间
  • 内蒙古网站建设熊掌号wordpress 伪静态500
  • 濮阳免费网站制作中国建筑工程网施工资料
  • 部门网站建设管理报告提供商城网站
  • 浅谈学校网站建设一个可以做行程的网站
  • 搜房网网站跳出率临沧网站建设公司招聘
  • 鹿泉城乡建设局网站网站单子
  • 中小学建设网站同一人可以做几个网站的负责人
  • 军博网站建设怎么用小程序做微网站
  • 龙城网站建设网站建设的现状分析
  • 十万pv的网站建设北京托管网站
  • 建设网站和推广知名网站开发公司
  • 包头市建设厅官方网站吉林市网站建设招标
  • 完成一份网站建设前期规划方案网站和微信公众号建设方案
  • 网站使用手册楚雄做网站