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.
- package/dist/auth.d.ts +20 -0
- package/dist/auth.js +20 -0
- package/dist/index.d.ts +1 -1
- package/dist/providers/42.d.ts +3 -3
- package/dist/providers/42.js +9 -6
- package/dist/providers/amazon-cognito.d.ts +3 -3
- package/dist/providers/amazon-cognito.js +9 -6
- package/dist/providers/anilist.d.ts +3 -3
- package/dist/providers/anilist.js +9 -6
- package/dist/providers/apple.d.ts +3 -3
- package/dist/providers/apple.js +9 -6
- package/dist/providers/atlassian.d.ts +3 -3
- package/dist/providers/atlassian.js +9 -6
- package/dist/providers/auth0.d.ts +3 -3
- package/dist/providers/auth0.js +9 -6
- package/dist/providers/authentik.d.ts +3 -3
- package/dist/providers/authentik.js +9 -6
- package/dist/providers/autodesk.d.ts +3 -3
- package/dist/providers/autodesk.js +9 -6
- package/dist/providers/battlenet.d.ts +3 -3
- package/dist/providers/battlenet.js +9 -6
- package/dist/providers/bitbucket.d.ts +3 -3
- package/dist/providers/bitbucket.js +9 -6
- package/dist/providers/box.d.ts +3 -3
- package/dist/providers/box.js +9 -6
- package/dist/providers/bungie.d.ts +3 -3
- package/dist/providers/bungie.js +9 -6
- package/dist/providers/coinbase.d.ts +3 -3
- package/dist/providers/coinbase.js +9 -6
- package/dist/providers/discord.d.ts +3 -3
- package/dist/providers/discord.js +9 -6
- package/dist/providers/donation-alerts.d.ts +3 -3
- package/dist/providers/donation-alerts.js +9 -6
- package/dist/providers/dribbble.d.ts +3 -3
- package/dist/providers/dribbble.js +9 -6
- package/dist/providers/dropbox.d.ts +3 -3
- package/dist/providers/dropbox.js +9 -6
- package/dist/providers/epicgames.d.ts +3 -3
- package/dist/providers/epicgames.js +9 -6
- package/dist/providers/etsy.d.ts +3 -3
- package/dist/providers/etsy.js +9 -6
- package/dist/providers/facebook.d.ts +3 -3
- package/dist/providers/facebook.js +9 -6
- package/dist/providers/figma.d.ts +3 -3
- package/dist/providers/figma.js +9 -6
- package/dist/providers/gitea.d.ts +3 -3
- package/dist/providers/gitea.js +9 -6
- package/dist/providers/github.d.ts +3 -3
- package/dist/providers/github.js +9 -6
- package/dist/providers/gitlab.d.ts +3 -3
- package/dist/providers/gitlab.js +9 -6
- package/dist/providers/google.d.ts +3 -3
- package/dist/providers/google.js +9 -6
- package/dist/providers/intuit.d.ts +3 -3
- package/dist/providers/intuit.js +9 -6
- package/dist/providers/kakao.d.ts +3 -3
- package/dist/providers/kakao.js +9 -6
- package/dist/providers/keycloak.d.ts +3 -3
- package/dist/providers/keycloak.js +9 -6
- package/dist/providers/kick.d.ts +3 -3
- package/dist/providers/kick.js +9 -6
- package/dist/providers/lichess.d.ts +3 -3
- package/dist/providers/lichess.js +9 -6
- package/dist/providers/line.d.ts +3 -3
- package/dist/providers/line.js +9 -6
- package/dist/providers/linear.d.ts +3 -3
- package/dist/providers/linear.js +9 -6
- package/dist/providers/linkedin.d.ts +3 -3
- package/dist/providers/linkedin.js +9 -6
- package/dist/providers/mastodon.d.ts +3 -3
- package/dist/providers/mastodon.js +9 -6
- package/dist/providers/mercadolibre.d.ts +3 -3
- package/dist/providers/mercadolibre.js +9 -6
- package/dist/providers/mercadopago.d.ts +3 -3
- package/dist/providers/mercadopago.js +9 -6
- package/dist/providers/microsoft-entra-id.d.ts +3 -3
- package/dist/providers/microsoft-entra-id.js +9 -6
- package/dist/providers/myanimelist.d.ts +3 -3
- package/dist/providers/myanimelist.js +9 -6
- package/dist/providers/naver.d.ts +3 -3
- package/dist/providers/naver.js +9 -6
- package/dist/providers/notion.d.ts +3 -3
- package/dist/providers/notion.js +9 -6
- package/dist/providers/okta.d.ts +3 -3
- package/dist/providers/okta.js +9 -6
- package/dist/providers/osu.d.ts +3 -3
- package/dist/providers/osu.js +9 -6
- package/dist/providers/patreon.d.ts +3 -3
- package/dist/providers/patreon.js +9 -6
- package/dist/providers/polar.d.ts +3 -3
- package/dist/providers/polar.js +9 -6
- package/dist/providers/reddit.d.ts +3 -3
- package/dist/providers/reddit.js +9 -6
- package/dist/providers/roblox.d.ts +3 -3
- package/dist/providers/roblox.js +9 -6
- package/dist/providers/salesforce.d.ts +3 -3
- package/dist/providers/salesforce.js +9 -6
- package/dist/providers/shikimori.d.ts +3 -3
- package/dist/providers/shikimori.js +9 -6
- package/dist/providers/slack.d.ts +3 -3
- package/dist/providers/slack.js +9 -6
- package/dist/providers/spotify.d.ts +3 -3
- package/dist/providers/spotify.js +9 -6
- package/dist/providers/startgg.d.ts +3 -3
- package/dist/providers/startgg.js +9 -6
- package/dist/providers/strava.d.ts +3 -3
- package/dist/providers/strava.js +9 -6
- package/dist/providers/tiktok.d.ts +3 -3
- package/dist/providers/tiktok.js +9 -6
- package/dist/providers/tiltify.d.ts +3 -3
- package/dist/providers/tiltify.js +9 -6
- package/dist/providers/tumblr.d.ts +3 -3
- package/dist/providers/tumblr.js +9 -6
- package/dist/providers/twitch.d.ts +3 -3
- package/dist/providers/twitch.js +9 -6
- package/dist/providers/twitter.d.ts +3 -3
- package/dist/providers/twitter.js +9 -6
- package/dist/providers/vk.d.ts +3 -3
- package/dist/providers/vk.js +9 -6
- package/dist/providers/withings.d.ts +3 -3
- package/dist/providers/withings.js +9 -6
- package/dist/providers/workos.d.ts +3 -3
- package/dist/providers/workos.js +9 -6
- package/dist/providers/yahoo.d.ts +3 -3
- package/dist/providers/yahoo.js +9 -6
- package/dist/providers/yandex.d.ts +3 -3
- package/dist/providers/yandex.js +9 -6
- package/dist/providers/zoom.d.ts +3 -3
- package/dist/providers/zoom.js +9 -6
- package/package.json +1 -1
- package/readme.md +12 -2
package/dist/providers/polar.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createS256CodeChallenge } from "../oauth2.js";
|
|
2
2
|
import { createOAuth2Request, sendTokenRequest, sendTokenRevocationRequest } from "../request.js";
|
|
3
|
-
import {
|
|
3
|
+
import { extractOAuthTokens, fetchUserProfile, generateOAuthCodeVerifier, generateOAuthState, InvalidOAuthCallbackError, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveOAuthState, resolveScopes, saveOAuthState } from "../auth.js";
|
|
4
4
|
const authorizationEndpoint = "https://polar.sh/oauth2/authorize";
|
|
5
5
|
const tokenEndpoint = "https://api.polar.sh/v1/oauth2/token";
|
|
6
6
|
const tokenRevocationEndpoint = "https://api.polar.sh/v1/oauth2/revoke";
|
|
@@ -77,13 +77,14 @@ export class Polar {
|
|
|
77
77
|
const state = generateOAuthState();
|
|
78
78
|
const codeVerifier = generateOAuthCodeVerifier();
|
|
79
79
|
const url = await this.createAuthorizationURL(state, codeVerifier, resolveScopes(scopes, auth, defaultScopes));
|
|
80
|
-
|
|
81
|
-
|
|
80
|
+
const payload = { codeVerifier };
|
|
81
|
+
await saveOAuthState(auth.store, state, payload);
|
|
82
|
+
return { url, state, payload };
|
|
82
83
|
}
|
|
83
|
-
async getUser(query) {
|
|
84
|
+
async getUser(query, saved) {
|
|
84
85
|
const auth = requireAuthConfig(this.auth);
|
|
85
86
|
const { code, state } = parseCallbackQuery(query);
|
|
86
|
-
const stored = await
|
|
87
|
+
const stored = await resolveOAuthState(auth.store, state, saved);
|
|
87
88
|
if (typeof stored.codeVerifier !== "string") {
|
|
88
89
|
throw new InvalidOAuthCallbackError("Missing PKCE code verifier for OAuth state");
|
|
89
90
|
}
|
|
@@ -94,7 +95,9 @@ export class Polar {
|
|
|
94
95
|
name: profileString(claims.name),
|
|
95
96
|
email: profileString(claims.email),
|
|
96
97
|
// Polar's userinfo response has no avatar field.
|
|
97
|
-
image: null
|
|
98
|
+
image: null,
|
|
99
|
+
raw: claims,
|
|
100
|
+
...extractOAuthTokens(tokens)
|
|
98
101
|
};
|
|
99
102
|
}
|
|
100
103
|
}
|
|
@@ -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 RedditOptions extends ProviderOptions {
|
|
4
4
|
}
|
|
5
5
|
export declare class Reddit {
|
|
@@ -10,6 +10,6 @@ export declare class Reddit {
|
|
|
10
10
|
createAuthorizationURL(state: string, scopes: string[]): URL;
|
|
11
11
|
validateAuthorizationCode(code: string): Promise<OAuth2Tokens>;
|
|
12
12
|
refreshAccessToken(refreshToken: string): Promise<OAuth2Tokens>;
|
|
13
|
-
getAuthorizationURL(scopes?: string[]): Promise<
|
|
14
|
-
getUser(query: OAuthCallbackQuery): Promise<OAuthUser>;
|
|
13
|
+
getAuthorizationURL(scopes?: string[]): Promise<AuthorizationRequest>;
|
|
14
|
+
getUser(query: OAuthCallbackQuery, saved?: SavedOAuthState): Promise<OAuthUser>;
|
|
15
15
|
}
|
package/dist/providers/reddit.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { OAuth2Client } from "../client.js";
|
|
2
|
-
import {
|
|
2
|
+
import { extractOAuthTokens, fetchUserProfile, generateOAuthState, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveOAuthState, resolveScopes, saveOAuthState } from "../auth.js";
|
|
3
3
|
const authorizationEndpoint = "https://www.reddit.com/api/v1/authorize";
|
|
4
4
|
const tokenEndpoint = "https://www.reddit.com/api/v1/access_token";
|
|
5
5
|
const userEndpoint = "https://oauth.reddit.com/api/v1/me";
|
|
@@ -36,20 +36,23 @@ export class Reddit {
|
|
|
36
36
|
const auth = requireAuthConfig(this.auth);
|
|
37
37
|
const state = generateOAuthState();
|
|
38
38
|
const url = this.createAuthorizationURL(state, resolveScopes(scopes, auth, defaultScopes));
|
|
39
|
-
|
|
40
|
-
|
|
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
|
|
46
|
+
await resolveOAuthState(auth.store, state, saved);
|
|
46
47
|
const tokens = await this.validateAuthorizationCode(code);
|
|
47
48
|
const profile = await fetchUserProfile(userEndpoint, tokens.accessToken());
|
|
48
49
|
return {
|
|
49
50
|
id: profileId(profile.id),
|
|
50
51
|
name: profileString(profile.name),
|
|
51
52
|
email: null,
|
|
52
|
-
image: profileString(profile.icon_img)
|
|
53
|
+
image: profileString(profile.icon_img),
|
|
54
|
+
raw: profile,
|
|
55
|
+
...extractOAuthTokens(tokens)
|
|
53
56
|
};
|
|
54
57
|
}
|
|
55
58
|
}
|
|
@@ -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 RobloxOptions extends ProviderOptions {
|
|
4
4
|
}
|
|
5
5
|
export declare class Roblox {
|
|
@@ -11,6 +11,6 @@ export declare class Roblox {
|
|
|
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<
|
|
15
|
-
getUser(query: OAuthCallbackQuery): Promise<OAuthUser>;
|
|
14
|
+
getAuthorizationURL(scopes?: string[]): Promise<AuthorizationRequest>;
|
|
15
|
+
getUser(query: OAuthCallbackQuery, saved?: SavedOAuthState): Promise<OAuthUser>;
|
|
16
16
|
}
|
package/dist/providers/roblox.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { OAuth2Client, CodeChallengeMethod } from "../client.js";
|
|
2
2
|
import { decodeIdToken } from "../oidc.js";
|
|
3
|
-
import {
|
|
3
|
+
import { extractOAuthTokens, fetchUserProfile, generateOAuthCodeVerifier, generateOAuthState, InvalidOAuthCallbackError, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveOAuthState, resolveScopes, saveOAuthState } from "../auth.js";
|
|
4
4
|
const authorizationEndpoint = "https://apis.roblox.com/oauth/v1/authorize";
|
|
5
5
|
const tokenEndpoint = "https://apis.roblox.com/oauth/v1/token";
|
|
6
6
|
const tokenRevocationEndpoint = "https://apis.roblox.com/oauth/v1/token/revoke";
|
|
@@ -39,13 +39,14 @@ export class Roblox {
|
|
|
39
39
|
const state = generateOAuthState();
|
|
40
40
|
const codeVerifier = generateOAuthCodeVerifier();
|
|
41
41
|
const url = await this.createAuthorizationURL(state, codeVerifier, resolveScopes(scopes, auth, defaultScopes));
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
const payload = { codeVerifier };
|
|
43
|
+
await saveOAuthState(auth.store, state, payload);
|
|
44
|
+
return { url, state, payload };
|
|
44
45
|
}
|
|
45
|
-
async getUser(query) {
|
|
46
|
+
async getUser(query, saved) {
|
|
46
47
|
const auth = requireAuthConfig(this.auth);
|
|
47
48
|
const { code, state } = parseCallbackQuery(query);
|
|
48
|
-
const stored = await
|
|
49
|
+
const stored = await resolveOAuthState(auth.store, state, saved);
|
|
49
50
|
if (typeof stored.codeVerifier !== "string") {
|
|
50
51
|
throw new InvalidOAuthCallbackError("Missing PKCE code verifier for OAuth state");
|
|
51
52
|
}
|
|
@@ -61,7 +62,9 @@ export class Roblox {
|
|
|
61
62
|
id: profileId(claims.sub),
|
|
62
63
|
name: profileString(claims.name) ?? profileString(claims.preferred_username),
|
|
63
64
|
email: null,
|
|
64
|
-
image: profileString(claims.picture)
|
|
65
|
+
image: profileString(claims.picture),
|
|
66
|
+
raw: claims,
|
|
67
|
+
...extractOAuthTokens(tokens)
|
|
65
68
|
};
|
|
66
69
|
}
|
|
67
70
|
}
|
|
@@ -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 SalesforceOptions extends ProviderOptions {
|
|
4
4
|
domain?: string;
|
|
5
5
|
}
|
|
@@ -16,6 +16,6 @@ export declare class Salesforce {
|
|
|
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<
|
|
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 { OAuth2Client, CodeChallengeMethod } from "../client.js";
|
|
2
2
|
import { decodeIdToken } from "../oidc.js";
|
|
3
|
-
import {
|
|
3
|
+
import { extractOAuthTokens, fetchUserProfile, generateOAuthCodeVerifier, generateOAuthState, InvalidOAuthCallbackError, parseCallbackQuery, profileId, profileString, requireAuthConfig, requireProviderOption, resolveAuthConfig, resolveOAuthState, resolveScopes, saveOAuthState } from "../auth.js";
|
|
4
4
|
const envPrefix = "SALESFORCE";
|
|
5
5
|
const defaultScopes = ["openid", "profile", "email"];
|
|
6
6
|
export class Salesforce {
|
|
@@ -46,13 +46,14 @@ export class Salesforce {
|
|
|
46
46
|
const state = generateOAuthState();
|
|
47
47
|
const codeVerifier = generateOAuthCodeVerifier();
|
|
48
48
|
const url = await this.createAuthorizationURL(state, codeVerifier, resolveScopes(scopes, auth, defaultScopes));
|
|
49
|
-
|
|
50
|
-
|
|
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
|
|
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
|
}
|
|
@@ -68,7 +69,9 @@ export class Salesforce {
|
|
|
68
69
|
id: profileId(claims.sub),
|
|
69
70
|
name: profileString(claims.name) ?? profileString(claims.preferred_username),
|
|
70
71
|
email: profileString(claims.email),
|
|
71
|
-
image: profileString(claims.picture)
|
|
72
|
+
image: profileString(claims.picture),
|
|
73
|
+
raw: claims,
|
|
74
|
+
...extractOAuthTokens(tokens)
|
|
72
75
|
};
|
|
73
76
|
}
|
|
74
77
|
}
|
|
@@ -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 ShikimoriOptions extends ProviderOptions {
|
|
4
4
|
}
|
|
5
5
|
export declare class Shikimori {
|
|
@@ -12,6 +12,6 @@ export declare class Shikimori {
|
|
|
12
12
|
createAuthorizationURL(state: string): URL;
|
|
13
13
|
validateAuthorizationCode(code: string): Promise<OAuth2Tokens>;
|
|
14
14
|
refreshAccessToken(refreshToken: string): Promise<OAuth2Tokens>;
|
|
15
|
-
getAuthorizationURL(): Promise<
|
|
16
|
-
getUser(query: OAuthCallbackQuery): Promise<OAuthUser>;
|
|
15
|
+
getAuthorizationURL(): 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 {
|
|
2
|
+
import { extractOAuthTokens, fetchUserProfile, generateOAuthState, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveOAuthState, saveOAuthState } from "../auth.js";
|
|
3
3
|
const authorizationEndpoint = "https://shikimori.one/oauth/authorize";
|
|
4
4
|
const tokenEndpoint = "https://shikimori.one/oauth/token";
|
|
5
5
|
const userEndpoint = "https://shikimori.one/api/users/whoami";
|
|
@@ -58,13 +58,14 @@ export class Shikimori {
|
|
|
58
58
|
const auth = requireAuthConfig(this.auth);
|
|
59
59
|
const state = generateOAuthState();
|
|
60
60
|
const url = this.createAuthorizationURL(state);
|
|
61
|
-
|
|
62
|
-
|
|
61
|
+
const payload = {};
|
|
62
|
+
await saveOAuthState(auth.store, state, payload);
|
|
63
|
+
return { url, state, payload };
|
|
63
64
|
}
|
|
64
|
-
async getUser(query) {
|
|
65
|
+
async getUser(query, saved) {
|
|
65
66
|
const auth = requireAuthConfig(this.auth);
|
|
66
67
|
const { code, state } = parseCallbackQuery(query);
|
|
67
|
-
await
|
|
68
|
+
await resolveOAuthState(auth.store, state, saved);
|
|
68
69
|
const tokens = await this.validateAuthorizationCode(code);
|
|
69
70
|
const profile = await fetchUserProfile(userEndpoint, tokens.accessToken());
|
|
70
71
|
let image = null;
|
|
@@ -75,7 +76,9 @@ export class Shikimori {
|
|
|
75
76
|
id: profileId(profile.id),
|
|
76
77
|
name: profileString(profile.nickname),
|
|
77
78
|
email: null,
|
|
78
|
-
image: image ?? profileString(profile.avatar)
|
|
79
|
+
image: image ?? profileString(profile.avatar),
|
|
80
|
+
raw: profile,
|
|
81
|
+
...extractOAuthTokens(tokens)
|
|
79
82
|
};
|
|
80
83
|
}
|
|
81
84
|
}
|
|
@@ -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 SlackOptions extends ProviderOptions {
|
|
4
4
|
}
|
|
5
5
|
export declare class Slack {
|
|
@@ -9,6 +9,6 @@ export declare class Slack {
|
|
|
9
9
|
constructor(clientId: string, clientSecret: string, redirectURI: string | null);
|
|
10
10
|
createAuthorizationURL(state: string, scopes: string[]): URL;
|
|
11
11
|
validateAuthorizationCode(code: string): Promise<OAuth2Tokens>;
|
|
12
|
-
getAuthorizationURL(scopes?: string[]): Promise<
|
|
13
|
-
getUser(query: OAuthCallbackQuery): Promise<OAuthUser>;
|
|
12
|
+
getAuthorizationURL(scopes?: string[]): Promise<AuthorizationRequest>;
|
|
13
|
+
getUser(query: OAuthCallbackQuery, saved?: SavedOAuthState): Promise<OAuthUser>;
|
|
14
14
|
}
|
package/dist/providers/slack.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { OAuth2Client } from "../client.js";
|
|
2
2
|
import { decodeIdToken } from "../oidc.js";
|
|
3
|
-
import {
|
|
3
|
+
import { extractOAuthTokens, fetchUserProfile, generateOAuthState, OAuthProviderError, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveOAuthState, resolveScopes, saveOAuthState } from "../auth.js";
|
|
4
4
|
const authorizationEndpoint = "https://slack.com/openid/connect/authorize";
|
|
5
5
|
const tokenEndpoint = "https://slack.com/api/openid.connect.token";
|
|
6
6
|
const userinfoEndpoint = "https://slack.com/api/openid.connect.userInfo";
|
|
@@ -30,13 +30,14 @@ export class Slack {
|
|
|
30
30
|
const auth = requireAuthConfig(this.auth);
|
|
31
31
|
const state = generateOAuthState();
|
|
32
32
|
const url = this.createAuthorizationURL(state, resolveScopes(scopes, auth, defaultScopes));
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
const payload = {};
|
|
34
|
+
await saveOAuthState(auth.store, state, payload);
|
|
35
|
+
return { url, state, payload };
|
|
35
36
|
}
|
|
36
|
-
async getUser(query) {
|
|
37
|
+
async getUser(query, saved) {
|
|
37
38
|
const auth = requireAuthConfig(this.auth);
|
|
38
39
|
const { code, state } = parseCallbackQuery(query);
|
|
39
|
-
await
|
|
40
|
+
await resolveOAuthState(auth.store, state, saved);
|
|
40
41
|
const tokens = await this.validateAuthorizationCode(code);
|
|
41
42
|
let claims;
|
|
42
43
|
if ("id_token" in tokens.data) {
|
|
@@ -53,7 +54,9 @@ export class Slack {
|
|
|
53
54
|
id: profileId(claims.sub),
|
|
54
55
|
name: profileString(claims.name),
|
|
55
56
|
email: profileString(claims.email),
|
|
56
|
-
image: profileString(claims.picture)
|
|
57
|
+
image: profileString(claims.picture),
|
|
58
|
+
raw: claims,
|
|
59
|
+
...extractOAuthTokens(tokens)
|
|
57
60
|
};
|
|
58
61
|
}
|
|
59
62
|
}
|
|
@@ -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 SpotifyOptions extends ProviderOptions {
|
|
4
4
|
}
|
|
5
5
|
export declare class Spotify {
|
|
@@ -10,6 +10,6 @@ export declare class Spotify {
|
|
|
10
10
|
createAuthorizationURL(state: string, codeVerifier: string | null, scopes: string[]): Promise<URL>;
|
|
11
11
|
validateAuthorizationCode(code: string, codeVerifier: string | null): Promise<OAuth2Tokens>;
|
|
12
12
|
refreshAccessToken(refreshToken: string): Promise<OAuth2Tokens>;
|
|
13
|
-
getAuthorizationURL(scopes?: string[]): Promise<
|
|
14
|
-
getUser(query: OAuthCallbackQuery): Promise<OAuthUser>;
|
|
13
|
+
getAuthorizationURL(scopes?: string[]): Promise<AuthorizationRequest>;
|
|
14
|
+
getUser(query: OAuthCallbackQuery, saved?: SavedOAuthState): Promise<OAuthUser>;
|
|
15
15
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CodeChallengeMethod, OAuth2Client } from "../client.js";
|
|
2
|
-
import {
|
|
2
|
+
import { extractOAuthTokens, fetchUserProfile, generateOAuthCodeVerifier, generateOAuthState, InvalidOAuthCallbackError, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveOAuthState, resolveScopes, saveOAuthState } from "../auth.js";
|
|
3
3
|
const authorizationEndpoint = "https://accounts.spotify.com/authorize";
|
|
4
4
|
const tokenEndpoint = "https://accounts.spotify.com/api/token";
|
|
5
5
|
const userEndpoint = "https://api.spotify.com/v1/me";
|
|
@@ -40,13 +40,14 @@ export class Spotify {
|
|
|
40
40
|
const state = generateOAuthState();
|
|
41
41
|
const codeVerifier = generateOAuthCodeVerifier();
|
|
42
42
|
const url = await this.createAuthorizationURL(state, codeVerifier, resolveScopes(scopes, auth, defaultScopes));
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
const payload = { codeVerifier };
|
|
44
|
+
await saveOAuthState(auth.store, state, payload);
|
|
45
|
+
return { url, state, payload };
|
|
45
46
|
}
|
|
46
|
-
async getUser(query) {
|
|
47
|
+
async getUser(query, saved) {
|
|
47
48
|
const auth = requireAuthConfig(this.auth);
|
|
48
49
|
const { code, state } = parseCallbackQuery(query);
|
|
49
|
-
const stored = await
|
|
50
|
+
const stored = await resolveOAuthState(auth.store, state, saved);
|
|
50
51
|
if (typeof stored.codeVerifier !== "string") {
|
|
51
52
|
throw new InvalidOAuthCallbackError("Missing PKCE code verifier for OAuth state");
|
|
52
53
|
}
|
|
@@ -61,7 +62,9 @@ export class Spotify {
|
|
|
61
62
|
id: profileId(profile.id),
|
|
62
63
|
name: profileString(profile.display_name),
|
|
63
64
|
email: profileString(profile.email),
|
|
64
|
-
image
|
|
65
|
+
image,
|
|
66
|
+
raw: profile,
|
|
67
|
+
...extractOAuthTokens(tokens)
|
|
65
68
|
};
|
|
66
69
|
}
|
|
67
70
|
}
|
|
@@ -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 StartGGOptions extends ProviderOptions {
|
|
4
4
|
}
|
|
5
5
|
export declare class StartGG {
|
|
@@ -12,6 +12,6 @@ export declare class StartGG {
|
|
|
12
12
|
createAuthorizationURL(state: string, scopes: string[]): URL;
|
|
13
13
|
validateAuthorizationCode(code: string, scopes: string[]): Promise<OAuth2Tokens>;
|
|
14
14
|
refreshAccessToken(refreshToken: string, scopes: string[]): Promise<OAuth2Tokens>;
|
|
15
|
-
getAuthorizationURL(scopes?: string[]): Promise<
|
|
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 {
|
|
2
|
+
import { extractOAuthTokens, generateOAuthState, OAuthProviderError, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveOAuthState, resolveScopes, saveOAuthState } from "../auth.js";
|
|
3
3
|
const authorizationEndpoint = "https://start.gg/oauth/authorize";
|
|
4
4
|
const tokenEndpoint = "https://api.start.gg/oauth/access_token";
|
|
5
5
|
const refreshEndpoint = "https://api.start.gg/oauth/refresh";
|
|
@@ -119,13 +119,14 @@ export class StartGG {
|
|
|
119
119
|
const state = generateOAuthState();
|
|
120
120
|
const resolved = resolveScopes(scopes, auth, defaultScopes);
|
|
121
121
|
const url = this.createAuthorizationURL(state, resolved);
|
|
122
|
-
|
|
123
|
-
|
|
122
|
+
const payload = { scopes: resolved };
|
|
123
|
+
await saveOAuthState(auth.store, state, payload);
|
|
124
|
+
return { url, state, payload };
|
|
124
125
|
}
|
|
125
|
-
async getUser(query) {
|
|
126
|
+
async getUser(query, saved) {
|
|
126
127
|
const auth = requireAuthConfig(this.auth);
|
|
127
128
|
const { code, state } = parseCallbackQuery(query);
|
|
128
|
-
const stored = await
|
|
129
|
+
const stored = await resolveOAuthState(auth.store, state, saved);
|
|
129
130
|
const tokens = await this.validateAuthorizationCode(code, stored.scopes ?? resolveScopes(undefined, auth, defaultScopes));
|
|
130
131
|
const profile = await fetchCurrentUser(tokens.accessToken());
|
|
131
132
|
let image = null;
|
|
@@ -137,7 +138,9 @@ export class StartGG {
|
|
|
137
138
|
id: profileId(profile.id),
|
|
138
139
|
name: profileString(profile.name),
|
|
139
140
|
email: profileString(profile.email),
|
|
140
|
-
image
|
|
141
|
+
image,
|
|
142
|
+
raw: profile,
|
|
143
|
+
...extractOAuthTokens(tokens)
|
|
141
144
|
};
|
|
142
145
|
}
|
|
143
146
|
}
|
|
@@ -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 StravaOptions extends ProviderOptions {
|
|
4
4
|
}
|
|
5
5
|
export declare class Strava {
|
|
@@ -12,6 +12,6 @@ export declare class Strava {
|
|
|
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<
|
|
16
|
-
getUser(query: OAuthCallbackQuery): Promise<OAuthUser>;
|
|
15
|
+
getAuthorizationURL(scopes?: string[]): Promise<AuthorizationRequest>;
|
|
16
|
+
getUser(query: OAuthCallbackQuery, saved?: SavedOAuthState): Promise<OAuthUser>;
|
|
17
17
|
}
|
package/dist/providers/strava.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createOAuth2Request, sendTokenRequest } from "../request.js";
|
|
2
|
-
import {
|
|
2
|
+
import { extractOAuthTokens, fetchUserProfile, generateOAuthState, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveOAuthState, resolveScopes, saveOAuthState } from "../auth.js";
|
|
3
3
|
const authorizationEndpoint = "https://www.strava.com/oauth/authorize";
|
|
4
4
|
const tokenEndpoint = "https://www.strava.com/api/v3/oauth/token";
|
|
5
5
|
const userEndpoint = "https://www.strava.com/api/v3/athlete";
|
|
@@ -63,13 +63,14 @@ export class Strava {
|
|
|
63
63
|
const auth = requireAuthConfig(this.auth);
|
|
64
64
|
const state = generateOAuthState();
|
|
65
65
|
const url = this.createAuthorizationURL(state, resolveScopes(scopes, auth, defaultScopes));
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
const payload = {};
|
|
67
|
+
await saveOAuthState(auth.store, state, payload);
|
|
68
|
+
return { url, state, payload };
|
|
68
69
|
}
|
|
69
|
-
async getUser(query) {
|
|
70
|
+
async getUser(query, saved) {
|
|
70
71
|
const auth = requireAuthConfig(this.auth);
|
|
71
72
|
const { code, state } = parseCallbackQuery(query);
|
|
72
|
-
await
|
|
73
|
+
await resolveOAuthState(auth.store, state, saved);
|
|
73
74
|
const tokens = await this.validateAuthorizationCode(code);
|
|
74
75
|
const profile = await fetchUserProfile(userEndpoint, tokens.accessToken());
|
|
75
76
|
const firstName = profileString(profile.firstname);
|
|
@@ -79,7 +80,9 @@ export class Strava {
|
|
|
79
80
|
id: profileId(profile.id),
|
|
80
81
|
name: name !== "" ? name : null,
|
|
81
82
|
email: null,
|
|
82
|
-
image: profileString(profile.profile)
|
|
83
|
+
image: profileString(profile.profile),
|
|
84
|
+
raw: profile,
|
|
85
|
+
...extractOAuthTokens(tokens)
|
|
83
86
|
};
|
|
84
87
|
}
|
|
85
88
|
}
|
|
@@ -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 TikTokOptions extends ProviderOptions {
|
|
4
4
|
}
|
|
5
5
|
export declare class TikTok {
|
|
@@ -13,6 +13,6 @@ export declare class TikTok {
|
|
|
13
13
|
validateAuthorizationCode(code: string, codeVerifier: string): Promise<OAuth2Tokens>;
|
|
14
14
|
refreshAccessToken(refreshToken: string): Promise<OAuth2Tokens>;
|
|
15
15
|
revokeToken(token: string): Promise<void>;
|
|
16
|
-
getAuthorizationURL(scopes?: string[]): Promise<
|
|
17
|
-
getUser(query: OAuthCallbackQuery): Promise<OAuthUser>;
|
|
16
|
+
getAuthorizationURL(scopes?: string[]): Promise<AuthorizationRequest>;
|
|
17
|
+
getUser(query: OAuthCallbackQuery, saved?: SavedOAuthState): Promise<OAuthUser>;
|
|
18
18
|
}
|
package/dist/providers/tiktok.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createS256CodeChallenge } from "../oauth2.js";
|
|
2
2
|
import { createOAuth2Request, sendTokenRequest, sendTokenRevocationRequest } from "../request.js";
|
|
3
|
-
import {
|
|
3
|
+
import { extractOAuthTokens, fetchUserProfile, generateOAuthCodeVerifier, generateOAuthState, InvalidOAuthCallbackError, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveOAuthState, resolveScopes, saveOAuthState } from "../auth.js";
|
|
4
4
|
const authorizationEndpoint = "https://www.tiktok.com/v2/auth/authorize";
|
|
5
5
|
const tokenEndpoint = "https://open.tiktokapis.com/v2/oauth/token/";
|
|
6
6
|
const tokenRevocationEndpoint = "https://open.tiktokapis.com/v2/oauth/revoke/";
|
|
@@ -77,13 +77,14 @@ export class TikTok {
|
|
|
77
77
|
const state = generateOAuthState();
|
|
78
78
|
const codeVerifier = generateOAuthCodeVerifier();
|
|
79
79
|
const url = await this.createAuthorizationURL(state, codeVerifier, resolveScopes(scopes, auth, defaultScopes));
|
|
80
|
-
|
|
81
|
-
|
|
80
|
+
const payload = { codeVerifier };
|
|
81
|
+
await saveOAuthState(auth.store, state, payload);
|
|
82
|
+
return { url, state, payload };
|
|
82
83
|
}
|
|
83
|
-
async getUser(query) {
|
|
84
|
+
async getUser(query, saved) {
|
|
84
85
|
const auth = requireAuthConfig(this.auth);
|
|
85
86
|
const { code, state } = parseCallbackQuery(query);
|
|
86
|
-
const stored = await
|
|
87
|
+
const stored = await resolveOAuthState(auth.store, state, saved);
|
|
87
88
|
if (typeof stored.codeVerifier !== "string") {
|
|
88
89
|
throw new InvalidOAuthCallbackError("Missing PKCE code verifier for OAuth state");
|
|
89
90
|
}
|
|
@@ -103,7 +104,9 @@ export class TikTok {
|
|
|
103
104
|
id: profileId(user.open_id),
|
|
104
105
|
name: profileString(user.display_name),
|
|
105
106
|
email: null,
|
|
106
|
-
image: profileString(user.avatar_url)
|
|
107
|
+
image: profileString(user.avatar_url),
|
|
108
|
+
raw: user,
|
|
109
|
+
...extractOAuthTokens(tokens)
|
|
107
110
|
};
|
|
108
111
|
}
|
|
109
112
|
}
|
|
@@ -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 TiltifyOptions extends ProviderOptions {
|
|
4
4
|
}
|
|
5
5
|
export declare class Tiltify {
|
|
@@ -12,6 +12,6 @@ export declare class Tiltify {
|
|
|
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<
|
|
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 {
|
|
2
|
+
import { extractOAuthTokens, fetchUserProfile, generateOAuthState, parseCallbackQuery, profileId, profileString, requireAuthConfig, resolveAuthConfig, resolveOAuthState, resolveScopes, saveOAuthState } from "../auth.js";
|
|
3
3
|
const authorizationEndpoint = "https://v5api.tiltify.com/oauth/authorize";
|
|
4
4
|
const tokenEndpoint = "https://v5api.tiltify.com/oauth/token";
|
|
5
5
|
const userEndpoint = "https://v5api.tiltify.com/api/public/current-user";
|
|
@@ -62,13 +62,14 @@ export class Tiltify {
|
|
|
62
62
|
const auth = requireAuthConfig(this.auth);
|
|
63
63
|
const state = generateOAuthState();
|
|
64
64
|
const url = this.createAuthorizationURL(state, resolveScopes(scopes, auth, defaultScopes));
|
|
65
|
-
|
|
66
|
-
|
|
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
|
|
72
|
+
await resolveOAuthState(auth.store, state, saved);
|
|
72
73
|
const tokens = await this.validateAuthorizationCode(code);
|
|
73
74
|
const profile = await fetchUserProfile(userEndpoint, tokens.accessToken());
|
|
74
75
|
let user = {};
|
|
@@ -84,7 +85,9 @@ export class Tiltify {
|
|
|
84
85
|
id: profileId(user.id),
|
|
85
86
|
name: profileString(user.username),
|
|
86
87
|
email: null,
|
|
87
|
-
image
|
|
88
|
+
image,
|
|
89
|
+
raw: user,
|
|
90
|
+
...extractOAuthTokens(tokens)
|
|
88
91
|
};
|
|
89
92
|
}
|
|
90
93
|
}
|
|
@@ -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 TumblrOptions extends ProviderOptions {
|
|
4
4
|
}
|
|
5
5
|
export declare class Tumblr {
|
|
@@ -10,6 +10,6 @@ export declare class Tumblr {
|
|
|
10
10
|
createAuthorizationURL(state: string, scopes: string[]): URL;
|
|
11
11
|
validateAuthorizationCode(code: string): Promise<OAuth2Tokens>;
|
|
12
12
|
refreshAccessToken(refreshToken: string): Promise<OAuth2Tokens>;
|
|
13
|
-
getAuthorizationURL(scopes?: string[]): Promise<
|
|
14
|
-
getUser(query: OAuthCallbackQuery): Promise<OAuthUser>;
|
|
13
|
+
getAuthorizationURL(scopes?: string[]): Promise<AuthorizationRequest>;
|
|
14
|
+
getUser(query: OAuthCallbackQuery, saved?: SavedOAuthState): Promise<OAuthUser>;
|
|
15
15
|
}
|