@@ -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+
248308test "SigningMethodEdDSA" {
249309 const alloc = std .heap .page_allocator ;
250310
0 commit comments