antarctic 0.4.0 → 0.6.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.
Files changed (131) hide show
  1. package/dist/auth.d.ts +20 -0
  2. package/dist/auth.js +20 -0
  3. package/dist/index.d.ts +1 -1
  4. package/dist/providers/42.d.ts +3 -3
  5. package/dist/providers/42.js +9 -6
  6. package/dist/providers/amazon-cognito.d.ts +3 -3
  7. package/dist/providers/amazon-cognito.js +9 -6
  8. package/dist/providers/anilist.d.ts +3 -3
  9. package/dist/providers/anilist.js +9 -6
  10. package/dist/providers/apple.d.ts +3 -3
  11. package/dist/providers/apple.js +9 -6
  12. package/dist/providers/atlassian.d.ts +3 -3
  13. package/dist/providers/atlassian.js +9 -6
  14. package/dist/providers/auth0.d.ts +3 -3
  15. package/dist/providers/auth0.js +9 -6
  16. package/dist/providers/authentik.d.ts +3 -3
  17. package/dist/providers/authentik.js +9 -6
  18. package/dist/providers/autodesk.d.ts +3 -3
  19. package/dist/providers/autodesk.js +9 -6
  20. package/dist/providers/battlenet.d.ts +3 -3
  21. package/dist/providers/battlenet.js +9 -6
  22. package/dist/providers/bitbucket.d.ts +3 -3
  23. package/dist/providers/bitbucket.js +9 -6
  24. package/dist/providers/box.d.ts +3 -3
  25. package/dist/providers/box.js +9 -6
  26. package/dist/providers/bungie.d.ts +3 -3
  27. package/dist/providers/bungie.js +9 -6
  28. package/dist/providers/coinbase.d.ts +3 -3
  29. package/dist/providers/coinbase.js +9 -6
  30. package/dist/providers/discord.d.ts +3 -3
  31. package/dist/providers/discord.js +9 -6
  32. package/dist/providers/donation-alerts.d.ts +3 -3
  33. package/dist/providers/donation-alerts.js +9 -6
  34. package/dist/providers/dribbble.d.ts +3 -3
  35. package/dist/providers/dribbble.js +9 -6
  36. package/dist/providers/dropbox.d.ts +3 -3
  37. package/dist/providers/dropbox.js +9 -6
  38. package/dist/providers/epicgames.d.ts +3 -3
  39. package/dist/providers/epicgames.js +9 -6
  40. package/dist/providers/etsy.d.ts +3 -3
  41. package/dist/providers/etsy.js +9 -6
  42. package/dist/providers/facebook.d.ts +3 -3
  43. package/dist/providers/facebook.js +9 -6
  44. package/dist/providers/figma.d.ts +3 -3
  45. package/dist/providers/figma.js +9 -6
  46. package/dist/providers/gitea.d.ts +3 -3
  47. package/dist/providers/gitea.js +9 -6
  48. package/dist/providers/github.d.ts +3 -3
  49. package/dist/providers/github.js +9 -6
  50. package/dist/providers/gitlab.d.ts +3 -3
  51. package/dist/providers/gitlab.js +9 -6
  52. package/dist/providers/google.d.ts +3 -3
  53. package/dist/providers/google.js +9 -6
  54. package/dist/providers/intuit.d.ts +3 -3
  55. package/dist/providers/intuit.js +9 -6
  56. package/dist/providers/kakao.d.ts +3 -3
  57. package/dist/providers/kakao.js +9 -6
  58. package/dist/providers/keycloak.d.ts +3 -3
  59. package/dist/providers/keycloak.js +9 -6
  60. package/dist/providers/kick.d.ts +3 -3
  61. package/dist/providers/kick.js +9 -6
  62. package/dist/providers/lichess.d.ts +3 -3
  63. package/dist/providers/lichess.js +9 -6
  64. package/dist/providers/line.d.ts +3 -3
  65. package/dist/providers/line.js +9 -6
  66. package/dist/providers/linear.d.ts +3 -3
  67. package/dist/providers/linear.js +9 -6
  68. package/dist/providers/linkedin.d.ts +3 -3
  69. package/dist/providers/linkedin.js +9 -6
  70. package/dist/providers/mastodon.d.ts +3 -3
  71. package/dist/providers/mastodon.js +9 -6
  72. package/dist/providers/mercadolibre.d.ts +3 -3
  73. package/dist/providers/mercadolibre.js +9 -6
  74. package/dist/providers/mercadopago.d.ts +3 -3
  75. package/dist/providers/mercadopago.js +9 -6
  76. package/dist/providers/microsoft-entra-id.d.ts +3 -3
  77. package/dist/providers/microsoft-entra-id.js +9 -6
  78. package/dist/providers/myanimelist.d.ts +3 -3
  79. package/dist/providers/myanimelist.js +9 -6
  80. package/dist/providers/naver.d.ts +3 -3
  81. package/dist/providers/naver.js +9 -6
  82. package/dist/providers/notion.d.ts +3 -3
  83. package/dist/providers/notion.js +9 -6
  84. package/dist/providers/okta.d.ts +3 -3
  85. package/dist/providers/okta.js +9 -6
  86. package/dist/providers/osu.d.ts +3 -3
  87. package/dist/providers/osu.js +9 -6
  88. package/dist/providers/patreon.d.ts +3 -3
  89. package/dist/providers/patreon.js +9 -6
  90. package/dist/providers/polar.d.ts +3 -3
  91. package/dist/providers/polar.js +9 -6
  92. package/dist/providers/reddit.d.ts +3 -3
  93. package/dist/providers/reddit.js +9 -6
  94. package/dist/providers/roblox.d.ts +3 -3
  95. package/dist/providers/roblox.js +9 -6
  96. package/dist/providers/salesforce.d.ts +3 -3
  97. package/dist/providers/salesforce.js +9 -6
  98. package/dist/providers/shikimori.d.ts +3 -3
  99. package/dist/providers/shikimori.js +9 -6
  100. package/dist/providers/slack.d.ts +3 -3
  101. package/dist/providers/slack.js +9 -6
  102. package/dist/providers/spotify.d.ts +3 -3
  103. package/dist/providers/spotify.js +9 -6
  104. package/dist/providers/startgg.d.ts +3 -3
  105. package/dist/providers/startgg.js +9 -6
  106. package/dist/providers/strava.d.ts +3 -3
  107. package/dist/providers/strava.js +9 -6
  108. package/dist/providers/tiktok.d.ts +3 -3
  109. package/dist/providers/tiktok.js +9 -6
  110. package/dist/providers/tiltify.d.ts +3 -3
  111. package/dist/providers/tiltify.js +9 -6
  112. package/dist/providers/tumblr.d.ts +3 -3
  113. package/dist/providers/tumblr.js +9 -6
  114. package/dist/providers/twitch.d.ts +3 -3
  115. package/dist/providers/twitch.js +9 -6
  116. package/dist/providers/twitter.d.ts +3 -3
  117. package/dist/providers/twitter.js +9 -6
  118. package/dist/providers/vk.d.ts +3 -3
  119. package/dist/providers/vk.js +9 -6
  120. package/dist/providers/withings.d.ts +3 -3
  121. package/dist/providers/withings.js +9 -6
  122. package/dist/providers/workos.d.ts +3 -3
  123. package/dist/providers/workos.js +9 -6
  124. package/dist/providers/yahoo.d.ts +3 -3
  125. package/dist/providers/yahoo.js +9 -6
  126. package/dist/providers/yandex.d.ts +3 -3
  127. package/dist/providers/yandex.js +9 -6
  128. package/dist/providers/zoom.d.ts +3 -3
  129. package/dist/providers/zoom.js +9 -6
  130. package/package.json +1 -1
  131. package/readme.md +12 -2
