@@ -20,9 +20,6 @@ class JWT {
2020  /// value is a timestamp (number of seconds since epoch) in UTC if 
2121  /// [issueAtUtc]  is true, it is compared to the value of the 'iat' claim. 
2222  /// Verification fails if the 'iat' claim is before [issueAt] . 
23-   /// 
24-   /// If the embedded `payload`  is not a JSON map (but rather just a plain string), 
25-   /// none of the verifications are executed. In that case only the signature is verified. 
2623static  JWT  verify (
2724    String  token,
2825    JWTKey  key, {
@@ -64,11 +61,10 @@ class JWT {
6461        throw  JWTInvalidException ('invalid signature' );
6562      }
6663
67-       Object  payload;
64+       dynamic  payload;
6865
6966      try  {
70-         payload = 
71-             jsonBase64.decode (base64Padded (parts[1 ])) as  Map <String , dynamic >;
67+         payload =  jsonBase64.decode (base64Padded (parts[1 ]));
7268      } catch  (ex) {
7369        payload =  utf8.decode (base64Url.decode (base64Padded (parts[1 ])));
7470      }
@@ -205,16 +201,18 @@ class JWT {
205201  /// 
206202  /// This also sets [JWT.audience] , [JWT.subject] , [JWT.issuer] , and 
207203  /// [JWT.jwtId]  even though they are not verified. Use with caution. 
208-   /// 
209-   /// This methods only supports map payloads. For `String`  payloads use `verify` . 
210204static  JWT  decode (String  token) {
211205    try  {
212206      final  parts =  token.split ('.' );
213-       var  header = 
214-           jsonBase64.decode (base64Padded (parts[0 ])) as  Map <String , dynamic >;
207+       var  header =  jsonBase64.decode (base64Padded (parts[0 ]));
215208
216-       final  payload = 
217-           (jsonBase64.decode (base64Padded (parts[1 ])) as  Map <String , dynamic >);
209+       dynamic  payload;
210+ 
211+       try  {
212+         payload =  jsonBase64.decode (base64Padded (parts[1 ]));
213+       } catch  (ex) {
214+         payload =  utf8.decode (base64Url.decode (base64Padded (parts[1 ])));
215+       }
218216
219217      final  audience =  _parseAud (payload['aud' ]);
220218      final  issuer =  payload['iss' ]? .toString ();
@@ -223,7 +221,7 @@ class JWT {
223221
224222      return  JWT (
225223        payload,
226-         header:  header,
224+         header:  header  is !   Map < String ,  dynamic >  ?   null   :  header ,
227225        audience:  audience,
228226        issuer:  issuer,
229227        subject:  subject,
@@ -249,36 +247,16 @@ class JWT {
249247
250248  /// JSON Web Token 
251249JWT (
252-     Object   payload, {
250+     this . payload, {
253251    this .audience,
254252    this .subject,
255253    this .issuer,
256254    this .jwtId,
257255    this .header,
258-   }) {
259-     this .payload =  payload;
260-   }
261- 
262-   late  Object  _payload;
256+   });
263257
264-   /// The token's payload, either as a `Map<String, dynamic>`  or plain `String`  
265-   /// (in case it was not a JSON-encoded map). 
266-   /// 
267-   /// If it's a map, it has all claims, containing the utilized registered claims 
268-   /// as well custom ones added. 
269- Object  get  payload =>  _payload;
270- 
271-   void  set  payload (Object  value) {
272-     if  (value is  String ) {
273-       _payload =  value;
274-     } else  if  (value is  Map ) {
275-       _payload =  Map <String , dynamic >.from (value);
276-     } else  {
277-       throw  Exception (
278-         'Unexpected `payload` type `${value .runtimeType }`, must be either `String` or `Map<String, *>`' ,
279-       );
280-     }
281-   }
258+   /// Custom claims 
259+ dynamic  payload;
282260
283261  /// Audience claim 
284262Audience ?  audience;
@@ -310,8 +288,7 @@ class JWT {
310288    bool  noIssueAt =  false ,
311289  }) {
312290    try  {
313-       var  payload =  this .payload;
314-       if  (payload is  Map <String , dynamic >) {
291+       if  (payload is  Map <String , dynamic > ||  payload is  Map <dynamic , dynamic >) {
315292        try  {
316293          payload =  Map <String , dynamic >.from (payload);
317294
0 commit comments