Skip to content

Commit 7ba828a

Browse files
committed
fixes
1 parent 532beec commit 7ba828a

File tree

4 files changed

+41
-25
lines changed

4 files changed

+41
-25
lines changed

jwt-0.3-1.rockspec renamed to jwt-0.3-2.rockspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
package = "jwt"
2-
version = "0.3-1"
2+
version = "0.3-2"
33
source = {
44
url = "https://github.com/Olivine-Labs/lua-jwt/archive/v0.3.tar.gz",
55
dir = "lua-jwt-0.3"

spec/jwt_spec.lua

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
describe("JWT spec", function()
22

33
local jwt = require 'jwt'
4+
local crypto = require 'crypto'
45
local plainJwt = "eyJhbGciOiJub25lIn0.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ"
56

67
it("can decode a plain text token", function()
@@ -50,16 +51,6 @@ describe("JWT spec", function()
5051
assert.are.same(claims, decodedClaims)
5152
end)
5253

53-
it("it cannot decode a token without a signature but with a key specified", function()
54-
local claims = {
55-
test = "test",
56-
}
57-
local keyPair = crypto.pkey.generate("rsa", 512)
58-
local token, err = jwt.encode(claims, {alg = "RS256"})
59-
local decodedClaims = jwt.decode(token, {keys = {public = keyPair}})
60-
assert.are.same(decodedClaims, nil)
61-
end)
62-
6354
it("it cannot encode/decode a signed plain text token with alg=RS256 and an incorrect key", function()
6455
local claims = {
6556
test = "test",
@@ -93,4 +84,32 @@ EQIDAQAB
9384
assert(not token)
9485
assert(err ~= nil)
9586
end)
87+
88+
it("can encode and decode rs256", function()
89+
local keys = {
90+
private = crypto.pkey.from_pem(
91+
[[-----BEGIN RSA PRIVATE KEY-----
92+
MIIBOwIBAAJBANfnFz7xPmYVdJxZE7sQ5quh/XUzB5y/D5z2A7KPYXUgUP0jd5yL
93+
Z7+pVBcFSUm5AZXJLXH4jPVOXztcmiu4ta0CAwEAAQJBAJYXWNmw7Cgbkk1+v3C0
94+
dyeqHYF0UD5vtHLxs/BWLPI2lZO0e6ixFNI4uIuatBox1Zbzt1TSy8T09Slt4tNL
95+
CAECIQD6PHDGtKXcI2wUSvh4y8y7XfvwlwRPU2AzWZ1zvOCbbQIhANzgMpUNOZL2
96+
vakju4sal1yZeXUWO8FurmsAyotAx9tBAiB2oQKh4PAkXZKWSDhlI9CqHtMaaq17
97+
Yb5geaKARNGCPQIgILYrh5ufzT4xtJ0QJ3fWtuYb8NVMIEeuGTbSyHDdqIECIQDZ
98+
3LNCyR2ykwetc6KqbQh3W4VkuatAQgMv5pNdFLrfmg==
99+
-----END RSA PRIVATE KEY-----]], true),
100+
public = crypto.pkey.from_pem(
101+
[[-----BEGIN PUBLIC KEY-----
102+
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANfnFz7xPmYVdJxZE7sQ5quh/XUzB5y/
103+
D5z2A7KPYXUgUP0jd5yLZ7+pVBcFSUm5AZXJLXH4jPVOXztcmiu4ta0CAwEAAQ==
104+
-----END PUBLIC KEY-----]], false),
105+
}
106+
local claims = {
107+
test = "test",
108+
longClaim = "iubvn1oubv91henvicuqnw93bn19u ndij npkhabsdvlb23iou4bijbandlivubhql3ubvliuqwdbnvliuqwhv9ulqbhiulbiluabsdvuhbq9urbv9ubqubxuvbu9qbdshvuhqniuhv9uhbfq9uhr89hqu9ebnv9uqhu9rbvp9843$#BVCo²¸´no414i"
109+
}
110+
local token = jwt.encode(claims, {alg = "RS256", keys = keys})
111+
local decodedClaims, err = jwt.decode(token, {keys = keys})
112+
if not decodedClaims then error(err) end
113+
assert.are.same(claims, decodedClaims)
114+
end)
96115
end)

src/jwt.lua

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,17 +45,14 @@ function data.encode(claims, options)
4545
local header = header(options)
4646
local token, err = jwt:encode(header, claims, options)
4747
if not token then return nil, err end
48-
return token:gsub('+','-'):gsub('/','_'):gsub('=','')
48+
return token
4949
end
5050

5151
function data.decode(str, options)
5252
if not str then return nil, "Parameter 1 cannot be nil" end
5353
local dotFirst = str:find("%.")
5454
if not dotFirst then return nil, "Invalid token" end
5555
str = str:gsub('-','+'):gsub('_','/')
56-
local mod = #str % 3
57-
if mod == 1 then str = str..'='
58-
elseif mod == 2 then str = str..'==' end
5956
local header = json.decode((basexx.from_base64(str:sub(1,dotFirst-1))))
6057

6158
return getJwt(header):decode(header, str, options)

src/jwt/jws.lua

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,17 @@ data.verify = {
2121
end,
2222
}
2323

24+
local function urlSafe(base64)
25+
return base64:gsub('+','-'):gsub('/','_'):gsub('=','')
26+
end
27+
2428
function data:encode(header, claims, options)
2529
if not options then error("options are required") end
26-
local claims = json.encode(claims)
27-
local envelope = basexx.to_base64(json.encode(header)).."."..basexx.to_base64(claims)
28-
local signature
29-
if options.keys then
30-
local err
31-
signature, err = self.sign[header.alg](envelope, options.keys.private)
32-
if not signature then return nil, err end
33-
end
34-
return envelope .. "." .. (signature and basexx.to_base64(signature) or "")
30+
if not options.keys then error("keys are required") end
31+
local envelope = urlSafe(basexx.to_base64(json.encode(header)).."."..basexx.to_base64(json.encode(claims)))
32+
local signature, err = self.sign[header.alg](envelope, options.keys.private)
33+
if not signature then error('failed to generate signature') end
34+
return envelope ..'.'..urlSafe(basexx.to_base64(signature))
3535
end
3636

3737
function data:decode(header, str, options)
@@ -55,7 +55,7 @@ function data:decode(header, str, options)
5555

5656
local message = basexx.from_base64(bodyStr)
5757
if signature then
58-
if not self.verify[header.alg](rawHeader.."."..bodyStr, signature, options.keys.public) then
58+
if not self.verify[header.alg](urlSafe(rawHeader).."."..urlSafe(bodyStr), signature, options.keys.public) then
5959
return nil, "Invalid token"
6060
end
6161
end

0 commit comments

Comments
 (0)