Skip to content

Commit 664572c

Browse files
committed
fixed
1 parent 6da7cb0 commit 664572c

File tree

3 files changed

+75
-5
lines changed

3 files changed

+75
-5
lines changed

build.zig.zon

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
.{
22
.name = "zig-jwt",
33
.description = "A JWT (JSON Web Token) library for zig.",
4-
.version = "1.0.8",
4+
.version = "1.0.9",
55
.paths = .{
66
"build.zig",
77
"build.zig.zon",

src/jwt.zig

Lines changed: 63 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,28 @@ pub fn JWT(comptime Signer: type, comptime SecretKeyType: type, comptime PublicK
5656
};
5757
}
5858

59+
pub fn alg(self: Self) []const u8 {
60+
return self.signer.alg();
61+
}
62+
63+
pub fn signLength(self: Self) isize {
64+
return self.signer.signLength();
65+
}
66+
67+
// use SigningMethod to make token
5968
pub fn sign(self: Self, claims: anytype, secret_key: SecretKeyType) ![]const u8 {
60-
var t = token.Token.init(self.alloc);
61-
try t.setHeader(.{
69+
const header = .{
6270
.typ = "JWT",
6371
.alg = self.signer.alg(),
64-
});
72+
};
73+
74+
return try self.signWithHeader(header, claims, secret_key);
75+
}
76+
77+
// use SigningMethod with header to make token
78+
pub fn signWithHeader(self: Self, header: anytype, claims: anytype, secret_key: SecretKeyType) ![]const u8 {
79+
var t = token.Token.init(self.alloc);
80+
try t.setHeader(header);
6581
try t.setClaims(claims);
6682

6783
const signing_string = try t.signingString();
@@ -76,6 +92,7 @@ pub fn JWT(comptime Signer: type, comptime SecretKeyType: type, comptime PublicK
7692
return signed_token;
7793
}
7894

95+
// parse token and verify token signature
7996
pub fn parse(self: Self, token_string: []const u8, public_key: PublicKeyType) !token.Token {
8097
var t = token.Token.init(self.alloc);
8198
try t.parse(token_string);
@@ -245,6 +262,49 @@ test "parse JWTSignatureInvalid" {
245262

246263
}
247264

265+
test "SigningMethodEdDSA signWithHeader" {
266+
const alloc = std.heap.page_allocator;
267+
268+
const kp = eddsa.Ed25519.KeyPair.generate();
269+
270+
const claims = .{
271+
.aud = "example.com",
272+
.sub = "foo",
273+
};
274+
275+
const s = SigningMethodEdDSA.init(alloc);
276+
277+
const header = .{
278+
.typ = "JWT",
279+
.alg = s.alg(),
280+
.tuy = "data123",
281+
};
282+
283+
const token_string = try s.signWithHeader(header, claims, kp.secret_key);
284+
try testing.expectEqual(true, token_string.len > 0);
285+
try testing.expectEqualStrings("EdDSA", header.alg);
286+
287+
// ==========
288+
289+
const p = SigningMethodEdDSA.init(alloc);
290+
var parsed = try p.parse(token_string, kp.public_key);
291+
292+
const header2 = try parsed.getHeaderValue();
293+
try testing.expectEqualStrings(header.typ, header2.object.get("typ").?.string);
294+
try testing.expectEqualStrings(header.alg, header2.object.get("alg").?.string);
295+
try testing.expectEqualStrings(header.tuy, header2.object.get("tuy").?.string);
296+
297+
const claims2 = try parsed.getClaims();
298+
try testing.expectEqualStrings(claims.aud, claims2.object.get("aud").?.string);
299+
try testing.expectEqualStrings(claims.sub, claims2.object.get("sub").?.string);
300+
301+
// ==========
302+
303+
try testing.expectEqual(64, s.signLength());
304+
try testing.expectEqualStrings("EdDSA", s.alg());
305+
306+
}
307+
248308
test "SigningMethodEdDSA" {
249309
const alloc = std.heap.page_allocator;
250310

src/token.zig

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ pub const Token = struct {
3636
self.header = header;
3737
}
3838

39-
pub fn setHeader(self: *Self, header: Header) !void {
39+
pub fn setHeader(self: *Self, header: anytype) !void {
4040
self.header = try utils.jsonEncode(self.alloc, header);
4141
}
4242

@@ -158,6 +158,11 @@ pub const Token = struct {
158158
};
159159
}
160160

161+
pub fn getHeaderValue(self: *Self) !json.Value {
162+
const header = try utils.jsonDecode(self.alloc, self.header);
163+
return header;
164+
}
165+
161166
pub fn getHeaderT(self: *Self, comptime T: type) !T {
162167
const header = try utils.jsonDecodeT(T, self.alloc, self.header);
163168
return header;
@@ -464,6 +469,11 @@ test "Token 3" {
464469
try testing.expectEqualStrings(header.alg, header3.alg);
465470
try testing.expectEqualStrings(header.kid.?, header3.kid);
466471

472+
const header33 = try token2.getHeaderValue();
473+
try testing.expectEqualStrings(header.typ, header33.object.get("typ").?.string);
474+
try testing.expectEqualStrings(header.alg, header33.object.get("alg").?.string);
475+
try testing.expectEqualStrings(header.kid.?, header33.object.get("kid").?.string);
476+
467477
}
468478

469479
test "Token isExpired" {

0 commit comments

Comments
 (0)