|
| 1 | +import 'dart:convert'; |
| 2 | + |
1 | 3 | import 'package:dart_jsonwebtoken/dart_jsonwebtoken.dart'; |
2 | 4 |
|
3 | 5 | /// JWT Header structure |
@@ -159,21 +161,114 @@ class GetClaimsOptions { |
159 | 161 | } |
160 | 162 |
|
161 | 163 | class JWKSet { |
162 | | - final List<JWTKey> keys; |
| 164 | + final List<JWK> keys; |
163 | 165 |
|
164 | 166 | JWKSet({required this.keys}); |
165 | 167 |
|
166 | 168 | factory JWKSet.fromJson(Map<String, dynamic> json) { |
167 | 169 | final keys = (json['keys'] as List<dynamic>?) |
168 | | - ?.map((e) => JWTKey.fromJWK(e as Map<String, dynamic>)) |
| 170 | + ?.map((e) => JWK.fromJson(e as Map<String, dynamic>)) |
169 | 171 | .toList() ?? |
170 | 172 | []; |
171 | 173 | return JWKSet(keys: keys); |
172 | 174 | } |
173 | 175 |
|
174 | 176 | Map<String, dynamic> toJson() { |
175 | 177 | return { |
176 | | - 'keys': keys.map((e) => e.toJWK()).toList(), |
| 178 | + 'keys': keys.map((e) => e.toJson()).toList(), |
| 179 | + }; |
| 180 | + } |
| 181 | +} |
| 182 | + |
| 183 | +/// {@template jwk} |
| 184 | +/// JSON Web Key (JWK) representation. |
| 185 | +/// {@endtemplate} |
| 186 | +class JWK { |
| 187 | + /// The "kty" (key type) parameter identifies the cryptographic algorithm |
| 188 | + /// family used with the key, such as "RSA" or "EC". |
| 189 | + final String kty; |
| 190 | + |
| 191 | + /// The "key_ops" (key operations) parameter identifies the cryptographic |
| 192 | + /// operations for which the key is intended to be used. |
| 193 | + final List<String> keyOps; |
| 194 | + |
| 195 | + /// The "alg" (algorithm) parameter identifies the algorithm intended for |
| 196 | + /// use with the key. |
| 197 | + final String? alg; |
| 198 | + |
| 199 | + /// The "kid" (key ID) parameter is used to match a specific key. |
| 200 | + final String? kid; |
| 201 | + |
| 202 | + /// Additional arbitrary properties of the JWK. |
| 203 | + final Map<String, dynamic> _additionalProperties; |
| 204 | + |
| 205 | + /// {@macro jwk} |
| 206 | + JWK({ |
| 207 | + required this.kty, |
| 208 | + required this.keyOps, |
| 209 | + this.alg, |
| 210 | + this.kid, |
| 211 | + Map<String, dynamic>? additionalProperties, |
| 212 | + }) : _additionalProperties = additionalProperties ?? {}; |
| 213 | + |
| 214 | + /// Creates a [JWK] from a JSON map. |
| 215 | + factory JWK.fromJson(Map<String, dynamic> json) { |
| 216 | + final kty = json['kty'] as String; |
| 217 | + final keyOps = |
| 218 | + (json['key_ops'] as List<dynamic>?)?.map((e) => e as String).toList() ?? |
| 219 | + []; |
| 220 | + final alg = json['alg'] as String?; |
| 221 | + final kid = json['kid'] as String?; |
| 222 | + |
| 223 | + final Map<String, dynamic> additionalProperties = Map.from(json); |
| 224 | + additionalProperties.remove('kty'); |
| 225 | + additionalProperties.remove('key_ops'); |
| 226 | + additionalProperties.remove('alg'); |
| 227 | + additionalProperties.remove('kid'); |
| 228 | + |
| 229 | + return JWK( |
| 230 | + kty: kty, |
| 231 | + keyOps: keyOps, |
| 232 | + alg: alg, |
| 233 | + kid: kid, |
| 234 | + additionalProperties: additionalProperties, |
| 235 | + ); |
| 236 | + } |
| 237 | + |
| 238 | + /// Allows accessing additional properties using operator[]. |
| 239 | + dynamic operator [](String key) { |
| 240 | + switch (key) { |
| 241 | + case 'kty': |
| 242 | + return kty; |
| 243 | + case 'key_ops': |
| 244 | + return keyOps; |
| 245 | + case 'alg': |
| 246 | + return alg; |
| 247 | + case 'kid': |
| 248 | + return kid; |
| 249 | + default: |
| 250 | + return _additionalProperties[key]; |
| 251 | + } |
| 252 | + } |
| 253 | + |
| 254 | + /// Converts this [JWK] to a JSON map. |
| 255 | + Map<String, dynamic> toJson() { |
| 256 | + final Map<String, dynamic> json = { |
| 257 | + 'kty': kty, |
| 258 | + 'key_ops': keyOps, |
| 259 | + ..._additionalProperties, |
177 | 260 | }; |
| 261 | + if (alg != null) { |
| 262 | + json['alg'] = alg; |
| 263 | + } |
| 264 | + if (kid != null) { |
| 265 | + json['kid'] = kid; |
| 266 | + } |
| 267 | + return json; |
| 268 | + } |
| 269 | + |
| 270 | + RSAPublicKey get rsaPublicKey { |
| 271 | + final bytes = utf8.encode(json.encode(toJson())); |
| 272 | + return RSAPublicKey.bytes(bytes); |
178 | 273 | } |
179 | 274 | } |
0 commit comments