@shware/security 0.4.8 → 1.0.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/index.cjs +86 -20
- package/dist/auth/index.cjs.map +1 -1
- package/dist/auth/index.d.cts +8 -2
- package/dist/auth/index.d.ts +8 -2
- package/dist/auth/index.mjs +87 -21
- package/dist/auth/index.mjs.map +1 -1
- package/dist/auth/types.cjs.map +1 -1
- package/dist/auth/types.d.cts +10 -3
- package/dist/auth/types.d.ts +10 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/oauth2/client.cjs +42 -8
- package/dist/oauth2/client.cjs.map +1 -1
- package/dist/oauth2/client.d.cts +35 -12
- package/dist/oauth2/client.d.ts +35 -12
- package/dist/oauth2/client.mjs +42 -8
- package/dist/oauth2/client.mjs.map +1 -1
- package/dist/oauth2/error.cjs.map +1 -1
- package/dist/oauth2/error.d.cts +1 -1
- package/dist/oauth2/error.d.ts +1 -1
- package/dist/oauth2/error.mjs.map +1 -1
- package/dist/oauth2/provider/apple.cjs +21 -5
- package/dist/oauth2/provider/apple.cjs.map +1 -1
- package/dist/oauth2/provider/apple.d.cts +12 -4
- package/dist/oauth2/provider/apple.d.ts +12 -4
- package/dist/oauth2/provider/apple.mjs +19 -4
- package/dist/oauth2/provider/apple.mjs.map +1 -1
- package/dist/oauth2/provider/common.cjs +5 -13
- package/dist/oauth2/provider/common.cjs.map +1 -1
- package/dist/oauth2/provider/common.d.cts +6 -11
- package/dist/oauth2/provider/common.d.ts +6 -11
- package/dist/oauth2/provider/common.mjs +5 -13
- package/dist/oauth2/provider/common.mjs.map +1 -1
- package/dist/oauth2/provider/facebook.cjs +19 -3
- package/dist/oauth2/provider/facebook.cjs.map +1 -1
- package/dist/oauth2/provider/facebook.d.cts +17 -3
- package/dist/oauth2/provider/facebook.d.ts +17 -3
- package/dist/oauth2/provider/facebook.mjs +18 -3
- package/dist/oauth2/provider/facebook.mjs.map +1 -1
- package/dist/oauth2/provider/github.cjs +6 -3
- package/dist/oauth2/provider/github.cjs.map +1 -1
- package/dist/oauth2/provider/github.d.cts +11 -3
- package/dist/oauth2/provider/github.d.ts +11 -3
- package/dist/oauth2/provider/github.mjs +5 -3
- package/dist/oauth2/provider/github.mjs.map +1 -1
- package/dist/oauth2/provider/google.cjs +17 -1
- package/dist/oauth2/provider/google.cjs.map +1 -1
- package/dist/oauth2/provider/google.d.cts +11 -4
- package/dist/oauth2/provider/google.d.ts +11 -4
- package/dist/oauth2/provider/google.mjs +16 -1
- package/dist/oauth2/provider/google.mjs.map +1 -1
- package/dist/oauth2/provider/x.cjs +16 -4
- package/dist/oauth2/provider/x.cjs.map +1 -1
- package/dist/oauth2/provider/x.d.cts +11 -3
- package/dist/oauth2/provider/x.d.ts +11 -3
- package/dist/oauth2/provider/x.mjs +15 -4
- package/dist/oauth2/provider/x.mjs.map +1 -1
- package/dist/oauth2/types.cjs +20 -0
- package/dist/oauth2/types.cjs.map +1 -1
- package/dist/oauth2/types.d.cts +73 -12
- package/dist/oauth2/types.d.ts +73 -12
- package/dist/oauth2/types.mjs +13 -0
- package/dist/oauth2/types.mjs.map +1 -1
- package/dist/session/redis-session.cjs +21 -0
- package/dist/session/redis-session.cjs.map +1 -1
- package/dist/session/redis-session.d.cts +4 -0
- package/dist/session/redis-session.d.ts +4 -0
- package/dist/session/redis-session.mjs +21 -0
- package/dist/session/redis-session.mjs.map +1 -1
- package/dist/session/types.cjs.map +1 -1
- package/dist/session/types.d.cts +3 -0
- package/dist/session/types.d.ts +3 -0
- package/dist/utils/http.cjs +2 -2
- package/dist/utils/http.cjs.map +1 -1
- package/dist/utils/http.mjs +2 -2
- package/dist/utils/http.mjs.map +1 -1
- package/package.json +1 -1
- package/dist/oidc/index.cjs +0 -39
- package/dist/oidc/index.cjs.map +0 -1
- package/dist/oidc/index.d.cts +0 -10
- package/dist/oidc/index.d.ts +0 -10
- package/dist/oidc/index.mjs +0 -14
- package/dist/oidc/index.mjs.map +0 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { Auth } from './auth/index';\nexport { OAuth2Client, oauth2RedirectQuerySchema } from './oauth2/client';\nexport { RedisIndexedSessionRepository, PRINCIPAL_NAME_INDEX_NAME } from './session/redis-session';\n\nexport type { Namespace, SessionRepository } from './session/types';\nexport type { StandardClaims, OAuth2Token, UserInfo } from './oauth2/types';\nexport type { Principal } from './core/index';\n"],"mappings":";AAAA,SAAS,YAAY;AACrB,SAAS,cAAc,iCAAiC;AACxD,SAAS,+BAA+B,iCAAiC;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { Auth } from './auth/index';\nexport { OAuth2Client, oauth2RedirectQuerySchema } from './oauth2/client';\nexport { RedisIndexedSessionRepository, PRINCIPAL_NAME_INDEX_NAME } from './session/redis-session';\n\nexport type { Namespace, SessionRepository } from './session/types';\nexport type { StandardClaims, OAuth2Token, UserInfo, OidcToken, OidcScopes } from './oauth2/types';\nexport type { Principal } from './core/index';\n"],"mappings":";AAAA,SAAS,YAAY;AACrB,SAAS,cAAc,iCAAiC;AACxD,SAAS,+BAA+B,iCAAiC;","names":[]}
|
package/dist/oauth2/client.cjs
CHANGED
|
@@ -37,8 +37,8 @@ module.exports = __toCommonJS(client_exports);
|
|
|
37
37
|
var import_zod = require("zod");
|
|
38
38
|
var import_tiny_invariant = __toESM(require("tiny-invariant"), 1);
|
|
39
39
|
var oauth2RedirectQuerySchema = import_zod.z.object({
|
|
40
|
-
code: import_zod.z.string(),
|
|
41
|
-
state: import_zod.z.string(),
|
|
40
|
+
code: import_zod.z.string().optional(),
|
|
41
|
+
state: import_zod.z.string().optional(),
|
|
42
42
|
error: import_zod.z.string().optional(),
|
|
43
43
|
error_description: import_zod.z.string().optional(),
|
|
44
44
|
error_uri: import_zod.z.string().optional()
|
|
@@ -51,6 +51,9 @@ var OAuth2Client = class {
|
|
|
51
51
|
get baseUri() {
|
|
52
52
|
return this.config.baseUri;
|
|
53
53
|
}
|
|
54
|
+
get successUri() {
|
|
55
|
+
return this.config.successUri;
|
|
56
|
+
}
|
|
54
57
|
get errorUri() {
|
|
55
58
|
return this.config.errorUri;
|
|
56
59
|
}
|
|
@@ -61,35 +64,49 @@ var OAuth2Client = class {
|
|
|
61
64
|
(0, import_tiny_invariant.default)(provider, `Provider ${registration.provider ?? registrationId} not found`);
|
|
62
65
|
return { registration, provider };
|
|
63
66
|
}
|
|
64
|
-
createAuthorizationUri(
|
|
67
|
+
createAuthorizationUri({
|
|
68
|
+
registrationId,
|
|
69
|
+
state,
|
|
70
|
+
pkce
|
|
71
|
+
}) {
|
|
65
72
|
const { provider, registration } = this.getClientConfig(registrationId);
|
|
66
73
|
const { baseUri } = this.config;
|
|
67
74
|
const { scope, clientId, redirectUri } = registration;
|
|
68
75
|
return provider.createAuthorizationUri({
|
|
76
|
+
pkce,
|
|
69
77
|
state,
|
|
70
78
|
scope,
|
|
71
79
|
clientId,
|
|
72
|
-
codeVerifier,
|
|
73
80
|
redirectUri: redirectUri ?? `${baseUri}/login/oauth2/code/${registrationId}`
|
|
74
81
|
});
|
|
75
82
|
}
|
|
76
|
-
async exchangeAuthorizationCode(
|
|
83
|
+
async exchangeAuthorizationCode({
|
|
84
|
+
registrationId,
|
|
85
|
+
code,
|
|
86
|
+
pkce
|
|
87
|
+
}) {
|
|
77
88
|
const { provider, registration } = this.getClientConfig(registrationId);
|
|
78
89
|
const { baseUri } = this.config;
|
|
79
90
|
const { clientId, clientSecret, redirectUri } = registration;
|
|
80
91
|
return provider.exchangeAuthorizationCode({
|
|
81
92
|
code,
|
|
82
|
-
|
|
93
|
+
pkce,
|
|
83
94
|
clientId,
|
|
84
95
|
clientSecret,
|
|
85
96
|
redirectUri: redirectUri ?? `${baseUri}/login/oauth2/code/${registrationId}`
|
|
86
97
|
});
|
|
87
98
|
}
|
|
88
|
-
async getUserInfo(
|
|
99
|
+
async getUserInfo({
|
|
100
|
+
registrationId,
|
|
101
|
+
token
|
|
102
|
+
}) {
|
|
89
103
|
const { provider } = this.getClientConfig(registrationId);
|
|
90
104
|
return provider.getUserInfo(token);
|
|
91
105
|
}
|
|
92
|
-
async refreshAccessToken(
|
|
106
|
+
async refreshAccessToken({
|
|
107
|
+
registrationId,
|
|
108
|
+
refreshToken
|
|
109
|
+
}) {
|
|
93
110
|
const { provider, registration } = this.getClientConfig(registrationId);
|
|
94
111
|
const { clientId, clientSecret } = registration;
|
|
95
112
|
(0, import_tiny_invariant.default)(provider.refreshAccessToken, "Provider does not support refreshAccessToken");
|
|
@@ -101,6 +118,23 @@ var OAuth2Client = class {
|
|
|
101
118
|
(0, import_tiny_invariant.default)(provider.revokeToken, "Provider does not support revokeToken");
|
|
102
119
|
await provider.revokeToken({ token, clientId, clientSecret });
|
|
103
120
|
}
|
|
121
|
+
async loginOAuth2Native({
|
|
122
|
+
registrationId,
|
|
123
|
+
credentials,
|
|
124
|
+
pkce
|
|
125
|
+
}) {
|
|
126
|
+
const { provider, registration } = this.getClientConfig(registrationId);
|
|
127
|
+
(0, import_tiny_invariant.default)(provider.loginOAuth2Native, "Provider does not support loginOAuth2Native");
|
|
128
|
+
const { baseUri } = this.config;
|
|
129
|
+
const { clientId, clientSecret, redirectUri } = registration;
|
|
130
|
+
return provider.loginOAuth2Native({
|
|
131
|
+
clientId,
|
|
132
|
+
clientSecret,
|
|
133
|
+
redirectUri: redirectUri ?? `${baseUri}/login/oauth2/code/${registrationId}`,
|
|
134
|
+
credentials,
|
|
135
|
+
pkce
|
|
136
|
+
});
|
|
137
|
+
}
|
|
104
138
|
};
|
|
105
139
|
// Annotate the CommonJS export names for ESM import in node:
|
|
106
140
|
0 && (module.exports = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/oauth2/client.ts"],"sourcesContent":["import { z } from 'zod';\nimport invariant from 'tiny-invariant';\nimport {
|
|
1
|
+
{"version":3,"sources":["../../src/oauth2/client.ts"],"sourcesContent":["import { z } from 'zod';\nimport invariant from 'tiny-invariant';\nimport {\n NativeCredentials,\n OAuth2ClientConfig,\n OAuth2Token,\n OidcToken,\n PkceParameters,\n} from './types';\n\nexport const oauth2RedirectQuerySchema = z.object({\n code: z.string().optional(),\n state: z.string().optional(),\n error: z.string().optional(),\n error_description: z.string().optional(),\n error_uri: z.string().optional(),\n});\n\nexport class OAuth2Client {\n private config: OAuth2ClientConfig;\n constructor(config: OAuth2ClientConfig) {\n this.config = config;\n }\n\n get baseUri() {\n return this.config.baseUri;\n }\n\n get successUri() {\n return this.config.successUri;\n }\n\n get errorUri() {\n return this.config.errorUri;\n }\n\n getClientConfig(registrationId: string) {\n const registration = this.config.registration[registrationId];\n invariant(registration, `Registration ${registrationId} not found`);\n const provider = this.config.provider[registration.provider ?? registrationId];\n invariant(provider, `Provider ${registration.provider ?? registrationId} not found`);\n return { registration, provider };\n }\n\n createAuthorizationUri({\n registrationId,\n state,\n pkce,\n }: {\n registrationId: string;\n state: string;\n pkce?: PkceParameters;\n }): URL {\n const { provider, registration } = this.getClientConfig(registrationId);\n\n const { baseUri } = this.config;\n const { scope, clientId, redirectUri } = registration;\n return provider.createAuthorizationUri({\n pkce,\n state,\n scope,\n clientId,\n redirectUri: redirectUri ?? `${baseUri}/login/oauth2/code/${registrationId}`,\n });\n }\n\n async exchangeAuthorizationCode({\n registrationId,\n code,\n pkce,\n }: {\n registrationId: string;\n code: string;\n pkce?: PkceParameters;\n }): Promise<OAuth2Token> {\n const { provider, registration } = this.getClientConfig(registrationId);\n\n const { baseUri } = this.config;\n const { clientId, clientSecret, redirectUri } = registration;\n return provider.exchangeAuthorizationCode({\n code,\n pkce,\n clientId,\n clientSecret,\n redirectUri: redirectUri ?? `${baseUri}/login/oauth2/code/${registrationId}`,\n });\n }\n\n async getUserInfo({\n registrationId,\n token,\n }: {\n registrationId: string;\n token: OAuth2Token | OidcToken;\n }) {\n const { provider } = this.getClientConfig(registrationId);\n return provider.getUserInfo(token);\n }\n\n async refreshAccessToken({\n registrationId,\n refreshToken,\n }: {\n registrationId: string;\n refreshToken: string;\n }): Promise<OAuth2Token> {\n const { provider, registration } = this.getClientConfig(registrationId);\n const { clientId, clientSecret } = registration;\n\n invariant(provider.refreshAccessToken, 'Provider does not support refreshAccessToken');\n return provider.refreshAccessToken({ refreshToken, clientId, clientSecret });\n }\n\n async revokeToken(registrationId: string, token: string) {\n const { provider, registration } = this.getClientConfig(registrationId);\n const { clientId, clientSecret } = registration;\n\n invariant(provider.revokeToken, 'Provider does not support revokeToken');\n await provider.revokeToken({ token, clientId, clientSecret });\n }\n\n async loginOAuth2Native({\n registrationId,\n credentials,\n pkce,\n }: {\n registrationId: string;\n credentials: NativeCredentials;\n pkce?: PkceParameters;\n }) {\n const { provider, registration } = this.getClientConfig(registrationId);\n invariant(provider.loginOAuth2Native, 'Provider does not support loginOAuth2Native');\n const { baseUri } = this.config;\n const { clientId, clientSecret, redirectUri } = registration;\n\n return provider.loginOAuth2Native({\n clientId,\n clientSecret,\n redirectUri: redirectUri ?? `${baseUri}/login/oauth2/code/${registrationId}`,\n credentials,\n pkce,\n });\n }\n}\n"],"mappings":"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","names":["invariant"]}
|
package/dist/oauth2/client.d.cts
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import { OAuth2ClientConfig, Registration, Provider, OAuth2Token, UserInfo } from './types.cjs';
|
|
1
|
+
import { OAuth2ClientConfig, Registration, Provider, PkceParameters, OAuth2Token, OidcToken, UserInfo, NativeCredentials } from './types.cjs';
|
|
2
2
|
import { z } from 'zod';
|
|
3
3
|
|
|
4
4
|
declare const oauth2RedirectQuerySchema: z.ZodObject<{
|
|
5
|
-
code: z.ZodString
|
|
6
|
-
state: z.ZodString
|
|
5
|
+
code: z.ZodOptional<z.ZodString>;
|
|
6
|
+
state: z.ZodOptional<z.ZodString>;
|
|
7
7
|
error: z.ZodOptional<z.ZodString>;
|
|
8
8
|
error_description: z.ZodOptional<z.ZodString>;
|
|
9
9
|
error_uri: z.ZodOptional<z.ZodString>;
|
|
10
10
|
}, "strip", z.ZodTypeAny, {
|
|
11
|
-
code
|
|
12
|
-
state
|
|
11
|
+
code?: string | undefined;
|
|
12
|
+
state?: string | undefined;
|
|
13
13
|
error?: string | undefined;
|
|
14
14
|
error_description?: string | undefined;
|
|
15
15
|
error_uri?: string | undefined;
|
|
16
16
|
}, {
|
|
17
|
-
code
|
|
18
|
-
state
|
|
17
|
+
code?: string | undefined;
|
|
18
|
+
state?: string | undefined;
|
|
19
19
|
error?: string | undefined;
|
|
20
20
|
error_description?: string | undefined;
|
|
21
21
|
error_uri?: string | undefined;
|
|
@@ -24,16 +24,39 @@ declare class OAuth2Client {
|
|
|
24
24
|
private config;
|
|
25
25
|
constructor(config: OAuth2ClientConfig);
|
|
26
26
|
get baseUri(): string;
|
|
27
|
+
get successUri(): string;
|
|
27
28
|
get errorUri(): string;
|
|
28
29
|
getClientConfig(registrationId: string): {
|
|
29
30
|
registration: Registration;
|
|
30
|
-
provider: Provider
|
|
31
|
+
provider: Provider;
|
|
31
32
|
};
|
|
32
|
-
createAuthorizationUri(registrationId
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
createAuthorizationUri({ registrationId, state, pkce, }: {
|
|
34
|
+
registrationId: string;
|
|
35
|
+
state: string;
|
|
36
|
+
pkce?: PkceParameters;
|
|
37
|
+
}): URL;
|
|
38
|
+
exchangeAuthorizationCode({ registrationId, code, pkce, }: {
|
|
39
|
+
registrationId: string;
|
|
40
|
+
code: string;
|
|
41
|
+
pkce?: PkceParameters;
|
|
42
|
+
}): Promise<OAuth2Token>;
|
|
43
|
+
getUserInfo({ registrationId, token, }: {
|
|
44
|
+
registrationId: string;
|
|
45
|
+
token: OAuth2Token | OidcToken;
|
|
46
|
+
}): Promise<UserInfo<unknown>>;
|
|
47
|
+
refreshAccessToken({ registrationId, refreshToken, }: {
|
|
48
|
+
registrationId: string;
|
|
49
|
+
refreshToken: string;
|
|
50
|
+
}): Promise<OAuth2Token>;
|
|
36
51
|
revokeToken(registrationId: string, token: string): Promise<void>;
|
|
52
|
+
loginOAuth2Native({ registrationId, credentials, pkce, }: {
|
|
53
|
+
registrationId: string;
|
|
54
|
+
credentials: NativeCredentials;
|
|
55
|
+
pkce?: PkceParameters;
|
|
56
|
+
}): Promise<{
|
|
57
|
+
token: OAuth2Token;
|
|
58
|
+
userInfo: UserInfo;
|
|
59
|
+
}>;
|
|
37
60
|
}
|
|
38
61
|
|
|
39
62
|
export { OAuth2Client, oauth2RedirectQuerySchema };
|
package/dist/oauth2/client.d.ts
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import { OAuth2ClientConfig, Registration, Provider, OAuth2Token, UserInfo } from './types.js';
|
|
1
|
+
import { OAuth2ClientConfig, Registration, Provider, PkceParameters, OAuth2Token, OidcToken, UserInfo, NativeCredentials } from './types.js';
|
|
2
2
|
import { z } from 'zod';
|
|
3
3
|
|
|
4
4
|
declare const oauth2RedirectQuerySchema: z.ZodObject<{
|
|
5
|
-
code: z.ZodString
|
|
6
|
-
state: z.ZodString
|
|
5
|
+
code: z.ZodOptional<z.ZodString>;
|
|
6
|
+
state: z.ZodOptional<z.ZodString>;
|
|
7
7
|
error: z.ZodOptional<z.ZodString>;
|
|
8
8
|
error_description: z.ZodOptional<z.ZodString>;
|
|
9
9
|
error_uri: z.ZodOptional<z.ZodString>;
|
|
10
10
|
}, "strip", z.ZodTypeAny, {
|
|
11
|
-
code
|
|
12
|
-
state
|
|
11
|
+
code?: string | undefined;
|
|
12
|
+
state?: string | undefined;
|
|
13
13
|
error?: string | undefined;
|
|
14
14
|
error_description?: string | undefined;
|
|
15
15
|
error_uri?: string | undefined;
|
|
16
16
|
}, {
|
|
17
|
-
code
|
|
18
|
-
state
|
|
17
|
+
code?: string | undefined;
|
|
18
|
+
state?: string | undefined;
|
|
19
19
|
error?: string | undefined;
|
|
20
20
|
error_description?: string | undefined;
|
|
21
21
|
error_uri?: string | undefined;
|
|
@@ -24,16 +24,39 @@ declare class OAuth2Client {
|
|
|
24
24
|
private config;
|
|
25
25
|
constructor(config: OAuth2ClientConfig);
|
|
26
26
|
get baseUri(): string;
|
|
27
|
+
get successUri(): string;
|
|
27
28
|
get errorUri(): string;
|
|
28
29
|
getClientConfig(registrationId: string): {
|
|
29
30
|
registration: Registration;
|
|
30
|
-
provider: Provider
|
|
31
|
+
provider: Provider;
|
|
31
32
|
};
|
|
32
|
-
createAuthorizationUri(registrationId
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
createAuthorizationUri({ registrationId, state, pkce, }: {
|
|
34
|
+
registrationId: string;
|
|
35
|
+
state: string;
|
|
36
|
+
pkce?: PkceParameters;
|
|
37
|
+
}): URL;
|
|
38
|
+
exchangeAuthorizationCode({ registrationId, code, pkce, }: {
|
|
39
|
+
registrationId: string;
|
|
40
|
+
code: string;
|
|
41
|
+
pkce?: PkceParameters;
|
|
42
|
+
}): Promise<OAuth2Token>;
|
|
43
|
+
getUserInfo({ registrationId, token, }: {
|
|
44
|
+
registrationId: string;
|
|
45
|
+
token: OAuth2Token | OidcToken;
|
|
46
|
+
}): Promise<UserInfo<unknown>>;
|
|
47
|
+
refreshAccessToken({ registrationId, refreshToken, }: {
|
|
48
|
+
registrationId: string;
|
|
49
|
+
refreshToken: string;
|
|
50
|
+
}): Promise<OAuth2Token>;
|
|
36
51
|
revokeToken(registrationId: string, token: string): Promise<void>;
|
|
52
|
+
loginOAuth2Native({ registrationId, credentials, pkce, }: {
|
|
53
|
+
registrationId: string;
|
|
54
|
+
credentials: NativeCredentials;
|
|
55
|
+
pkce?: PkceParameters;
|
|
56
|
+
}): Promise<{
|
|
57
|
+
token: OAuth2Token;
|
|
58
|
+
userInfo: UserInfo;
|
|
59
|
+
}>;
|
|
37
60
|
}
|
|
38
61
|
|
|
39
62
|
export { OAuth2Client, oauth2RedirectQuerySchema };
|
package/dist/oauth2/client.mjs
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
import invariant from "tiny-invariant";
|
|
4
4
|
var oauth2RedirectQuerySchema = z.object({
|
|
5
|
-
code: z.string(),
|
|
6
|
-
state: z.string(),
|
|
5
|
+
code: z.string().optional(),
|
|
6
|
+
state: z.string().optional(),
|
|
7
7
|
error: z.string().optional(),
|
|
8
8
|
error_description: z.string().optional(),
|
|
9
9
|
error_uri: z.string().optional()
|
|
@@ -16,6 +16,9 @@ var OAuth2Client = class {
|
|
|
16
16
|
get baseUri() {
|
|
17
17
|
return this.config.baseUri;
|
|
18
18
|
}
|
|
19
|
+
get successUri() {
|
|
20
|
+
return this.config.successUri;
|
|
21
|
+
}
|
|
19
22
|
get errorUri() {
|
|
20
23
|
return this.config.errorUri;
|
|
21
24
|
}
|
|
@@ -26,35 +29,49 @@ var OAuth2Client = class {
|
|
|
26
29
|
invariant(provider, `Provider ${registration.provider ?? registrationId} not found`);
|
|
27
30
|
return { registration, provider };
|
|
28
31
|
}
|
|
29
|
-
createAuthorizationUri(
|
|
32
|
+
createAuthorizationUri({
|
|
33
|
+
registrationId,
|
|
34
|
+
state,
|
|
35
|
+
pkce
|
|
36
|
+
}) {
|
|
30
37
|
const { provider, registration } = this.getClientConfig(registrationId);
|
|
31
38
|
const { baseUri } = this.config;
|
|
32
39
|
const { scope, clientId, redirectUri } = registration;
|
|
33
40
|
return provider.createAuthorizationUri({
|
|
41
|
+
pkce,
|
|
34
42
|
state,
|
|
35
43
|
scope,
|
|
36
44
|
clientId,
|
|
37
|
-
codeVerifier,
|
|
38
45
|
redirectUri: redirectUri ?? `${baseUri}/login/oauth2/code/${registrationId}`
|
|
39
46
|
});
|
|
40
47
|
}
|
|
41
|
-
async exchangeAuthorizationCode(
|
|
48
|
+
async exchangeAuthorizationCode({
|
|
49
|
+
registrationId,
|
|
50
|
+
code,
|
|
51
|
+
pkce
|
|
52
|
+
}) {
|
|
42
53
|
const { provider, registration } = this.getClientConfig(registrationId);
|
|
43
54
|
const { baseUri } = this.config;
|
|
44
55
|
const { clientId, clientSecret, redirectUri } = registration;
|
|
45
56
|
return provider.exchangeAuthorizationCode({
|
|
46
57
|
code,
|
|
47
|
-
|
|
58
|
+
pkce,
|
|
48
59
|
clientId,
|
|
49
60
|
clientSecret,
|
|
50
61
|
redirectUri: redirectUri ?? `${baseUri}/login/oauth2/code/${registrationId}`
|
|
51
62
|
});
|
|
52
63
|
}
|
|
53
|
-
async getUserInfo(
|
|
64
|
+
async getUserInfo({
|
|
65
|
+
registrationId,
|
|
66
|
+
token
|
|
67
|
+
}) {
|
|
54
68
|
const { provider } = this.getClientConfig(registrationId);
|
|
55
69
|
return provider.getUserInfo(token);
|
|
56
70
|
}
|
|
57
|
-
async refreshAccessToken(
|
|
71
|
+
async refreshAccessToken({
|
|
72
|
+
registrationId,
|
|
73
|
+
refreshToken
|
|
74
|
+
}) {
|
|
58
75
|
const { provider, registration } = this.getClientConfig(registrationId);
|
|
59
76
|
const { clientId, clientSecret } = registration;
|
|
60
77
|
invariant(provider.refreshAccessToken, "Provider does not support refreshAccessToken");
|
|
@@ -66,6 +83,23 @@ var OAuth2Client = class {
|
|
|
66
83
|
invariant(provider.revokeToken, "Provider does not support revokeToken");
|
|
67
84
|
await provider.revokeToken({ token, clientId, clientSecret });
|
|
68
85
|
}
|
|
86
|
+
async loginOAuth2Native({
|
|
87
|
+
registrationId,
|
|
88
|
+
credentials,
|
|
89
|
+
pkce
|
|
90
|
+
}) {
|
|
91
|
+
const { provider, registration } = this.getClientConfig(registrationId);
|
|
92
|
+
invariant(provider.loginOAuth2Native, "Provider does not support loginOAuth2Native");
|
|
93
|
+
const { baseUri } = this.config;
|
|
94
|
+
const { clientId, clientSecret, redirectUri } = registration;
|
|
95
|
+
return provider.loginOAuth2Native({
|
|
96
|
+
clientId,
|
|
97
|
+
clientSecret,
|
|
98
|
+
redirectUri: redirectUri ?? `${baseUri}/login/oauth2/code/${registrationId}`,
|
|
99
|
+
credentials,
|
|
100
|
+
pkce
|
|
101
|
+
});
|
|
102
|
+
}
|
|
69
103
|
};
|
|
70
104
|
export {
|
|
71
105
|
OAuth2Client,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/oauth2/client.ts"],"sourcesContent":["import { z } from 'zod';\nimport invariant from 'tiny-invariant';\nimport {
|
|
1
|
+
{"version":3,"sources":["../../src/oauth2/client.ts"],"sourcesContent":["import { z } from 'zod';\nimport invariant from 'tiny-invariant';\nimport {\n NativeCredentials,\n OAuth2ClientConfig,\n OAuth2Token,\n OidcToken,\n PkceParameters,\n} from './types';\n\nexport const oauth2RedirectQuerySchema = z.object({\n code: z.string().optional(),\n state: z.string().optional(),\n error: z.string().optional(),\n error_description: z.string().optional(),\n error_uri: z.string().optional(),\n});\n\nexport class OAuth2Client {\n private config: OAuth2ClientConfig;\n constructor(config: OAuth2ClientConfig) {\n this.config = config;\n }\n\n get baseUri() {\n return this.config.baseUri;\n }\n\n get successUri() {\n return this.config.successUri;\n }\n\n get errorUri() {\n return this.config.errorUri;\n }\n\n getClientConfig(registrationId: string) {\n const registration = this.config.registration[registrationId];\n invariant(registration, `Registration ${registrationId} not found`);\n const provider = this.config.provider[registration.provider ?? registrationId];\n invariant(provider, `Provider ${registration.provider ?? registrationId} not found`);\n return { registration, provider };\n }\n\n createAuthorizationUri({\n registrationId,\n state,\n pkce,\n }: {\n registrationId: string;\n state: string;\n pkce?: PkceParameters;\n }): URL {\n const { provider, registration } = this.getClientConfig(registrationId);\n\n const { baseUri } = this.config;\n const { scope, clientId, redirectUri } = registration;\n return provider.createAuthorizationUri({\n pkce,\n state,\n scope,\n clientId,\n redirectUri: redirectUri ?? `${baseUri}/login/oauth2/code/${registrationId}`,\n });\n }\n\n async exchangeAuthorizationCode({\n registrationId,\n code,\n pkce,\n }: {\n registrationId: string;\n code: string;\n pkce?: PkceParameters;\n }): Promise<OAuth2Token> {\n const { provider, registration } = this.getClientConfig(registrationId);\n\n const { baseUri } = this.config;\n const { clientId, clientSecret, redirectUri } = registration;\n return provider.exchangeAuthorizationCode({\n code,\n pkce,\n clientId,\n clientSecret,\n redirectUri: redirectUri ?? `${baseUri}/login/oauth2/code/${registrationId}`,\n });\n }\n\n async getUserInfo({\n registrationId,\n token,\n }: {\n registrationId: string;\n token: OAuth2Token | OidcToken;\n }) {\n const { provider } = this.getClientConfig(registrationId);\n return provider.getUserInfo(token);\n }\n\n async refreshAccessToken({\n registrationId,\n refreshToken,\n }: {\n registrationId: string;\n refreshToken: string;\n }): Promise<OAuth2Token> {\n const { provider, registration } = this.getClientConfig(registrationId);\n const { clientId, clientSecret } = registration;\n\n invariant(provider.refreshAccessToken, 'Provider does not support refreshAccessToken');\n return provider.refreshAccessToken({ refreshToken, clientId, clientSecret });\n }\n\n async revokeToken(registrationId: string, token: string) {\n const { provider, registration } = this.getClientConfig(registrationId);\n const { clientId, clientSecret } = registration;\n\n invariant(provider.revokeToken, 'Provider does not support revokeToken');\n await provider.revokeToken({ token, clientId, clientSecret });\n }\n\n async loginOAuth2Native({\n registrationId,\n credentials,\n pkce,\n }: {\n registrationId: string;\n credentials: NativeCredentials;\n pkce?: PkceParameters;\n }) {\n const { provider, registration } = this.getClientConfig(registrationId);\n invariant(provider.loginOAuth2Native, 'Provider does not support loginOAuth2Native');\n const { baseUri } = this.config;\n const { clientId, clientSecret, redirectUri } = registration;\n\n return provider.loginOAuth2Native({\n clientId,\n clientSecret,\n redirectUri: redirectUri ?? `${baseUri}/login/oauth2/code/${registrationId}`,\n credentials,\n pkce,\n });\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/oauth2/error.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../src/oauth2/error.ts"],"sourcesContent":["// reference: https://datatracker.ietf.org/doc/html/rfc6749#section-4.2.2.1\nexport type OAuth2ErrorType =\n | 'invalid_request' // 400\n | 'invalid_client' // 401\n | 'invalid_grant' // 400\n | 'invalid_token' // 401\n | 'invalid_scope' // 400\n | 'unauthorized_client' // 401\n | 'unsupported_grant_type' // 400\n | 'unsupported_response_type' // 400\n | 'insufficient_scope' // 403\n | 'redirect_uri_mismatch' // 400\n | 'access_denied' // 400\n | 'server_error' // 500\n | 'temporarily_unavailable' // 503\n | (string & {});\n\nexport class OAuth2Error extends Error {\n readonly status: number;\n readonly error: OAuth2ErrorType;\n\n constructor(status: number, error: OAuth2ErrorType, message?: string) {\n super(message ?? `OAuth2 error: ${error}`);\n this.status = status;\n this.error = error;\n if ((Error as any).captureStackTrace) {\n (Error as any).captureStackTrace(this, OAuth2Error);\n }\n Object.setPrototypeOf(this, OAuth2Error.prototype);\n }\n}\n\nexport class AuthenticationError extends Error {\n constructor(message: string) {\n super(message);\n if ((Error as any).captureStackTrace) {\n (Error as any).captureStackTrace(this, AuthenticationError);\n }\n Object.setPrototypeOf(this, AuthenticationError.prototype);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBO,IAAM,cAAN,MAAM,qBAAoB,MAAM;AAAA,EAC5B;AAAA,EACA;AAAA,EAET,YAAY,QAAgB,OAAwB,SAAkB;AACpE,UAAM,WAAW,iBAAiB,KAAK,EAAE;AACzC,SAAK,SAAS;AACd,SAAK,QAAQ;AACb,QAAK,MAAc,mBAAmB;AACpC,MAAC,MAAc,kBAAkB,MAAM,YAAW;AAAA,IACpD;AACA,WAAO,eAAe,MAAM,aAAY,SAAS;AAAA,EACnD;AACF;AAEO,IAAM,sBAAN,MAAM,6BAA4B,MAAM;AAAA,EAC7C,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,QAAK,MAAc,mBAAmB;AACpC,MAAC,MAAc,kBAAkB,MAAM,oBAAmB;AAAA,IAC5D;AACA,WAAO,eAAe,MAAM,qBAAoB,SAAS;AAAA,EAC3D;AACF;","names":[]}
|
package/dist/oauth2/error.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
type OAuth2ErrorType = 'invalid_request' | 'invalid_client' | 'invalid_grant' | 'invalid_token' | 'invalid_scope' | 'unauthorized_client' | 'unsupported_grant_type' | 'unsupported_response_type' | 'insufficient_scope' | 'redirect_uri_mismatch' | 'access_denied' | 'server_error' | string;
|
|
1
|
+
type OAuth2ErrorType = 'invalid_request' | 'invalid_client' | 'invalid_grant' | 'invalid_token' | 'invalid_scope' | 'unauthorized_client' | 'unsupported_grant_type' | 'unsupported_response_type' | 'insufficient_scope' | 'redirect_uri_mismatch' | 'access_denied' | 'server_error' | 'temporarily_unavailable' | (string & {});
|
|
2
2
|
declare class OAuth2Error extends Error {
|
|
3
3
|
readonly status: number;
|
|
4
4
|
readonly error: OAuth2ErrorType;
|
package/dist/oauth2/error.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
type OAuth2ErrorType = 'invalid_request' | 'invalid_client' | 'invalid_grant' | 'invalid_token' | 'invalid_scope' | 'unauthorized_client' | 'unsupported_grant_type' | 'unsupported_response_type' | 'insufficient_scope' | 'redirect_uri_mismatch' | 'access_denied' | 'server_error' | string;
|
|
1
|
+
type OAuth2ErrorType = 'invalid_request' | 'invalid_client' | 'invalid_grant' | 'invalid_token' | 'invalid_scope' | 'unauthorized_client' | 'unsupported_grant_type' | 'unsupported_response_type' | 'insufficient_scope' | 'redirect_uri_mismatch' | 'access_denied' | 'server_error' | 'temporarily_unavailable' | (string & {});
|
|
2
2
|
declare class OAuth2Error extends Error {
|
|
3
3
|
readonly status: number;
|
|
4
4
|
readonly error: OAuth2ErrorType;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/oauth2/error.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../src/oauth2/error.ts"],"sourcesContent":["// reference: https://datatracker.ietf.org/doc/html/rfc6749#section-4.2.2.1\nexport type OAuth2ErrorType =\n | 'invalid_request' // 400\n | 'invalid_client' // 401\n | 'invalid_grant' // 400\n | 'invalid_token' // 401\n | 'invalid_scope' // 400\n | 'unauthorized_client' // 401\n | 'unsupported_grant_type' // 400\n | 'unsupported_response_type' // 400\n | 'insufficient_scope' // 403\n | 'redirect_uri_mismatch' // 400\n | 'access_denied' // 400\n | 'server_error' // 500\n | 'temporarily_unavailable' // 503\n | (string & {});\n\nexport class OAuth2Error extends Error {\n readonly status: number;\n readonly error: OAuth2ErrorType;\n\n constructor(status: number, error: OAuth2ErrorType, message?: string) {\n super(message ?? `OAuth2 error: ${error}`);\n this.status = status;\n this.error = error;\n if ((Error as any).captureStackTrace) {\n (Error as any).captureStackTrace(this, OAuth2Error);\n }\n Object.setPrototypeOf(this, OAuth2Error.prototype);\n }\n}\n\nexport class AuthenticationError extends Error {\n constructor(message: string) {\n super(message);\n if ((Error as any).captureStackTrace) {\n (Error as any).captureStackTrace(this, AuthenticationError);\n }\n Object.setPrototypeOf(this, AuthenticationError.prototype);\n }\n}\n"],"mappings":";AAiBO,IAAM,cAAN,MAAM,qBAAoB,MAAM;AAAA,EAC5B;AAAA,EACA;AAAA,EAET,YAAY,QAAgB,OAAwB,SAAkB;AACpE,UAAM,WAAW,iBAAiB,KAAK,EAAE;AACzC,SAAK,SAAS;AACd,SAAK,QAAQ;AACb,QAAK,MAAc,mBAAmB;AACpC,MAAC,MAAc,kBAAkB,MAAM,YAAW;AAAA,IACpD;AACA,WAAO,eAAe,MAAM,aAAY,SAAS;AAAA,EACnD;AACF;AAEO,IAAM,sBAAN,MAAM,6BAA4B,MAAM;AAAA,EAC7C,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,QAAK,MAAc,mBAAmB;AACpC,MAAC,MAAc,kBAAkB,MAAM,oBAAmB;AAAA,IAC5D;AACA,WAAO,eAAe,MAAM,qBAAoB,SAAS;AAAA,EAC3D;AACF;","names":[]}
|
|
@@ -30,13 +30,14 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
30
30
|
// src/oauth2/provider/apple.ts
|
|
31
31
|
var apple_exports = {};
|
|
32
32
|
__export(apple_exports, {
|
|
33
|
-
apple: () => apple
|
|
33
|
+
apple: () => apple,
|
|
34
|
+
createAppleProvider: () => createAppleProvider
|
|
34
35
|
});
|
|
35
36
|
module.exports = __toCommonJS(apple_exports);
|
|
36
37
|
var import_tiny_invariant = __toESM(require("tiny-invariant"), 1);
|
|
37
38
|
var import_error = require("../error.cjs");
|
|
38
39
|
var import_common = require("./common.cjs");
|
|
39
|
-
function
|
|
40
|
+
function createAppleProvider() {
|
|
40
41
|
return {
|
|
41
42
|
// important notice: response_mode=form_post is required for apple
|
|
42
43
|
authorizationUri: "https://appleid.apple.com/auth/authorize?response_mode=form_post",
|
|
@@ -44,14 +45,14 @@ function apple() {
|
|
|
44
45
|
jwkSetUri: "https://appleid.apple.com/auth/keys",
|
|
45
46
|
userNameAttribute: "sub",
|
|
46
47
|
defaultScope: ["openid", "name", "email"],
|
|
47
|
-
createAuthorizationUri({
|
|
48
|
+
createAuthorizationUri({ pkce, ...params }) {
|
|
48
49
|
return (0, import_common.createAuthorizationUri)({
|
|
49
50
|
...params,
|
|
50
51
|
scope: params.scope ?? this.defaultScope,
|
|
51
52
|
authorizationUri: this.authorizationUri
|
|
52
53
|
});
|
|
53
54
|
},
|
|
54
|
-
async exchangeAuthorizationCode({
|
|
55
|
+
async exchangeAuthorizationCode({ pkce, ...params }) {
|
|
55
56
|
const response = await (0, import_common.exchangeAuthorizationCode)({ ...params, tokenUri: this.tokenUri });
|
|
56
57
|
if (!response.ok) {
|
|
57
58
|
const { error } = await response.json();
|
|
@@ -75,11 +76,26 @@ function apple() {
|
|
|
75
76
|
family_name: data.user?.name.lastName
|
|
76
77
|
}
|
|
77
78
|
};
|
|
79
|
+
},
|
|
80
|
+
async loginOAuth2Native({ pkce, credentials, ...params }) {
|
|
81
|
+
(0, import_tiny_invariant.default)(credentials.code, "code is required");
|
|
82
|
+
const { tokenUri } = this;
|
|
83
|
+
const { code } = credentials;
|
|
84
|
+
const response = await (0, import_common.exchangeAuthorizationCode)({ code, tokenUri, ...params });
|
|
85
|
+
if (!response.ok) {
|
|
86
|
+
const { error } = await response.json();
|
|
87
|
+
throw new import_error.OAuth2Error(response.status, error);
|
|
88
|
+
}
|
|
89
|
+
const token = await response.json();
|
|
90
|
+
const userInfo = await this.getUserInfo(token);
|
|
91
|
+
return { token, userInfo };
|
|
78
92
|
}
|
|
79
93
|
};
|
|
80
94
|
}
|
|
95
|
+
var apple = createAppleProvider();
|
|
81
96
|
// Annotate the CommonJS export names for ESM import in node:
|
|
82
97
|
0 && (module.exports = {
|
|
83
|
-
apple
|
|
98
|
+
apple,
|
|
99
|
+
createAppleProvider
|
|
84
100
|
});
|
|
85
101
|
//# sourceMappingURL=apple.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/oauth2/provider/apple.ts"],"sourcesContent":["import invariant from 'tiny-invariant';\nimport { Provider } from '../types';\nimport { OAuth2Error } from '../error';\nimport { createAuthorizationUri, exchangeAuthorizationCode, verifyIdToken } from './common';\n\n// ref: https://account.apple.com/.well-known/openid-configuration\nexport function
|
|
1
|
+
{"version":3,"sources":["../../../src/oauth2/provider/apple.ts"],"sourcesContent":["import invariant from 'tiny-invariant';\nimport { NativeCredentials, LoginOAuth2NativeParams, OAuth2Token, Provider } from '../types';\nimport { OAuth2Error } from '../error';\nimport { createAuthorizationUri, exchangeAuthorizationCode, verifyIdToken } from './common';\n\n// ref: https://account.apple.com/.well-known/openid-configuration\nexport function createAppleProvider(): Provider {\n return {\n // important notice: response_mode=form_post is required for apple\n authorizationUri: 'https://appleid.apple.com/auth/authorize?response_mode=form_post',\n tokenUri: 'https://appleid.apple.com/auth/token',\n jwkSetUri: 'https://appleid.apple.com/auth/keys',\n userNameAttribute: 'sub',\n defaultScope: ['openid', 'name', 'email'],\n createAuthorizationUri({ pkce, ...params }) {\n return createAuthorizationUri({\n ...params,\n scope: params.scope ?? this.defaultScope,\n authorizationUri: this.authorizationUri,\n });\n },\n async exchangeAuthorizationCode({ pkce, ...params }) {\n const response = await exchangeAuthorizationCode({ ...params, tokenUri: this.tokenUri });\n if (!response.ok) {\n const { error } = (await response.json()) as AppleErrorResponse;\n throw new OAuth2Error(response.status, error);\n }\n return (await response.json()) as AppleToken;\n },\n async getUserInfo({ id_token }) {\n invariant(id_token, 'id_token is required');\n invariant(this.jwkSetUri, 'jwkSetUri is required');\n const data = await verifyIdToken<AppleUserInfo>(id_token, this.jwkSetUri);\n return {\n data,\n claims: {\n sub: data.sub,\n name: data.name,\n email: data.email,\n email_verified: true,\n picture: data.picture,\n given_name: data.user?.name.firstName,\n family_name: data.user?.name.lastName,\n },\n };\n },\n async loginOAuth2Native({ pkce, credentials, ...params }: LoginOAuth2NativeParams) {\n invariant(credentials.code, 'code is required');\n const { tokenUri } = this;\n const { code } = credentials;\n const response = await exchangeAuthorizationCode({ code, tokenUri, ...params });\n if (!response.ok) {\n const { error } = (await response.json()) as AppleErrorResponse;\n throw new OAuth2Error(response.status, error);\n }\n const token = (await response.json()) as AppleToken;\n const userInfo = await this.getUserInfo(token);\n return { token, userInfo };\n },\n };\n}\n\nexport const apple = createAppleProvider();\n\n// https://developer.apple.com/documentation/sign_in_with_apple/authenticating-users-with-sign-in-with-apple\nexport interface AppleUserInfo {\n sub: string;\n email: string;\n email_verified: true | 'true';\n is_private_email: boolean;\n real_user_status: number;\n name: string;\n picture: string;\n user?: {\n name: { firstName: string; lastName: string };\n email: string;\n };\n}\n\n// https://developer.apple.com/documentation/devicemanagement/implementing-the-oauth2-authentication-user-enrollment-flow\n// https://developer.apple.com/documentation/sign_in_with_apple/generate_and_validate_tokens\nexport interface AppleToken extends OAuth2Token {\n access_token: string;\n token_type: string;\n expires_in: number;\n refresh_token: string;\n id_token: string;\n}\n\nexport interface AppleNativeCredentials extends NativeCredentials {\n state: string;\n code: string;\n id_token: string;\n // no standard fields\n user: string;\n email?: string;\n}\n\n// https://developer.apple.com/documentation/sign_in_with_apple/errorresponse\nexport interface AppleErrorResponse {\n error:\n | 'invalid_request'\n | 'invalid_client'\n | 'invalid_grant'\n | 'unauthorized_client'\n | 'unsupported_grant_type'\n | 'invalid_scope';\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAAsB;AAEtB,mBAA4B;AAC5B,oBAAiF;AAG1E,SAAS,sBAAgC;AAC9C,SAAO;AAAA;AAAA,IAEL,kBAAkB;AAAA,IAClB,UAAU;AAAA,IACV,WAAW;AAAA,IACX,mBAAmB;AAAA,IACnB,cAAc,CAAC,UAAU,QAAQ,OAAO;AAAA,IACxC,uBAAuB,EAAE,MAAM,GAAG,OAAO,GAAG;AAC1C,iBAAO,sCAAuB;AAAA,QAC5B,GAAG;AAAA,QACH,OAAO,OAAO,SAAS,KAAK;AAAA,QAC5B,kBAAkB,KAAK;AAAA,MACzB,CAAC;AAAA,IACH;AAAA,IACA,MAAM,0BAA0B,EAAE,MAAM,GAAG,OAAO,GAAG;AACnD,YAAM,WAAW,UAAM,yCAA0B,EAAE,GAAG,QAAQ,UAAU,KAAK,SAAS,CAAC;AACvF,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,EAAE,MAAM,IAAK,MAAM,SAAS,KAAK;AACvC,cAAM,IAAI,yBAAY,SAAS,QAAQ,KAAK;AAAA,MAC9C;AACA,aAAQ,MAAM,SAAS,KAAK;AAAA,IAC9B;AAAA,IACA,MAAM,YAAY,EAAE,SAAS,GAAG;AAC9B,gCAAAA,SAAU,UAAU,sBAAsB;AAC1C,gCAAAA,SAAU,KAAK,WAAW,uBAAuB;AACjD,YAAM,OAAO,UAAM,6BAA6B,UAAU,KAAK,SAAS;AACxE,aAAO;AAAA,QACL;AAAA,QACA,QAAQ;AAAA,UACN,KAAK,KAAK;AAAA,UACV,MAAM,KAAK;AAAA,UACX,OAAO,KAAK;AAAA,UACZ,gBAAgB;AAAA,UAChB,SAAS,KAAK;AAAA,UACd,YAAY,KAAK,MAAM,KAAK;AAAA,UAC5B,aAAa,KAAK,MAAM,KAAK;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAAA,IACA,MAAM,kBAAkB,EAAE,MAAM,aAAa,GAAG,OAAO,GAA4B;AACjF,gCAAAA,SAAU,YAAY,MAAM,kBAAkB;AAC9C,YAAM,EAAE,SAAS,IAAI;AACrB,YAAM,EAAE,KAAK,IAAI;AACjB,YAAM,WAAW,UAAM,yCAA0B,EAAE,MAAM,UAAU,GAAG,OAAO,CAAC;AAC9E,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,EAAE,MAAM,IAAK,MAAM,SAAS,KAAK;AACvC,cAAM,IAAI,yBAAY,SAAS,QAAQ,KAAK;AAAA,MAC9C;AACA,YAAM,QAAS,MAAM,SAAS,KAAK;AACnC,YAAM,WAAW,MAAM,KAAK,YAAY,KAAK;AAC7C,aAAO,EAAE,OAAO,SAAS;AAAA,IAC3B;AAAA,EACF;AACF;AAEO,IAAM,QAAQ,oBAAoB;","names":["invariant"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { Provider } from '../types.cjs';
|
|
1
|
+
import { Provider, OAuth2Token, NativeCredentials } from '../types.cjs';
|
|
2
2
|
|
|
3
|
-
declare function
|
|
3
|
+
declare function createAppleProvider(): Provider;
|
|
4
|
+
declare const apple: Provider;
|
|
4
5
|
interface AppleUserInfo {
|
|
5
6
|
sub: string;
|
|
6
7
|
email: string;
|
|
@@ -17,15 +18,22 @@ interface AppleUserInfo {
|
|
|
17
18
|
email: string;
|
|
18
19
|
};
|
|
19
20
|
}
|
|
20
|
-
interface
|
|
21
|
+
interface AppleToken extends OAuth2Token {
|
|
21
22
|
access_token: string;
|
|
22
23
|
token_type: string;
|
|
23
24
|
expires_in: number;
|
|
24
25
|
refresh_token: string;
|
|
25
26
|
id_token: string;
|
|
26
27
|
}
|
|
28
|
+
interface AppleNativeCredentials extends NativeCredentials {
|
|
29
|
+
state: string;
|
|
30
|
+
code: string;
|
|
31
|
+
id_token: string;
|
|
32
|
+
user: string;
|
|
33
|
+
email?: string;
|
|
34
|
+
}
|
|
27
35
|
interface AppleErrorResponse {
|
|
28
36
|
error: 'invalid_request' | 'invalid_client' | 'invalid_grant' | 'unauthorized_client' | 'unsupported_grant_type' | 'invalid_scope';
|
|
29
37
|
}
|
|
30
38
|
|
|
31
|
-
export { type AppleErrorResponse, type
|
|
39
|
+
export { type AppleErrorResponse, type AppleNativeCredentials, type AppleToken, type AppleUserInfo, apple, createAppleProvider };
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { Provider } from '../types.js';
|
|
1
|
+
import { Provider, OAuth2Token, NativeCredentials } from '../types.js';
|
|
2
2
|
|
|
3
|
-
declare function
|
|
3
|
+
declare function createAppleProvider(): Provider;
|
|
4
|
+
declare const apple: Provider;
|
|
4
5
|
interface AppleUserInfo {
|
|
5
6
|
sub: string;
|
|
6
7
|
email: string;
|
|
@@ -17,15 +18,22 @@ interface AppleUserInfo {
|
|
|
17
18
|
email: string;
|
|
18
19
|
};
|
|
19
20
|
}
|
|
20
|
-
interface
|
|
21
|
+
interface AppleToken extends OAuth2Token {
|
|
21
22
|
access_token: string;
|
|
22
23
|
token_type: string;
|
|
23
24
|
expires_in: number;
|
|
24
25
|
refresh_token: string;
|
|
25
26
|
id_token: string;
|
|
26
27
|
}
|
|
28
|
+
interface AppleNativeCredentials extends NativeCredentials {
|
|
29
|
+
state: string;
|
|
30
|
+
code: string;
|
|
31
|
+
id_token: string;
|
|
32
|
+
user: string;
|
|
33
|
+
email?: string;
|
|
34
|
+
}
|
|
27
35
|
interface AppleErrorResponse {
|
|
28
36
|
error: 'invalid_request' | 'invalid_client' | 'invalid_grant' | 'unauthorized_client' | 'unsupported_grant_type' | 'invalid_scope';
|
|
29
37
|
}
|
|
30
38
|
|
|
31
|
-
export { type AppleErrorResponse, type
|
|
39
|
+
export { type AppleErrorResponse, type AppleNativeCredentials, type AppleToken, type AppleUserInfo, apple, createAppleProvider };
|