@logto/js 3.0.1 → 4.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -52,15 +52,15 @@ exports.Prompt = void 0;
52
52
  Prompt["Login"] = "login";
53
53
  })(exports.Prompt || (exports.Prompt = {}));
54
54
 
55
- Object.defineProperty(exports, 'ReservedResource', {
55
+ Object.defineProperty(exports, "ReservedResource", {
56
56
  enumerable: true,
57
57
  get: function () { return openid.ReservedResource; }
58
58
  });
59
- Object.defineProperty(exports, 'ReservedScope', {
59
+ Object.defineProperty(exports, "ReservedScope", {
60
60
  enumerable: true,
61
61
  get: function () { return openid.ReservedScope; }
62
62
  });
63
- Object.defineProperty(exports, 'UserScope', {
63
+ Object.defineProperty(exports, "UserScope", {
64
64
  enumerable: true,
65
65
  get: function () { return openid.UserScope; }
66
66
  });
@@ -20,7 +20,7 @@ const fetchTokenByAuthorizationCode = async ({ clientId, tokenEndpoint, redirect
20
20
  const snakeCaseCodeTokenResponse = await requester(tokenEndpoint, {
21
21
  method: 'POST',
22
22
  headers: index.ContentType.formUrlEncoded,
23
- body: parameters,
23
+ body: parameters.toString(),
24
24
  });
25
25
  return camelcaseKeys__default.default(snakeCaseCodeTokenResponse);
26
26
  };
@@ -48,7 +48,7 @@ const fetchTokenByRefreshToken = async (params, requester) => {
48
48
  const snakeCaseRefreshTokenTokenResponse = await requester(tokenEndpoint, {
49
49
  method: 'POST',
50
50
  headers: index.ContentType.formUrlEncoded,
51
- body: parameters,
51
+ body: parameters.toString(),
52
52
  });
53
53
  return camelcaseKeys__default.default(snakeCaseRefreshTokenTokenResponse);
54
54
  };
@@ -14,7 +14,7 @@ const fetchTokenByAuthorizationCode = async ({ clientId, tokenEndpoint, redirect
14
14
  const snakeCaseCodeTokenResponse = await requester(tokenEndpoint, {
15
15
  method: 'POST',
16
16
  headers: ContentType.formUrlEncoded,
17
- body: parameters,
17
+ body: parameters.toString(),
18
18
  });
19
19
  return camelcaseKeys(snakeCaseCodeTokenResponse);
20
20
  };
@@ -42,7 +42,7 @@ const fetchTokenByRefreshToken = async (params, requester) => {
42
42
  const snakeCaseRefreshTokenTokenResponse = await requester(tokenEndpoint, {
43
43
  method: 'POST',
44
44
  headers: ContentType.formUrlEncoded,
45
- body: parameters,
45
+ body: parameters.toString(),
46
46
  });
47
47
  return camelcaseKeys(snakeCaseRefreshTokenTokenResponse);
48
48
  };
@@ -1,8 +1,6 @@
1
1
  'use strict';
2
2
 
3
3
  var index = require('../consts/index.cjs');
4
- require('@silverhand/essentials');
5
- require('jose');
6
4
  var scopes = require('../utils/scopes.cjs');
7
5
 
8
6
  const codeChallengeMethod = 'S256';
@@ -1,6 +1,4 @@
1
1
  import { QueryKey, Prompt } from '../consts/index.js';
2
- import '@silverhand/essentials';
3
- import 'jose';
4
2
  import { withDefaultScopes } from '../utils/scopes.js';
5
3
 
6
4
  const codeChallengeMethod = 'S256';
package/lib/index.cjs CHANGED
@@ -32,32 +32,31 @@ exports.LogtoRequestError = errors.LogtoRequestError;
32
32
  exports.OidcError = errors.OidcError;
33
33
  exports.isLogtoRequestError = errors.isLogtoRequestError;
34
34
  exports.decodeIdToken = idToken.decodeIdToken;
35
- exports.verifyIdToken = idToken.verifyIdToken;
36
35
  exports.decodeAccessToken = accessToken.decodeAccessToken;
37
36
  exports.withDefaultScopes = scopes.withDefaultScopes;
38
37
  exports.isArbitraryObject = arbitraryObject.isArbitraryObject;
39
38
  exports.ContentType = index.ContentType;
40
- Object.defineProperty(exports, 'Prompt', {
39
+ Object.defineProperty(exports, "Prompt", {
41
40
  enumerable: true,
42
41
  get: function () { return index.Prompt; }
43
42
  });
44
- Object.defineProperty(exports, 'QueryKey', {
43
+ Object.defineProperty(exports, "QueryKey", {
45
44
  enumerable: true,
46
45
  get: function () { return index.QueryKey; }
47
46
  });
48
- Object.defineProperty(exports, 'TokenGrantType', {
47
+ Object.defineProperty(exports, "TokenGrantType", {
49
48
  enumerable: true,
50
49
  get: function () { return index.TokenGrantType; }
51
50
  });
52
- Object.defineProperty(exports, 'ReservedResource', {
51
+ Object.defineProperty(exports, "ReservedResource", {
53
52
  enumerable: true,
54
53
  get: function () { return openid.ReservedResource; }
55
54
  });
56
- Object.defineProperty(exports, 'ReservedScope', {
55
+ Object.defineProperty(exports, "ReservedScope", {
57
56
  enumerable: true,
58
57
  get: function () { return openid.ReservedScope; }
59
58
  });
60
- Object.defineProperty(exports, 'UserScope', {
59
+ Object.defineProperty(exports, "UserScope", {
61
60
  enumerable: true,
62
61
  get: function () { return openid.UserScope; }
63
62
  });
package/lib/index.js CHANGED
@@ -6,7 +6,7 @@ export { generateSignOutUri } from './core/sign-out.js';
6
6
  export { fetchUserInfo } from './core/user-info.js';
7
7
  export { parseUriParameters, verifyAndParseCodeFromCallbackUri } from './utils/callback-uri.js';
8
8
  export { LogtoError, LogtoRequestError, OidcError, isLogtoRequestError } from './utils/errors.js';
9
- export { decodeIdToken, verifyIdToken } from './utils/id-token.js';
9
+ export { decodeIdToken } from './utils/id-token.js';
10
10
  export { decodeAccessToken } from './utils/access-token.js';
11
11
  export { withDefaultScopes } from './utils/scopes.js';
12
12
  export { isArbitraryObject } from './utils/arbitrary-object.js';
@@ -1,11 +1,9 @@
1
1
  'use strict';
2
2
 
3
3
  var essentials = require('@silverhand/essentials');
4
- var jose = require('jose');
5
4
  var arbitraryObject = require('./arbitrary-object.cjs');
6
5
  var errors = require('./errors.cjs');
7
6
 
8
- const issuedAtTimeTolerance = 300; // 5 minutes
9
7
  /* eslint-disable complexity */
10
8
  /**
11
9
  * @link [ID Token](https://openid.net/specs/openid-connect-core-1_0.html#IDToken)
@@ -42,12 +40,6 @@ function assertIdTokenClaims(data) {
42
40
  }
43
41
  }
44
42
  /* eslint-enable complexity */
45
- const verifyIdToken = async (idToken, clientId, issuer, jwks) => {
46
- const result = await jose.jwtVerify(idToken, jwks, { audience: clientId, issuer });
47
- if (Math.abs((result.payload.iat ?? 0) - Date.now() / 1000) > issuedAtTimeTolerance) {
48
- throw new errors.LogtoError('id_token.invalid_iat');
49
- }
50
- };
51
43
  const decodeIdToken = (token) => {
52
44
  const { 1: encodedPayload } = token.split('.');
53
45
  if (!encodedPayload) {
@@ -60,4 +52,3 @@ const decodeIdToken = (token) => {
60
52
  };
61
53
 
62
54
  exports.decodeIdToken = decodeIdToken;
63
- exports.verifyIdToken = verifyIdToken;
@@ -1,5 +1,4 @@
1
1
  import type { Nullable } from '@silverhand/essentials';
2
- import type { JWTVerifyGetKey } from 'jose';
3
2
  export type IdTokenClaims = {
4
3
  /** Issuer of this token. */
5
4
  iss: string;
@@ -42,5 +41,4 @@ export type IdTokenClaims = {
42
41
  /** Roles that the user has for API resources. */
43
42
  roles?: string[];
44
43
  } & Record<string, unknown>;
45
- export declare const verifyIdToken: (idToken: string, clientId: string, issuer: string, jwks: JWTVerifyGetKey) => Promise<void>;
46
44
  export declare const decodeIdToken: (token: string) => IdTokenClaims;
@@ -1,9 +1,7 @@
1
1
  import { urlSafeBase64 } from '@silverhand/essentials';
2
- import { jwtVerify } from 'jose';
3
2
  import { isArbitraryObject } from './arbitrary-object.js';
4
3
  import { LogtoError } from './errors.js';
5
4
 
6
- const issuedAtTimeTolerance = 300; // 5 minutes
7
5
  /* eslint-disable complexity */
8
6
  /**
9
7
  * @link [ID Token](https://openid.net/specs/openid-connect-core-1_0.html#IDToken)
@@ -40,12 +38,6 @@ function assertIdTokenClaims(data) {
40
38
  }
41
39
  }
42
40
  /* eslint-enable complexity */
43
- const verifyIdToken = async (idToken, clientId, issuer, jwks) => {
44
- const result = await jwtVerify(idToken, jwks, { audience: clientId, issuer });
45
- if (Math.abs((result.payload.iat ?? 0) - Date.now() / 1000) > issuedAtTimeTolerance) {
46
- throw new LogtoError('id_token.invalid_iat');
47
- }
48
- };
49
41
  const decodeIdToken = (token) => {
50
42
  const { 1: encodedPayload } = token.split('.');
51
43
  if (!encodedPayload) {
@@ -57,4 +49,4 @@ const decodeIdToken = (token) => {
57
49
  return idTokenClaims;
58
50
  };
59
51
 
60
- export { decodeIdToken, verifyIdToken };
52
+ export { decodeIdToken };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@logto/js",
3
- "version": "3.0.1",
3
+ "version": "4.0.0-alpha.0",
4
4
  "type": "module",
5
5
  "main": "./lib/index.cjs",
6
6
  "module": "./lib/index.js",
@@ -20,25 +20,25 @@
20
20
  "directory": "packages/js"
21
21
  },
22
22
  "dependencies": {
23
- "@silverhand/essentials": "^2.6.2",
24
- "camelcase-keys": "^7.0.1",
25
- "jose": "^5.0.0"
23
+ "@silverhand/essentials": "^2.8.7",
24
+ "camelcase-keys": "^7.0.1"
26
25
  },
27
26
  "devDependencies": {
28
- "@silverhand/eslint-config": "^4.0.1",
29
- "@silverhand/ts-config": "^4.0.0",
27
+ "@silverhand/eslint-config": "^5.0.0",
28
+ "@silverhand/ts-config": "^5.0.0",
30
29
  "@swc/core": "^1.3.50",
31
30
  "@swc/jest": "^0.2.24",
32
31
  "@types/jest": "^29.5.1",
33
- "@types/node": "^18.0.0",
32
+ "@types/node": "^20.0.0",
34
33
  "eslint": "^8.44.0",
35
34
  "jest": "^29.5.0",
36
35
  "jest-environment-jsdom": "^29.5.0",
37
36
  "jest-matcher-specific-error": "^1.0.0",
37
+ "jose": "^5.0.0",
38
38
  "lint-staged": "^15.0.0",
39
39
  "nock": "^13.3.0",
40
40
  "prettier": "^3.0.0",
41
- "rollup": "^3.20.2",
41
+ "rollup": "^4.0.0",
42
42
  "text-encoder": "^0.0.4",
43
43
  "type-fest": "^4.0.0",
44
44
  "typescript": "^5.0.0"