package/dist/auth.d.ts CHANGED
@@ -1,8 +1,13 @@
1
+ import type { OAuth2Tokens } from "./oauth2.js";
1
2
  export interface OAuthUser {
2
3
  id: string;
3
4
  name?: string | null;
4
5
  email?: string | null;
5
6
  image?: string | null;
7
+ raw?: Record<string, unknown>;
8
+ accessToken?: string;
9
+ refreshToken?: string | null;
10
+ scopes?: string[] | null;
6
11
  }
7
12
  export interface OAuthStateStore {
8
13
  get: (key: string) => Promise<any>;
@@ -51,6 +56,21 @@ export interface StoredOAuthState {
51
56
  }
52
57
  export declare function saveOAuthState(store: OAuthStateStore, state: string, payload: StoredOAuthState): Promise<void>;
53
58
  export declare function consumeOAuthState(store: OAuthStateStore, state: string): Promise<StoredOAuthState>;
59
+ export interface AuthorizationRequest {
60
+ url: URL;
61
+ state: string;
62
+ payload: StoredOAuthState;
63
+ }
64
+ export interface SavedOAuthState {
65
+ state: string;
66
+ payload?: StoredOAuthState;
67
+ }
68
+ export declare function resolveOAuthState(store: OAuthStateStore, state: string, saved?: SavedOAuthState): Promise<StoredOAuthState>;
69
+ export declare function extractOAuthTokens(tokens: OAuth2Tokens): {
70
+ accessToken: string;
71
+ refreshToken: string | null;
72
+ scopes: string[] | null;
73
+ };
54
74
  export type OAuthCallbackQuery = string | URL | URLSearchParams | Record<string, string | string[] | undefined | null>;
55
75
  export declare function parseCallbackQuery(query: OAuthCallbackQuery): {
56
76
  code: string;
package/dist/auth.js CHANGED
@@ -91,6 +91,26 @@ export async function consumeOAuthState(store, state) {
91
91
  await store.del(key);
92
92
  return payload;
93
93
  }
94
+ // With `saved` the caller kept the state itself, so comparing it against the
95
+ // value the provider echoed back is the CSRF check. Otherwise the store is.
96
+ export async function resolveOAuthState(store, state, saved) {
97
+ if (saved !== undefined) {
98
+ if (saved.state !== state) {
99
+ throw new InvalidOAuthStateError();
100
+ }
101
+ return saved.payload ?? {};
102
+ }
103
+ return await consumeOAuthState(store, state);
104
+ }
105
+ // OAuth2Tokens throws on absent fields, and most providers omit the refresh
106
+ // token and scopes unless they were asked for.
107
+ export function extractOAuthTokens(tokens) {
108
+ return {
109
+ accessToken: tokens.accessToken(),
110
+ refreshToken: tokens.hasRefreshToken() ? tokens.refreshToken() : null,
111
+ scopes: tokens.hasScopes() ? tokens.scopes() : null
112
+ };
113
+ }
94
114
  export function parseCallbackQuery(query) {
95
115
  let params;
96
116
  if (typeof query === "string") {
package/dist/index.d.ts CHANGED
@@ -67,4 +67,4 @@ export { OAuth2Tokens, generateCodeVerifier, generateState } from "./oauth2.js";
67
67
  export { OAuth2RequestError, ArcticFetchError, UnexpectedErrorResponseBodyError, UnexpectedResponseError } from "./request.js";
68
68
  export { decodeIdToken } from "./oidc.js";
69
69
  export { InvalidOAuthCallbackError, InvalidOAuthStateError, OAuthConfigurationError, OAuthProviderError } from "./auth.js";
70
- export type { OAuthCallbackQuery, OAuthStateStore, OAuthUser, ProviderOptions } from "./auth.js";
70
+ export type { AuthorizationRequest, OAuthCallbackQuery, OAuthStateStore, OAuthUser, ProviderOptions, SavedOAuthState, StoredOAuthState } from "./auth.js";
@@ -1,5 +1,5 @@
1
1
  import type { OAuth2Tokens } from "../oauth2.js";
2
- import type { OAuthCallbackQuery, OAuthUser, ProviderOptions } from "../auth.js";
2
+ import type { AuthorizationRequest, OAuthCallbackQuery, OAuthUser, ProviderOptions, SavedOAuthState } from "../auth.js";
3
3
  export interface FortyTwoOptions extends ProviderOptions {
4
4
  }
5
5
  export declare class FortyTwo {
@@ -11,6 +11,6 @@ export declare class FortyTwo {
11
11
  constructor(clientId: string, clientSecret: string, redirectURI: string);
12
12
  createAuthorizationURL(state: string, scopes: string[]): URL;
13
13
  validateAuthorizationCode(code: string): Promise<OAuth2Tokens>;
14
- getAuthorizationURL(scopes?: string[]): Promise<URL>;
15
- getUser(query: OAuthCallbackQuery): Promise<OAuthUser>;
14
+ getAuthorizationURL(scopes?: string[]): Promise<AuthorizationRequest>;
15
+ getUser(query: OAuthCallbackQuery, saved?: SavedOAuthState): Promise<OAuthUser>;
16
16
  }
@@ -1,5 +1,5 @@
1
1
  import { createOAuth2Request, sendTokenRequest } from "../request.js";
2
- import { consumeOAuthState, fetchUserProfile, generateOAuthState, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveScopes, saveOAuthState } from "../auth.js";
2
+ import { extractOAuthTokens, fetchUserProfile, generateOAuthState, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveOAuthState, resolveScopes, saveOAuthState } from "../auth.js";
3
3
  const authorizationEndpoint = "https://api.intra.42.fr/oauth/authorize";
4
4
  const tokenEndpoint = "https://api.intra.42.fr/oauth/token";
5
5
  const userEndpoint = "https://api.intra.42.fr/v2/me";
@@ -52,13 +52,14 @@ export class FortyTwo {
52
52
  const auth = requireAuthConfig(this.auth);
53
53
  const state = generateOAuthState();
54
54
  const url = this.createAuthorizationURL(state, resolveScopes(scopes, auth, defaultScopes));
55
- await saveOAuthState(auth.store, state, {});
56
- return url;
55
+ const payload = {};
56
+ await saveOAuthState(auth.store, state, payload);
57
+ return { url, state, payload };
57
58
  }
58
- async getUser(query) {
59
+ async getUser(query, saved) {
59
60
  const auth = requireAuthConfig(this.auth);
60
61
  const { code, state } = parseCallbackQuery(query);
61
- await consumeOAuthState(auth.store, state);
62
+ await resolveOAuthState(auth.store, state, saved);
62
63
  const tokens = await this.validateAuthorizationCode(code);
63
64
  const profile = await fetchUserProfile(userEndpoint, tokens.accessToken());
64
65
  let image = null;
@@ -69,7 +70,9 @@ export class FortyTwo {
69
70
  id: profileId(profile.id),
70
71
  name: profileString(profile.displayname) ?? profileString(profile.login),
71
72
  email: profileString(profile.email),
72
- image
73
+ image,
74
+ raw: profile,
75
+ ...extractOAuthTokens(tokens)
73
76
  };
74
77
  }
75
78
  }
@@ -1,5 +1,5 @@
1
1
  import type { OAuth2Tokens } from "../oauth2.js";
2
- import type { OAuthCallbackQuery, OAuthUser, ProviderOptions } from "../auth.js";
2
+ import type { AuthorizationRequest, OAuthCallbackQuery, OAuthUser, ProviderOptions, SavedOAuthState } from "../auth.js";
3
3
  export interface AmazonCognitoOptions extends ProviderOptions {
4
4
  domain?: string;
5
5
  }
@@ -16,6 +16,6 @@ export declare class AmazonCognito {
16
16
  validateAuthorizationCode(code: string, codeVerifier: string): Promise<OAuth2Tokens>;
17
17
  refreshAccessToken(refreshToken: string, scopes: string[]): Promise<OAuth2Tokens>;
18
18
  revokeToken(token: string): Promise<void>;
19
- getAuthorizationURL(scopes?: string[]): Promise<URL>;
20
- getUser(query: OAuthCallbackQuery): Promise<OAuthUser>;
19
+ getAuthorizationURL(scopes?: string[]): Promise<AuthorizationRequest>;
20
+ getUser(query: OAuthCallbackQuery, saved?: SavedOAuthState): Promise<OAuthUser>;
21
21
  }
@@ -1,6 +1,6 @@
1
1
  import { CodeChallengeMethod, OAuth2Client } from "../client.js";
2
2
  import { decodeIdToken } from "../oidc.js";
3
- import { consumeOAuthState, fetchUserProfile, generateOAuthCodeVerifier, generateOAuthState, InvalidOAuthCallbackError, parseCallbackQuery, profileId, profileString, requireAuthConfig, requireProviderOption, resolveAuthConfig, resolveScopes, saveOAuthState } from "../auth.js";
3
+ import { extractOAuthTokens, fetchUserProfile, generateOAuthCodeVerifier, generateOAuthState, InvalidOAuthCallbackError, parseCallbackQuery, profileId, profileString, requireAuthConfig, requireProviderOption, resolveAuthConfig, resolveOAuthState, resolveScopes, saveOAuthState } from "../auth.js";
4
4
  const envPrefix = "AMAZON_COGNITO";
5
5
  const defaultScopes = ["openid", "profile", "email"];
6
6
  export class AmazonCognito {
@@ -46,13 +46,14 @@ export class AmazonCognito {
46
46
  const state = generateOAuthState();
47
47
  const codeVerifier = generateOAuthCodeVerifier();
48
48
  const url = await this.createAuthorizationURL(state, codeVerifier, resolveScopes(scopes, auth, defaultScopes));
49
- await saveOAuthState(auth.store, state, { codeVerifier });
50
- return url;
49
+ const payload = { codeVerifier };
50
+ await saveOAuthState(auth.store, state, payload);
51
+ return { url, state, payload };
51
52
  }
52
- async getUser(query) {
53
+ async getUser(query, saved) {
53
54
  const auth = requireAuthConfig(this.auth);
54
55
  const { code, state } = parseCallbackQuery(query);
55
- const stored = await consumeOAuthState(auth.store, state);
56
+ const stored = await resolveOAuthState(auth.store, state, saved);
56
57
  if (typeof stored.codeVerifier !== "string") {
57
58
  throw new InvalidOAuthCallbackError("Missing PKCE code verifier for OAuth state");
58
59
  }
@@ -70,7 +71,9 @@ export class AmazonCognito {
70
71
  profileString(claims["cognito:username"]) ??
71
72
  profileString(claims.username),
72
73
  email: profileString(claims.email),
73
- image: profileString(claims.picture)
74
+ image: profileString(claims.picture),
75
+ raw: claims,
76
+ ...extractOAuthTokens(tokens)
74
77
  };
75
78
  }
76
79
  }
@@ -1,5 +1,5 @@
1
1
  import type { OAuth2Tokens } from "../oauth2.js";
2
- import type { OAuthCallbackQuery, OAuthUser, ProviderOptions } from "../auth.js";
2
+ import type { AuthorizationRequest, OAuthCallbackQuery, OAuthUser, ProviderOptions, SavedOAuthState } from "../auth.js";
3
3
  export interface AniListOptions extends ProviderOptions {
4
4
  }
5
5
  export declare class AniList {
@@ -9,6 +9,6 @@ export declare class AniList {
9
9
  constructor(clientId: string, clientSecret: string, redirectURI: string);
10
10
  createAuthorizationURL(state: string): URL;
11
11
  validateAuthorizationCode(code: string): Promise<OAuth2Tokens>;
12
- getAuthorizationURL(): Promise<URL>;
13
- getUser(query: OAuthCallbackQuery): Promise<OAuthUser>;
12
+ getAuthorizationURL(): Promise<AuthorizationRequest>;
13
+ getUser(query: OAuthCallbackQuery, saved?: SavedOAuthState): Promise<OAuthUser>;
14
14
  }
@@ -1,5 +1,5 @@
1
1
  import { OAuth2Client } from "../client.js";
2
- import { consumeOAuthState, generateOAuthState, OAuthProviderError, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, saveOAuthState } from "../auth.js";
2
+ import { extractOAuthTokens, generateOAuthState, OAuthProviderError, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveOAuthState, saveOAuthState } from "../auth.js";
3
3
  const authorizationEndpoint = "https://anilist.co/api/v2/oauth/authorize";
4
4
  const tokenEndpoint = "https://anilist.co/api/v2/oauth/token";
5
5
  const graphqlEndpoint = "https://graphql.anilist.co";
@@ -31,13 +31,14 @@ export class AniList {
31
31
  const auth = requireAuthConfig(this.auth);
32
32
  const state = generateOAuthState();
33
33
  const url = this.createAuthorizationURL(state);
34
- await saveOAuthState(auth.store, state, {});
35
- return url;
34
+ const payload = {};
35
+ await saveOAuthState(auth.store, state, payload);
36
+ return { url, state, payload };
36
37
  }
37
- async getUser(query) {
38
+ async getUser(query, saved) {
38
39
  const auth = requireAuthConfig(this.auth);
39
40
  const { code, state } = parseCallbackQuery(query);
40
- await consumeOAuthState(auth.store, state);
41
+ await resolveOAuthState(auth.store, state, saved);
41
42
  const tokens = await this.validateAuthorizationCode(code);
42
43
  const viewer = await fetchViewer(tokens.accessToken());
43
44
  let image = null;
@@ -48,7 +49,9 @@ export class AniList {
48
49
  id: profileId(viewer.id),
49
50
  name: profileString(viewer.name),
50
51
  email: null,
51
- image
52
+ image,
53
+ raw: viewer,
54
+ ...extractOAuthTokens(tokens)
52
55
  };
53
56
  }
54
57
  }
@@ -1,5 +1,5 @@
1
1
  import type { OAuth2Tokens } from "../oauth2.js";
2
- import type { OAuthCallbackQuery, OAuthUser, ProviderOptions } from "../auth.js";
2
+ import type { AuthorizationRequest, OAuthCallbackQuery, OAuthUser, ProviderOptions, SavedOAuthState } from "../auth.js";
3
3
  export interface AppleOptions extends ProviderOptions {
4
4
  teamId?: string;
5
5
  keyId?: string;
@@ -16,7 +16,7 @@ export declare class Apple {
16
16
  constructor(clientId: string, teamId: string, keyId: string, pkcs8PrivateKey: Uint8Array, redirectURI: string);
17
17
  createAuthorizationURL(state: string, scopes: string[]): URL;
18
18
  validateAuthorizationCode(code: string): Promise<OAuth2Tokens>;
19
- getAuthorizationURL(scopes?: string[]): Promise<URL>;
20
- getUser(query: OAuthCallbackQuery): Promise<OAuthUser>;
19
+ getAuthorizationURL(scopes?: string[]): Promise<AuthorizationRequest>;
20
+ getUser(query: OAuthCallbackQuery, saved?: SavedOAuthState): Promise<OAuthUser>;
21
21
  private createClientSecret;
22
22
  }
@@ -1,7 +1,7 @@
1
1
  import { createJWTSignatureMessage, encodeJWT } from "../jwt.js";
2
2
  import { createOAuth2Request, sendTokenRequest } from "../request.js";
3
3
  import { decodeIdToken } from "../oidc.js";
4
- import { consumeOAuthState, generateOAuthState, parseCallbackQuery, profileId, profileString, requireAuthConfig, requireProviderOption, resolveAuthConfig, resolveScopes, saveOAuthState } from "../auth.js";
4
+ import { extractOAuthTokens, generateOAuthState, parseCallbackQuery, profileId, profileString, requireAuthConfig, requireProviderOption, resolveAuthConfig, resolveOAuthState, resolveScopes, saveOAuthState } from "../auth.js";
5
5
  const authorizationEndpoint = "https://appleid.apple.com/auth/authorize";
6
6
  const tokenEndpoint = "https://appleid.apple.com/auth/token";
7
7
  const envPrefix = "APPLE";
@@ -62,20 +62,23 @@ export class Apple {
62
62
  if (resolvedScopes.length > 0) {
63
63
  url.searchParams.set("response_mode", "form_post");
64
64
  }
65
- await saveOAuthState(auth.store, state, {});
66
- return url;
65
+ const payload = {};
66
+ await saveOAuthState(auth.store, state, payload);
67
+ return { url, state, payload };
67
68
  }
68
- async getUser(query) {
69
+ async getUser(query, saved) {
69
70
  const auth = requireAuthConfig(this.auth);
70
71
  const { code, state } = parseCallbackQuery(query);
71
- await consumeOAuthState(auth.store, state);
72
+ await resolveOAuthState(auth.store, state, saved);
72
73
  const tokens = await this.validateAuthorizationCode(code);
73
74
  const claims = decodeIdToken(tokens.idToken());
74
75
  return {
75
76
  id: profileId(claims.sub),
76
77
  name: null,
77
78
  email: profileString(claims.email),
78
- image: null
79
+ image: null,
80
+ raw: claims,
81
+ ...extractOAuthTokens(tokens)
79
82
  };
80
83
  }
81
84
  async createClientSecret() {
@@ -1,5 +1,5 @@
1
1
  import type { OAuth2Tokens } from "../oauth2.js";
2
- import type { OAuthCallbackQuery, OAuthUser, ProviderOptions } from "../auth.js";
2
+ import type { AuthorizationRequest, OAuthCallbackQuery, OAuthUser, ProviderOptions, SavedOAuthState } from "../auth.js";
3
3
  export interface AtlassianOptions extends ProviderOptions {
4
4
  }
5
5
  export declare class Atlassian {
@@ -12,6 +12,6 @@ export declare class Atlassian {
12
12
  createAuthorizationURL(state: string, scopes: string[]): URL;
13
13
  validateAuthorizationCode(code: string): Promise<OAuth2Tokens>;
14
14
  refreshAccessToken(refreshToken: string): Promise<OAuth2Tokens>;
15
- getAuthorizationURL(scopes?: string[]): Promise<URL>;
16
- getUser(query: OAuthCallbackQuery): Promise<OAuthUser>;
15
+ getAuthorizationURL(scopes?: string[]): Promise<AuthorizationRequest>;
16
+ getUser(query: OAuthCallbackQuery, saved?: SavedOAuthState): Promise<OAuthUser>;
17
17
  }
@@ -1,5 +1,5 @@
1
1
  import { createOAuth2Request, sendTokenRequest } from "../request.js";
2
- import { consumeOAuthState, fetchUserProfile, generateOAuthState, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveScopes, saveOAuthState } from "../auth.js";
2
+ import { extractOAuthTokens, fetchUserProfile, generateOAuthState, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveOAuthState, resolveScopes, saveOAuthState } from "../auth.js";
3
3
  const authorizationEndpoint = "https://auth.atlassian.com/authorize";
4
4
  const tokenEndpoint = "https://auth.atlassian.com/oauth/token";
5
5
  const userEndpoint = "https://api.atlassian.com/me";
@@ -64,20 +64,23 @@ export class Atlassian {
64
64
  const auth = requireAuthConfig(this.auth);
65
65
  const state = generateOAuthState();
66
66
  const url = this.createAuthorizationURL(state, resolveScopes(scopes, auth, defaultScopes));
67
- await saveOAuthState(auth.store, state, {});
68
- return url;
67
+ const payload = {};
68
+ await saveOAuthState(auth.store, state, payload);
69
+ return { url, state, payload };
69
70
  }
70
- async getUser(query) {
71
+ async getUser(query, saved) {
71
72
  const auth = requireAuthConfig(this.auth);
72
73
  const { code, state } = parseCallbackQuery(query);
73
- await consumeOAuthState(auth.store, state);
74
+ await resolveOAuthState(auth.store, state, saved);
74
75
  const tokens = await this.validateAuthorizationCode(code);
75
76
  const profile = await fetchUserProfile(userEndpoint, tokens.accessToken());
76
77
  return {
77
78
  id: profileId(profile.account_id),
78
79
  name: profileString(profile.name) ?? profileString(profile.nickname),
79
80
  email: profileString(profile.email),
80
- image: profileString(profile.picture)
81
+ image: profileString(profile.picture),
82
+ raw: profile,
83
+ ...extractOAuthTokens(tokens)
81
84
  };
82
85
  }
83
86
  }
@@ -1,5 +1,5 @@
1
1
  import type { OAuth2Tokens } from "../oauth2.js";
2
- import type { OAuthCallbackQuery, OAuthUser, ProviderOptions } from "../auth.js";
2
+ import type { AuthorizationRequest, OAuthCallbackQuery, OAuthUser, ProviderOptions, SavedOAuthState } from "../auth.js";
3
3
  export interface Auth0Options extends ProviderOptions {
4
4
  domain?: string;
5
5
  }
@@ -16,6 +16,6 @@ export declare class Auth0 {
16
16
  validateAuthorizationCode(code: string, codeVerifier: string | null): Promise<OAuth2Tokens>;
17
17
  refreshAccessToken(refreshToken: string): Promise<OAuth2Tokens>;
18
18
  revokeToken(token: string): Promise<void>;
19
- getAuthorizationURL(scopes?: string[]): Promise<URL>;
20
- getUser(query: OAuthCallbackQuery): Promise<OAuthUser>;
19
+ getAuthorizationURL(scopes?: string[]): Promise<AuthorizationRequest>;
20
+ getUser(query: OAuthCallbackQuery, saved?: SavedOAuthState): Promise<OAuthUser>;
21
21
  }
@@ -1,6 +1,6 @@
1
1
  import { CodeChallengeMethod, OAuth2Client } from "../client.js";
2
2
  import { decodeIdToken } from "../oidc.js";
3
- import { consumeOAuthState, fetchUserProfile, generateOAuthCodeVerifier, generateOAuthState, InvalidOAuthCallbackError, parseCallbackQuery, profileId, profileString, requireAuthConfig, requireProviderOption, resolveAuthConfig, resolveScopes, saveOAuthState } from "../auth.js";
3
+ import { extractOAuthTokens, fetchUserProfile, generateOAuthCodeVerifier, generateOAuthState, InvalidOAuthCallbackError, parseCallbackQuery, profileId, profileString, requireAuthConfig, requireProviderOption, resolveAuthConfig, resolveOAuthState, resolveScopes, saveOAuthState } from "../auth.js";
4
4
  const envPrefix = "AUTH0";
5
5
  const defaultScopes = ["openid", "profile", "email"];
6
6
  export class Auth0 {
@@ -52,13 +52,14 @@ export class Auth0 {
52
52
  const state = generateOAuthState();
53
53
  const codeVerifier = generateOAuthCodeVerifier();
54
54
  const url = await this.createAuthorizationURL(state, codeVerifier, resolveScopes(scopes, auth, defaultScopes));
55
- await saveOAuthState(auth.store, state, { codeVerifier });
56
- return url;
55
+ const payload = { codeVerifier };
56
+ await saveOAuthState(auth.store, state, payload);
57
+ return { url, state, payload };
57
58
  }
58
- async getUser(query) {
59
+ async getUser(query, saved) {
59
60
  const auth = requireAuthConfig(this.auth);
60
61
  const { code, state } = parseCallbackQuery(query);
61
- const stored = await consumeOAuthState(auth.store, state);
62
+ const stored = await resolveOAuthState(auth.store, state, saved);
62
63
  if (typeof stored.codeVerifier !== "string") {
63
64
  throw new InvalidOAuthCallbackError("Missing PKCE code verifier for OAuth state");
64
65
  }
@@ -74,7 +75,9 @@ export class Auth0 {
74
75
  id: profileId(claims.sub),
75
76
  name: profileString(claims.name) ?? profileString(claims.nickname),
76
77
  email: profileString(claims.email),
77
- image: profileString(claims.picture)
78
+ image: profileString(claims.picture),
79
+ raw: claims,
80
+ ...extractOAuthTokens(tokens)
78
81
  };
79
82
  }
80
83
  }
@@ -1,5 +1,5 @@
1
1
  import type { OAuth2Tokens } from "../oauth2.js";
2
- import type { OAuthCallbackQuery, OAuthUser, ProviderOptions } from "../auth.js";
2
+ import type { AuthorizationRequest, OAuthCallbackQuery, OAuthUser, ProviderOptions, SavedOAuthState } from "../auth.js";
3
3
  export interface AuthentikOptions extends ProviderOptions {
4
4
  baseURL?: string;
5
5
  }
@@ -16,6 +16,6 @@ export declare class Authentik {
16
16
  validateAuthorizationCode(code: string, codeVerifier: string): Promise<OAuth2Tokens>;
17
17
  refreshAccessToken(refreshToken: string): Promise<OAuth2Tokens>;
18
18
  revokeToken(token: string): Promise<void>;
19
- getAuthorizationURL(scopes?: string[]): Promise<URL>;
20
- getUser(query: OAuthCallbackQuery): Promise<OAuthUser>;
19
+ getAuthorizationURL(scopes?: string[]): Promise<AuthorizationRequest>;
20
+ getUser(query: OAuthCallbackQuery, saved?: SavedOAuthState): Promise<OAuthUser>;
21
21
  }
@@ -1,7 +1,7 @@
1
1
  import { CodeChallengeMethod, OAuth2Client } from "../client.js";
2
2
  import { joinURIAndPath } from "../request.js";
3
3
  import { decodeIdToken } from "../oidc.js";
4
- import { consumeOAuthState, fetchUserProfile, generateOAuthCodeVerifier, generateOAuthState, InvalidOAuthCallbackError, parseCallbackQuery, profileId, profileString, requireAuthConfig, requireProviderOption, resolveAuthConfig, resolveScopes, saveOAuthState } from "../auth.js";
4
+ import { extractOAuthTokens, fetchUserProfile, generateOAuthCodeVerifier, generateOAuthState, InvalidOAuthCallbackError, parseCallbackQuery, profileId, profileString, requireAuthConfig, requireProviderOption, resolveAuthConfig, resolveOAuthState, resolveScopes, saveOAuthState } from "../auth.js";
5
5
  const envPrefix = "AUTHENTIK";
6
6
  const defaultScopes = ["openid", "profile", "email"];
7
7
  export class Authentik {
@@ -47,13 +47,14 @@ export class Authentik {
47
47
  const state = generateOAuthState();
48
48
  const codeVerifier = generateOAuthCodeVerifier();
49
49
  const url = await this.createAuthorizationURL(state, codeVerifier, resolveScopes(scopes, auth, defaultScopes));
50
- await saveOAuthState(auth.store, state, { codeVerifier });
51
- return url;
50
+ const payload = { codeVerifier };
51
+ await saveOAuthState(auth.store, state, payload);
52
+ return { url, state, payload };
52
53
  }
53
- async getUser(query) {
54
+ async getUser(query, saved) {
54
55
  const auth = requireAuthConfig(this.auth);
55
56
  const { code, state } = parseCallbackQuery(query);
56
- const stored = await consumeOAuthState(auth.store, state);
57
+ const stored = await resolveOAuthState(auth.store, state, saved);
57
58
  if (typeof stored.codeVerifier !== "string") {
58
59
  throw new InvalidOAuthCallbackError("Missing PKCE code verifier for OAuth state");
59
60
  }
@@ -69,7 +70,9 @@ export class Authentik {
69
70
  id: profileId(claims.sub),
70
71
  name: profileString(claims.name) ?? profileString(claims.preferred_username),
71
72
  email: profileString(claims.email),
72
- image: profileString(claims.picture)
73
+ image: profileString(claims.picture),
74
+ raw: claims,
75
+ ...extractOAuthTokens(tokens)
73
76
  };
74
77
  }
75
78
  }
@@ -1,5 +1,5 @@
1
1
  import type { OAuth2Tokens } from "../oauth2.js";
2
- import type { OAuthCallbackQuery, OAuthUser, ProviderOptions } from "../auth.js";
2
+ import type { AuthorizationRequest, OAuthCallbackQuery, OAuthUser, ProviderOptions, SavedOAuthState } from "../auth.js";
3
3
  export interface AutodeskOptions extends ProviderOptions {
4
4
  }
5
5
  export declare class Autodesk {
@@ -11,6 +11,6 @@ export declare class Autodesk {
11
11
  validateAuthorizationCode(code: string, codeVerifier: string): Promise<OAuth2Tokens>;
12
12
  refreshAccessToken(refreshToken: string): Promise<OAuth2Tokens>;
13
13
  revokeToken(token: string): Promise<void>;
14
- getAuthorizationURL(scopes?: string[]): Promise<URL>;
15
- getUser(query: OAuthCallbackQuery): Promise<OAuthUser>;
14
+ getAuthorizationURL(scopes?: string[]): Promise<AuthorizationRequest>;
15
+ getUser(query: OAuthCallbackQuery, saved?: SavedOAuthState): Promise<OAuthUser>;
16
16
  }
@@ -1,5 +1,5 @@
1
1
  import { CodeChallengeMethod, OAuth2Client } from "../client.js";
2
- import { consumeOAuthState, fetchUserProfile, generateOAuthCodeVerifier, generateOAuthState, InvalidOAuthCallbackError, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveScopes, saveOAuthState } from "../auth.js";
2
+ import { extractOAuthTokens, fetchUserProfile, generateOAuthCodeVerifier, generateOAuthState, InvalidOAuthCallbackError, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveOAuthState, resolveScopes, saveOAuthState } from "../auth.js";
3
3
  const authorizationEndpoint = "https://developer.api.autodesk.com/authentication/v2/authorize";
4
4
  const tokenEndpoint = "https://developer.api.autodesk.com/authentication/v2/token";
5
5
  const tokenRevocationEndpoint = "https://developer.api.autodesk.com/authentication/v2/revoke";
@@ -38,13 +38,14 @@ export class Autodesk {
38
38
  const state = generateOAuthState();
39
39
  const codeVerifier = generateOAuthCodeVerifier();
40
40
  const url = await this.createAuthorizationURL(state, codeVerifier, resolveScopes(scopes, auth, defaultScopes));
41
- await saveOAuthState(auth.store, state, { codeVerifier });
42
- return url;
41
+ const payload = { codeVerifier };
42
+ await saveOAuthState(auth.store, state, payload);
43
+ return { url, state, payload };
43
44
  }
44
- async getUser(query) {
45
+ async getUser(query, saved) {
45
46
  const auth = requireAuthConfig(this.auth);
46
47
  const { code, state } = parseCallbackQuery(query);
47
- const stored = await consumeOAuthState(auth.store, state);
48
+ const stored = await resolveOAuthState(auth.store, state, saved);
48
49
  if (typeof stored.codeVerifier !== "string") {
49
50
  throw new InvalidOAuthCallbackError("Missing PKCE code verifier for OAuth state");
50
51
  }
@@ -54,7 +55,9 @@ export class Autodesk {
54
55
  id: profileId(claims.sub),
55
56
  name: profileString(claims.name) ?? profileString(claims.preferred_username),
56
57
  email: profileString(claims.email),
57
- image: profileString(claims.picture)
58
+ image: profileString(claims.picture),
59
+ raw: claims,
60
+ ...extractOAuthTokens(tokens)
58
61
  };
59
62
  }
60
63
  }
@@ -1,5 +1,5 @@
1
1
  import type { OAuth2Tokens } from "../oauth2.js";
2
- import type { OAuthCallbackQuery, OAuthUser, ProviderOptions } from "../auth.js";
2
+ import type { AuthorizationRequest, OAuthCallbackQuery, OAuthUser, ProviderOptions, SavedOAuthState } from "../auth.js";
3
3
  export interface BattleNetOptions extends ProviderOptions {
4
4
  }
5
5
  export declare class BattleNet {
@@ -11,6 +11,6 @@ export declare class BattleNet {
11
11
  constructor(clientId: string, clientSecret: string, redirectURI: string);
12
12
  createAuthorizationURL(state: string, scopes: string[]): URL;
13
13
  validateAuthorizationCode(code: string): Promise<OAuth2Tokens>;
14
- getAuthorizationURL(scopes?: string[]): Promise<URL>;
15
- getUser(query: OAuthCallbackQuery): Promise<OAuthUser>;
14
+ getAuthorizationURL(scopes?: string[]): Promise<AuthorizationRequest>;
15
+ getUser(query: OAuthCallbackQuery, saved?: SavedOAuthState): Promise<OAuthUser>;
16
16
  }
@@ -1,5 +1,5 @@
1
1
  import { createOAuth2Request, sendTokenRequest } from "../request.js";
2
- import { consumeOAuthState, fetchUserProfile, generateOAuthState, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveScopes, saveOAuthState } from "../auth.js";
2
+ import { extractOAuthTokens, fetchUserProfile, generateOAuthState, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveOAuthState, resolveScopes, saveOAuthState } from "../auth.js";
3
3
  const authorizationEndpoint = "https://oauth.battle.net/authorize";
4
4
  const tokenEndpoint = "https://oauth.battle.net/token";
5
5
  const userinfoEndpoint = "https://oauth.battle.net/userinfo";
@@ -50,20 +50,23 @@ export class BattleNet {
50
50
  const auth = requireAuthConfig(this.auth);
51
51
  const state = generateOAuthState();
52
52
  const url = this.createAuthorizationURL(state, resolveScopes(scopes, auth, defaultScopes));
53
- await saveOAuthState(auth.store, state, {});
54
- return url;
53
+ const payload = {};
54
+ await saveOAuthState(auth.store, state, payload);
55
+ return { url, state, payload };
55
56
  }
56
- async getUser(query) {
57
+ async getUser(query, saved) {
57
58
  const auth = requireAuthConfig(this.auth);
58
59
  const { code, state } = parseCallbackQuery(query);
59
- await consumeOAuthState(auth.store, state);
60
+ await resolveOAuthState(auth.store, state, saved);
60
61
  const tokens = await this.validateAuthorizationCode(code);
61
62
  const profile = await fetchUserProfile(userinfoEndpoint, tokens.accessToken());
62
63
  return {
63
64
  id: profileId(profile.sub),
64
65
  name: profileString(profile.battletag),
65
66
  email: null,
66
- image: null
67
+ image: null,
68
+ raw: profile,
69
+ ...extractOAuthTokens(tokens)
67
70
  };
68
71
  }
69
72
  }
@@ -1,5 +1,5 @@
1
1
  import type { OAuth2Tokens } from "../oauth2.js";
2
- import type { OAuthCallbackQuery, OAuthUser, ProviderOptions } from "../auth.js";
2
+ import type { AuthorizationRequest, OAuthCallbackQuery, OAuthUser, ProviderOptions, SavedOAuthState } from "../auth.js";
3
3
  export interface BitbucketOptions extends ProviderOptions {
4
4
  }
5
5
  export declare class Bitbucket {
@@ -10,6 +10,6 @@ export declare class Bitbucket {
10
10
  createAuthorizationURL(state: string): URL;
11
11
  validateAuthorizationCode(code: string): Promise<OAuth2Tokens>;
12
12
  refreshAccessToken(refreshToken: string): Promise<OAuth2Tokens>;
13
- getAuthorizationURL(): Promise<URL>;
14
- getUser(query: OAuthCallbackQuery): Promise<OAuthUser>;
13
+ getAuthorizationURL(): Promise<AuthorizationRequest>;
14
+ getUser(query: OAuthCallbackQuery, saved?: SavedOAuthState): Promise<OAuthUser>;
15
15
  }
@@ -1,5 +1,5 @@
1
1
  import { OAuth2Client } from "../client.js";
2
- import { consumeOAuthState, fetchUserProfile, generateOAuthState, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, saveOAuthState } from "../auth.js";
2
+ import { extractOAuthTokens, fetchUserProfile, generateOAuthState, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveOAuthState, saveOAuthState } from "../auth.js";
3
3
  const authorizationEndpoint = "https://bitbucket.org/site/oauth2/authorize";
4
4
  const tokenEndpoint = "https://bitbucket.org/site/oauth2/access_token";
5
5
  const userEndpoint = "https://api.bitbucket.org/2.0/user";
@@ -36,13 +36,14 @@ export class Bitbucket {
36
36
  const auth = requireAuthConfig(this.auth);
37
37
  const state = generateOAuthState();
38
38
  const url = this.createAuthorizationURL(state);
39
- await saveOAuthState(auth.store, state, {});
40
- return url;
39
+ const payload = {};
40
+ await saveOAuthState(auth.store, state, payload);
41
+ return { url, state, payload };
41
42
  }
42
- async getUser(query) {
43
+ async getUser(query, saved) {
43
44
  const auth = requireAuthConfig(this.auth);
44
45
  const { code, state } = parseCallbackQuery(query);
45
- await consumeOAuthState(auth.store, state);
46
+ await resolveOAuthState(auth.store, state, saved);
46
47
  const tokens = await this.validateAuthorizationCode(code);
47
48
  const accessToken = tokens.accessToken();
48
49
  const profile = await fetchUserProfile(userEndpoint, accessToken);
@@ -57,7 +58,9 @@ export class Bitbucket {
57
58
  id: profileId(profile.uuid ?? profile.account_id),
58
59
  name: profileString(profile.display_name) ?? profileString(profile.username),
59
60
  email: await fetchPrimaryEmail(accessToken),
60
- image
61
+ image,
62
+ raw: profile,
63
+ ...extractOAuthTokens(tokens)
61
64
  };
62
65
  }
63
66
  }
@@ -1,5 +1,5 @@
1
1
  import type { OAuth2Tokens } from "../oauth2.js";
2
- import type { OAuthCallbackQuery, OAuthUser, ProviderOptions } from "../auth.js";
2
+ import type { AuthorizationRequest, OAuthCallbackQuery, OAuthUser, ProviderOptions, SavedOAuthState } from "../auth.js";
3
3
  export interface BoxOptions extends ProviderOptions {
4
4
  }
5
5
  export declare class Box {
@@ -13,6 +13,6 @@ export declare class Box {
13
13
  validateAuthorizationCode(code: string): Promise<OAuth2Tokens>;
14
14
  refreshAccessToken(refreshToken: string): Promise<OAuth2Tokens>;
15
15
  revokeToken(token: string): Promise<void>;
16
- getAuthorizationURL(scopes?: string[]): Promise<URL>;
17
- getUser(query: OAuthCallbackQuery): Promise<OAuthUser>;
16
+ getAuthorizationURL(scopes?: string[]): Promise<AuthorizationRequest>;
17
+ getUser(query: OAuthCallbackQuery, saved?: SavedOAuthState): Promise<OAuthUser>;
18
18
  }