|
1 | 1 | import { FakerError } from '../../errors/faker-error';
|
| 2 | +import { toBase64Url } from '../../internal/base64'; |
2 | 3 | import { deprecated } from '../../internal/deprecated';
|
3 | 4 | import { ModuleBase } from '../../internal/module-base';
|
4 | 5 | import { charMapping } from './char-mappings';
|
@@ -1019,4 +1020,106 @@ export class InternetModule extends ModuleBase {
|
1019 | 1020 | this.faker.definitions.internet.emoji[emojiType]
|
1020 | 1021 | );
|
1021 | 1022 | }
|
| 1023 | + |
| 1024 | + /** |
| 1025 | + * Generates a random JWT (JSON Web Token) Algorithm. |
| 1026 | + * |
| 1027 | + * @see faker.internet.jwt(): For generating random JWT (JSON Web Token). |
| 1028 | + * |
| 1029 | + * @example |
| 1030 | + * faker.internet.jwtAlgorithm() // 'HS256' |
| 1031 | + * faker.internet.jwtAlgorithm() // 'RS512' |
| 1032 | + * |
| 1033 | + * @since 9.1.0 |
| 1034 | + */ |
| 1035 | + jwtAlgorithm(): string { |
| 1036 | + return this.faker.helpers.arrayElement( |
| 1037 | + this.faker.definitions.internet.jwt_algorithm |
| 1038 | + ); |
| 1039 | + } |
| 1040 | + |
| 1041 | + /** |
| 1042 | + * Generates a random JWT (JSON Web Token). |
| 1043 | + * |
| 1044 | + * Please note that this method generates a random signature instead of a valid one. |
| 1045 | + * |
| 1046 | + * @param options The optional options object. |
| 1047 | + * @param options.header The Header to use for the token. Defaults to a random object with the following fields: `alg` and `typ`. |
| 1048 | + * @param options.payload The Payload to use for the token. Defaults to a random object with the following fields: `iat`, `exp`, `nbf`, `iss`, `sub`, `aud`, and `jti`. |
| 1049 | + * @param options.refDate The date to use as reference point for the newly generated date. |
| 1050 | + * |
| 1051 | + * @see https://datatracker.ietf.org/doc/html/rfc7519 |
| 1052 | + * @see faker.internet.jwtAlgorithm(): For generating random JWT (JSON Web Token) Algorithm. |
| 1053 | + * |
| 1054 | + * @example |
| 1055 | + * faker.internet.jwt() |
| 1056 | + * faker.internet.jwt({ header: { alg: 'HS256' }}) // 'eyJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE3MTg2MTM3MTIsImV4cCI6MTcxODYzMzY3OSwibmJmIjoxNjk3MjYzNjMwLCJpc3MiOiJEb3lsZSBhbmQgU29ucyIsInN1YiI6IjYxYWRkYWFmLWY4MjktNDkzZS1iNTI1LTJjMGJkNjkzOTdjNyIsImF1ZCI6IjczNjcyMjVjLWIwMWMtNGE1My1hYzQyLTYwOWJkZmI1MzBiOCIsImp0aSI6IjU2Y2ZkZjAxLWRhMzMtNGUxNi04MzJiLTFlYTk3ZGY1MTQ2YSJ9.5iUgaCaFVPZ8d1QD0xMjoeJbmPVyUfKfoRQ6Njzm5MLp5F4UMh5REbPCrW70fAkr' |
| 1057 | + * faker.internet.jwt({ payload: { iss: 'Acme' }}) // 'eyJhbGciOiJFUzM4NCIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJBY21lIn0.syUt0GBukNac8Cn1AGKFq2SWAXWy1YIfl0uOYiwg6TZ3omAW0c7FGWY6bC7ZOFSt' |
| 1058 | + * faker.internet.jwt({ refDate: '2020-01-01T00:00:00.000Z' }) // 'eyJhbGciOiJFUzM4NCIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE1Nzc4MDY4NDUsImV4cCI6MTU3Nzg0NjI4MCwibmJmIjoxNTgxNTQyMDYwLCJpc3MiOiJLcmVpZ2VyLCBBbHRlbndlcnRoIGFuZCBQYXVjZWsiLCJzdWIiOiI5NzVjMjMyOS02MDlhLTRjYTYtYjBkZi05ZmY4MGZiNDUwN2QiLCJhdWQiOiI0ODQxZWYwNi01OWYwLTQzMWEtYmFmZi0xMjkxZmRhZDdhNjgiLCJqdGkiOiJmNDBjZTJiYi00ZWYyLTQ1MjMtOGIxMy1kN2Q4NTA5N2M2ZTUifQ.cuClEZQ0CyPIMVS5uxrMwWXz0wcqFFdt0oNne3PMryyly0jghkxVurss2TapMC3C' |
| 1059 | + * |
| 1060 | + * @since 9.1.0 |
| 1061 | + */ |
| 1062 | + jwt( |
| 1063 | + options: { |
| 1064 | + /** |
| 1065 | + * The header to use for the token. If present, it will replace any default values. |
| 1066 | + * |
| 1067 | + * @default |
| 1068 | + * { |
| 1069 | + * alg: faker.internet.jwtAlgorithm(), |
| 1070 | + * typ: 'JWT' |
| 1071 | + * } |
| 1072 | + */ |
| 1073 | + header?: Record<string, unknown>; |
| 1074 | + /** |
| 1075 | + * The payload to use for the token. If present, it will replace any default values. |
| 1076 | + * |
| 1077 | + * @default |
| 1078 | + * { |
| 1079 | + * iat: faker.date.recent(), |
| 1080 | + * exp: faker.date.soon(), |
| 1081 | + * nbf: faker.date.anytime(), |
| 1082 | + * iss: faker.company.name(), |
| 1083 | + * sub: faker.string.uuid(), |
| 1084 | + * aud: faker.string.uuid(), |
| 1085 | + * jti: faker.string.uuid() |
| 1086 | + * } |
| 1087 | + */ |
| 1088 | + payload?: Record<string, unknown>; |
| 1089 | + /** |
| 1090 | + * The date to use as reference point for the newly generated date. |
| 1091 | + * |
| 1092 | + * @default faker.defaultRefDate() |
| 1093 | + */ |
| 1094 | + refDate?: string | Date | number; |
| 1095 | + } = {} |
| 1096 | + ): string { |
| 1097 | + const { refDate = this.faker.defaultRefDate() } = options; |
| 1098 | + |
| 1099 | + const iatDefault = this.faker.date.recent({ refDate }); |
| 1100 | + |
| 1101 | + const { |
| 1102 | + header = { |
| 1103 | + alg: this.jwtAlgorithm(), |
| 1104 | + typ: 'JWT', |
| 1105 | + }, |
| 1106 | + payload = { |
| 1107 | + iat: Math.round(iatDefault.valueOf() / 1000), |
| 1108 | + exp: Math.round( |
| 1109 | + this.faker.date.soon({ refDate: iatDefault }).valueOf() / 1000 |
| 1110 | + ), |
| 1111 | + nbf: Math.round(this.faker.date.anytime({ refDate }).valueOf() / 1000), |
| 1112 | + iss: this.faker.company.name(), |
| 1113 | + sub: this.faker.string.uuid(), |
| 1114 | + aud: this.faker.string.uuid(), |
| 1115 | + jti: this.faker.string.uuid(), |
| 1116 | + }, |
| 1117 | + } = options; |
| 1118 | + |
| 1119 | + const encodedHeader = toBase64Url(JSON.stringify(header)); |
| 1120 | + const encodedPayload = toBase64Url(JSON.stringify(payload)); |
| 1121 | + const signature = this.faker.string.alphanumeric(64); |
| 1122 | + |
| 1123 | + return `${encodedHeader}.${encodedPayload}.${signature}`; |
| 1124 | + } |
1022 | 1125 | }
|
0 commit comments