Day09 - Gem-jwt 介绍与应用

前言

JWT 是 JSON Web Token 的缩写。在写此篇时,发现已经有许多相关文章可参考,故本篇以实作为主,若想知道更深入部分,可直接看参考资料

JWT组成

HeaderPayloadSignature 所组成的字串,中间以 . 做间隔

# 写成一行的话,组成如下
Header.Payload.Signature

# 实际范例如下 (中间以 . 做间隔)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
组成 说明
Header 通常由演算法签章、 Token 类型所组成的 JSON,再做 Base64 URL 编码
Payload 需传递的资料放这
Signature Header、Payload、密钥 (secret) 透过杂凑演算法所产生

最终资料呈现如下方图左,是一个字串

动手做看看

官方 JWT 首页已有范例,这边以 Ruby 做演练

# 在 irb 中操作

require "json"
require "base64"
require "openssl"

header = { "alg" => "HS256", "typ" => "JWT" }
header_json = header.to_json # or JSON(header)
encoded_header = Base64.urlsafe_encode64(header_json, padding: false) # Base64 编码 header


payload = { "sub" => "1234567890", "name" => "John Doe", "iat" => 1516239022 }
payload_json = payload.to_json # or JSON(payload)
encoded_payload = Base64.urlsafe_encode64(payload_json, padding: false) # Base64 编码 payload


secret_key = "your-256-bit-secret"
data = "#{encoded_header}.#{encoded_payload}"
digest = OpenSSL::Digest::SHA256.new # 使用 SHA256 演算法
signature = OpenSSL::HMAC.digest(digest, secret_key, data) # 透过 HMAC 演算法签章
encoded_signature = Base64.urlsafe_encode64(signature, padding: false) # Base64 编码 signature


token = "#{encoded_header}.#{encoded_payload}.#{encoded_signature}"

# 验证,与 JWT 首页范例一样
token == "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"

使用 RubyGems

上述为手动实作,透过实作能更清楚如何运作
也可直接使用 jwt gem 来处理,一切变得简单多了,有兴趣可看下 source code 部分

# 使用 ruby-jwt gem 实作

hmac_secret = "your-256-bit-secret"
payload = { "sub" => "1234567890", "name" => "John Doe", "iat" => 1516239022 }

token = JWT.encode payload, hmac_secret, "HS256"

decoded_token = JWT.decode token, hmac_secret, true, { algorithm: "HS256" }
# # Array (payload + header)
# [
#   {
#     "sub" => "1234567890",
#     "name" => "John Doe",
#     "iat" => 1516239022
#   },
#   {
#     "alg" => "HS256"
#   }
# ]

小结

JWT 的特色有「JSON 通用性的关系,可跨语言使用」、「构造简单,size 小,便於传输」...等

在使用 JWT 时,不建议把敏感资料放里面,只要解码 Base64 便能看到原本的资料

推荐下面参考资料可以都看过一轮

参考资料

  1. https://jwt.io/
  2. JSON Web Token Wiki
  3. ruuby-jwt
  4. 是谁在敲打我窗?什麽是 JWT ?
  5. 见令如见人,介绍 JWT
  6. [笔记] 透过 JWT 实作验证机制
  7. JSON Web Token 入门教程
  8. JSON Web Token(JWT) 简单介绍

铁人赛文章连结:https://ithelp.ithome.com.tw/articles/10264580
medium 文章连结:https://link.medium.com/OYkJftn2Mjb
本文同步发布於 小菜的 Blog https://riverye.com/

备注:之後文章修改更新,以个人部落格为主


<<:  Day 16: 人工神经网路初探 损失函数(上)

>>:  {DAY10} SQL查询语法2

Day08 - 语音特徵撷取 - AFE

AFE 特徵是由欧洲电信标准协会所提出的。 AFE 论文参考连结: https://www.etsi...

调查类型(Investigation Types)

一个调查是收集和用於特定目的的证据分析。 行政调查(Administrative Investiga...

Day28 ATT&CK for ICS - Command and Control

Command and Control 攻击者已经进入工控环境之後,从自己的服务器传送指令给受害主机...

iOS APP 开发 OC 第二十二天,Portocol

tags: OC 30 day 什麽是Protocol? 作用:专门用来声明一大堆方法。(不能声明属...

Powershell 远程连接

使用过 Linux 的都知道,Linux 的 shell 不但可以本地运行,也可以通过远程的方式连接...