美文网首页
iOS下JWT SH256算法生成Token

iOS下JWT SH256算法生成Token

作者: ollieli | 来源:发表于2021-02-08 15:28 被阅读0次

移动端有三个实现方案,第一个是用JWT官方库(它封装了实现方法,直接调用api就能得到token),第二个代码实现token,第三个是注入一段js脚本。后面两个方法还是要基于jwt算法,因为苹果没有直接提供RSA,HMAC算法。

首先JWT官方是提供了两个库:JWT和SwiftyJWT分别对应了OC和swift版本,但是出于某些原因我没试成功,所以各位如果官方提供的库能实现的话就不用自己写了。
我用的是代码实现,这里我用了SwiftyCrypto(SwiftyCrypto包含了所需要的HMAC算法,比JWT轻,所以我只取自己需要的,而且这个库是官方SwiftyJWT的作者写的,所以尽管大胆放心的用)。

话不多说上代码:

pod 'SwiftyCrypto'

完事了导入frameworks(下面两个都要):

import SwiftyCrypto
import CCommonCrypto

下一步是实现过程:

let headers = [
    "alg": "HS256", #你想要的算法
    "typ": "JWT", #固定的JWT
]
# 这边payload需要传些参数,必传的参数我就不说明了,官方都有解释(比如说iss表示issuer)
# 我想说payload里面是可以随便携带参数的,所以和后端商量好想带啥带啥。
let payload: NSDictionary = [
    #谁创建的,负责对这个token进行签名的issuer
    "iss": authClient,
    # issuer at创建时间,传秒数,用Int包一下是去除小数位,别忘了
    "iat": Int(Date().timeIntervalSince1970), 
    # JWT ID,随机32位字符串
    "jti": UUID().uuidString,
    # operation这个是自定义的携带参数
    "operation": "customer_login",
    "store_hash": storeHash, #自定义
    "customer_id": bigCommerceCustomerId, #自定义
]
# 说一下为什么要用ABC表示参数,JWT是用A.B.C表示
# 这样可以清楚他们之间的关系(实际上我完全是图省事:D)
do {
    let dataA = try JSONSerialization.data(withJSONObject: headers, options: [])
    let dataB = try JSONSerialization.data(withJSONObject: payload, options: [])
    let strA = dataA.base64EncodedString()
        .replacingOccurrences(of: "+", with: "-")
        .replacingOccurrences(of: "/", with: "_")
        .replacingOccurrences(of: "=", with: "")
    let strB = dataB.base64EncodedString()
        .replacingOccurrences(of: "+", with: "-")
        .replacingOccurrences(of: "/", with: "_")
        .replacingOccurrences(of: "=", with: "")
    let strAB = "\(strA).\(strB)"
    # dataS使用`secrect`整出来的
    guard let dataAB = strAB.data(using: String.Encoding.utf8, allowLossyConversion: false),
          let dataS = authClientSecret.data(using: String.Encoding.utf8, allowLossyConversion: false) else {
        # 这边有可能转换失败,记得错误处理
        return
    }
    # 下面这一坨也不知道啥意思,整就完事儿了
    # 感兴趣的可以百度一下HMAC算法
    let ctx = UnsafeMutablePointer<CCHmacContext>.allocate(capacity: 1)
    defer { ctx.deallocate() }
    dataS.withUnsafeBytes { buffer in
        # 瞅见没,我们的算法类型在这儿传入
        CCHmacInit(ctx, CCHmacAlgorithm(kCCHmacAlgSHA256), buffer, size_t(dataS.count)) 
    }
    dataAB.withUnsafeBytes { buffer in
        CCHmacUpdate(ctx, buffer, size_t(dataAB.count))
    }
    var hmac = Array<UInt8>(repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))
    CCHmacFinal(ctx, &hmac)
    let strHmac = Data(hmac).base64EncodedString()
        .replacingOccurrences(of: "+", with: "-")
        .replacingOccurrences(of: "/", with: "_")
        .replacingOccurrences(of: "=", with: "")
    # A + B + secrect = C的流程一波下来我想你也懂了哈哈
    let token = "\(strAB).\(strHmac)"
    
} catch let err {
    # 错误处理
}
参考:

JTW官方SDK各语言都有 https://jwt.io/#libraries-io
SwiftyCrypto

相关文章

  • iOS下JWT SH256算法生成Token

    移动端有三个实现方案,第一个是用JWT官方库(它封装了实现方法,直接调用api就能得到token),第二个代码实现...

  • jwt 在微服务中应用

    jwt token jwt 在api 方式中表中的token生成,验证以及获取jwt解密后携带的用户信息 jwt ...

  • IdentityServer4 自制证书

    IdentityServer4中生成token默认都是采用RSA256算法(非对称算法)签名的JWT格式。生产环境...

  • JWT认证原理分析

    基于session的认证 JWT认证规则 JWT(Json Web Token) JWT原理 签发算法 校验算法 ...

  • 利用JWT生成Token

    开篇 实现Token的方式有很多,本篇介绍的是利用Json Web Token(JWT)生成的Token.JWT生...

  • 微服务下的登录校验方案JWT

    传统的方案sesion共享 本项目采用jwt 加解密算法生成token校验。 jwt的客户端存储 我们一般会放在l...

  • Java-token

    token基础 生成token 解析token 问题 : 在退出登录 / 修改密码时怎样实现JWT Token失效...

  • jwt-simple 包使用详解

    一、简介 JWT(JSON Web Token) 编码解码模块 二、使用 安装 生成token & 解析token...

  • golang jwt鉴权分析

    技术栈 gin+jwt 鉴权流程:调用token生成方法GenerateToken生成token, 请求api...

  • JWT网关,基于kong

    说明 实现了Jwt拦截,登录时调用第三方登录接口。登录后会生成JWT-token,把返回的jwt-token放入h...

网友评论

      本文标题:iOS下JWT SH256算法生成Token

      本文链接:https://www.haomeiwen.com/subject/poednttx.html