@aws-amplify/adapter-nextjs 1.1.6 → 1.1.7-s-auth.30d0cd2.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/cjs/auth/createTokenExchangeRouteHandlerFactory.js +52 -0
- package/dist/cjs/auth/createTokenExchangeRouteHandlerFactory.js.map +1 -0
- package/dist/cjs/auth/httpOnlyCookieBasedAuthProviders/createHttpOnlyCookieBasedAuthProviders.js +39 -0
- package/dist/cjs/auth/httpOnlyCookieBasedAuthProviders/createHttpOnlyCookieBasedAuthProviders.js.map +1 -0
- package/dist/cjs/auth/httpOnlyCookieBasedAuthProviders/index.js +8 -0
- package/dist/cjs/auth/httpOnlyCookieBasedAuthProviders/index.js.map +1 -0
- package/dist/cjs/auth/types.js +4 -0
- package/dist/cjs/auth/types.js.map +1 -0
- package/dist/cjs/client/index.js +7 -0
- package/dist/cjs/client/index.js.map +1 -0
- package/dist/cjs/createServerRunner.js +18 -1
- package/dist/cjs/createServerRunner.js.map +1 -1
- package/dist/cjs/oauth/createGetOAuthInitiationRouteFactory.js +22 -0
- package/dist/cjs/oauth/createGetOAuthInitiationRouteFactory.js.map +1 -0
- package/dist/cjs/oauth/createOAuthRouteHandlerFactory.js +55 -0
- package/dist/cjs/oauth/createOAuthRouteHandlerFactory.js.map +1 -0
- package/dist/cjs/oauth/index.js +9 -0
- package/dist/cjs/oauth/index.js.map +1 -0
- package/dist/cjs/oauth/types.js +6 -0
- package/dist/cjs/oauth/types.js.map +1 -0
- package/dist/cjs/oauth/utils/completeOAuthFlow.js +101 -0
- package/dist/cjs/oauth/utils/completeOAuthFlow.js.map +1 -0
- package/dist/cjs/oauth/utils/getRedirectUrl.js +20 -0
- package/dist/cjs/oauth/utils/getRedirectUrl.js.map +1 -0
- package/dist/cjs/oauth/utils/initOAuthFlow.js +70 -0
- package/dist/cjs/oauth/utils/initOAuthFlow.js.map +1 -0
- package/dist/cjs/utils/createRunWithAmplifyServerContext.js +2 -2
- package/dist/cjs/utils/createRunWithAmplifyServerContext.js.map +1 -1
- package/dist/esm/api/createServerRunnerForAPI.d.ts +1 -1
- package/dist/esm/auth/createTokenExchangeRouteHandlerFactory.d.ts +2 -0
- package/dist/esm/auth/createTokenExchangeRouteHandlerFactory.mjs +50 -0
- package/dist/esm/auth/createTokenExchangeRouteHandlerFactory.mjs.map +1 -0
- package/dist/esm/auth/httpOnlyCookieBasedAuthProviders/createHttpOnlyCookieBasedAuthProviders.d.ts +4 -0
- package/dist/esm/auth/httpOnlyCookieBasedAuthProviders/createHttpOnlyCookieBasedAuthProviders.mjs +37 -0
- package/dist/esm/auth/httpOnlyCookieBasedAuthProviders/createHttpOnlyCookieBasedAuthProviders.mjs.map +1 -0
- package/dist/esm/auth/httpOnlyCookieBasedAuthProviders/index.d.ts +2 -0
- package/dist/esm/auth/httpOnlyCookieBasedAuthProviders/index.mjs +3 -0
- package/dist/esm/auth/httpOnlyCookieBasedAuthProviders/index.mjs.map +1 -0
- package/dist/esm/auth/types.d.ts +17 -0
- package/dist/esm/auth/types.mjs +2 -0
- package/dist/esm/auth/types.mjs.map +1 -0
- package/dist/esm/client/index.d.ts +1 -0
- package/dist/esm/client/index.mjs +3 -0
- package/dist/esm/client/index.mjs.map +1 -0
- package/dist/esm/createServerRunner.mjs +18 -1
- package/dist/esm/createServerRunner.mjs.map +1 -1
- package/dist/esm/oauth/createGetOAuthInitiationRouteFactory.d.ts +2 -0
- package/dist/esm/oauth/createGetOAuthInitiationRouteFactory.mjs +20 -0
- package/dist/esm/oauth/createGetOAuthInitiationRouteFactory.mjs.map +1 -0
- package/dist/esm/oauth/createOAuthRouteHandlerFactory.d.ts +2 -0
- package/dist/esm/oauth/createOAuthRouteHandlerFactory.mjs +53 -0
- package/dist/esm/oauth/createOAuthRouteHandlerFactory.mjs.map +1 -0
- package/dist/esm/oauth/index.d.ts +1 -0
- package/dist/esm/oauth/index.mjs +2 -0
- package/dist/esm/oauth/index.mjs.map +1 -0
- package/dist/esm/oauth/types.d.ts +39 -0
- package/dist/esm/oauth/types.mjs +2 -0
- package/dist/esm/oauth/types.mjs.map +1 -0
- package/dist/esm/oauth/utils/completeOAuthFlow.d.ts +12 -0
- package/dist/esm/oauth/utils/completeOAuthFlow.mjs +99 -0
- package/dist/esm/oauth/utils/completeOAuthFlow.mjs.map +1 -0
- package/dist/esm/oauth/utils/getRedirectUrl.d.ts +2 -0
- package/dist/esm/oauth/utils/getRedirectUrl.mjs +18 -0
- package/dist/esm/oauth/utils/getRedirectUrl.mjs.map +1 -0
- package/dist/esm/oauth/utils/initOAuthFlow.d.ts +11 -0
- package/dist/esm/oauth/utils/initOAuthFlow.mjs +68 -0
- package/dist/esm/oauth/utils/initOAuthFlow.mjs.map +1 -0
- package/dist/esm/types/NextServer.d.ts +19 -1
- package/dist/esm/utils/createRunWithAmplifyServerContext.d.ts +2 -1
- package/dist/esm/utils/createRunWithAmplifyServerContext.mjs +2 -2
- package/dist/esm/utils/createRunWithAmplifyServerContext.mjs.map +1 -1
- package/package.json +78 -72
- package/src/api/createServerRunnerForAPI.ts +7 -1
- package/src/auth/createTokenExchangeRouteHandlerFactory.ts +70 -0
- package/src/auth/httpOnlyCookieBasedAuthProviders/createHttpOnlyCookieBasedAuthProviders.ts +57 -0
- package/src/auth/httpOnlyCookieBasedAuthProviders/index.ts +3 -0
- package/src/auth/types.ts +26 -0
- package/src/client/index.ts +1 -0
- package/src/createServerRunner.ts +19 -0
- package/src/oauth/createGetOAuthInitiationRouteFactory.ts +35 -0
- package/src/oauth/createOAuthRouteHandlerFactory.ts +77 -0
- package/src/oauth/index.ts +4 -0
- package/src/oauth/types.ts +60 -0
- package/src/oauth/utils/completeOAuthFlow.ts +176 -0
- package/src/oauth/utils/getRedirectUrl.ts +23 -0
- package/src/oauth/utils/initOAuthFlow.ts +109 -0
- package/src/types/NextServer.ts +27 -1
- package/src/utils/createRunWithAmplifyServerContext.ts +3 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { cookies } from 'next/headers.js';
|
|
2
|
+
import { fetchAuthSession } from 'aws-amplify/auth/server';
|
|
3
|
+
import { createRunWithAmplifyServerContext } from '../utils/createRunWithAmplifyServerContext.mjs';
|
|
4
|
+
|
|
5
|
+
const createTokenExchangeRouteHandlerFactory = input => {
|
|
6
|
+
const runWithAmplifyServerContext = createRunWithAmplifyServerContext(input);
|
|
7
|
+
const handleRequest = async (_, __) => {
|
|
8
|
+
const { origin } = input;
|
|
9
|
+
if (!origin) {
|
|
10
|
+
throw new Error('`origin` parameter is required when using `getOAuthInitiationRoute`.');
|
|
11
|
+
}
|
|
12
|
+
const userSession = await runWithAmplifyServerContext({
|
|
13
|
+
nextServerContext: { cookies },
|
|
14
|
+
operation: contextSpec => fetchAuthSession(contextSpec),
|
|
15
|
+
});
|
|
16
|
+
const clockDrift = cookies()
|
|
17
|
+
.getAll()
|
|
18
|
+
.find(cookie => cookie.name.endsWith('.clockDrift'))?.value;
|
|
19
|
+
return new Response(JSON.stringify({
|
|
20
|
+
...userSession,
|
|
21
|
+
tokens: {
|
|
22
|
+
accessToken: userSession.tokens?.accessToken.toString(),
|
|
23
|
+
idToken: userSession.tokens?.idToken?.toString(),
|
|
24
|
+
},
|
|
25
|
+
username: userSession.tokens?.accessToken.payload.username,
|
|
26
|
+
clockDrift,
|
|
27
|
+
userSession,
|
|
28
|
+
}), {
|
|
29
|
+
headers: {
|
|
30
|
+
'content-type': 'application/json',
|
|
31
|
+
'Access-Control-Allow-Origin': origin,
|
|
32
|
+
'Access-Control-Allow-Methods': 'POST',
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
return handlerInput => ({
|
|
37
|
+
async POST(request) {
|
|
38
|
+
try {
|
|
39
|
+
return await handleRequest(request, handlerInput);
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
const { onError } = handlerInput;
|
|
43
|
+
onError(error);
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export { createTokenExchangeRouteHandlerFactory };
|
|
50
|
+
//# sourceMappingURL=createTokenExchangeRouteHandlerFactory.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createTokenExchangeRouteHandlerFactory.mjs","sources":["../../../src/auth/createTokenExchangeRouteHandlerFactory.ts"],"sourcesContent":["import { cookies } from 'next/headers.js';\nimport { fetchAuthSession } from 'aws-amplify/auth/server';\nimport { createRunWithAmplifyServerContext } from '../utils';\nexport const createTokenExchangeRouteHandlerFactory = input => {\n const runWithAmplifyServerContext = createRunWithAmplifyServerContext(input);\n const handleRequest = async (_, __) => {\n const { origin } = input;\n if (!origin) {\n throw new Error('`origin` parameter is required when using `getOAuthInitiationRoute`.');\n }\n const userSession = await runWithAmplifyServerContext({\n nextServerContext: { cookies },\n operation: contextSpec => fetchAuthSession(contextSpec),\n });\n const clockDrift = cookies()\n .getAll()\n .find(cookie => cookie.name.endsWith('.clockDrift'))?.value;\n return new Response(JSON.stringify({\n ...userSession,\n tokens: {\n accessToken: userSession.tokens?.accessToken.toString(),\n idToken: userSession.tokens?.idToken?.toString(),\n },\n username: userSession.tokens?.accessToken.payload.username,\n clockDrift,\n userSession,\n }), {\n headers: {\n 'content-type': 'application/json',\n 'Access-Control-Allow-Origin': origin,\n 'Access-Control-Allow-Methods': 'POST',\n },\n });\n };\n return handlerInput => ({\n async POST(request) {\n try {\n return await handleRequest(request, handlerInput);\n }\n catch (error) {\n const { onError } = handlerInput;\n onError(error);\n }\n },\n });\n};\n"],"names":[],"mappings":";;;;AAGY,MAAC,sCAAsC,GAAG,KAAK,IAAI;AAC/D,IAAI,MAAM,2BAA2B,GAAG,iCAAiC,CAAC,KAAK,CAAC,CAAC;AACjF,IAAI,MAAM,aAAa,GAAG,OAAO,CAAC,EAAE,EAAE,KAAK;AAC3C,QAAQ,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;AACjC,QAAQ,IAAI,CAAC,MAAM,EAAE;AACrB,YAAY,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;AACpG,SAAS;AACT,QAAQ,MAAM,WAAW,GAAG,MAAM,2BAA2B,CAAC;AAC9D,YAAY,iBAAiB,EAAE,EAAE,OAAO,EAAE;AAC1C,YAAY,SAAS,EAAE,WAAW,IAAI,gBAAgB,CAAC,WAAW,CAAC;AACnE,SAAS,CAAC,CAAC;AACX,QAAQ,MAAM,UAAU,GAAG,OAAO,EAAE;AACpC,aAAa,MAAM,EAAE;AACrB,aAAa,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,EAAE,KAAK,CAAC;AACxE,QAAQ,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;AAC3C,YAAY,GAAG,WAAW;AAC1B,YAAY,MAAM,EAAE;AACpB,gBAAgB,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,QAAQ,EAAE;AACvE,gBAAgB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE;AAChE,aAAa;AACb,YAAY,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,QAAQ;AACtE,YAAY,UAAU;AACtB,YAAY,WAAW;AACvB,SAAS,CAAC,EAAE;AACZ,YAAY,OAAO,EAAE;AACrB,gBAAgB,cAAc,EAAE,kBAAkB;AAClD,gBAAgB,6BAA6B,EAAE,MAAM;AACrD,gBAAgB,8BAA8B,EAAE,MAAM;AACtD,aAAa;AACb,SAAS,CAAC,CAAC;AACX,KAAK,CAAC;AACN,IAAI,OAAO,YAAY,KAAK;AAC5B,QAAQ,MAAM,IAAI,CAAC,OAAO,EAAE;AAC5B,YAAY,IAAI;AAChB,gBAAgB,OAAO,MAAM,aAAa,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AAClE,aAAa;AACb,YAAY,OAAO,KAAK,EAAE;AAC1B,gBAAgB,MAAM,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC;AACjD,gBAAgB,OAAO,CAAC,KAAK,CAAC,CAAC;AAC/B,aAAa;AACb,SAAS;AACT,KAAK,CAAC,CAAC;AACP;;;;"}
|
package/dist/esm/auth/httpOnlyCookieBasedAuthProviders/createHttpOnlyCookieBasedAuthProviders.mjs
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { sharedInMemoryStorage } from '@aws-amplify/core';
|
|
2
|
+
import { runInBrowserContext } from '@aws-amplify/core/internals/utils';
|
|
3
|
+
import { cognitoUserPoolsTokenProvider, cognitoCredentialsProvider } from 'aws-amplify/auth/cognito';
|
|
4
|
+
|
|
5
|
+
const createHttpOnlyCookieBasedAuthProviders = ({ authTokenExchangeRoute, }) => {
|
|
6
|
+
cognitoUserPoolsTokenProvider.setKeyValueStorage(sharedInMemoryStorage);
|
|
7
|
+
runInBrowserContext(() => {
|
|
8
|
+
refreshSession({
|
|
9
|
+
authTokenExchangeRoute,
|
|
10
|
+
tokenProvider: cognitoUserPoolsTokenProvider,
|
|
11
|
+
credentialsProvider: cognitoCredentialsProvider,
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
return {
|
|
15
|
+
tokenProvider: cognitoUserPoolsTokenProvider,
|
|
16
|
+
credentialsProvider: cognitoCredentialsProvider,
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
const refreshSession = async ({ authTokenExchangeRoute, tokenProvider, credentialsProvider, }) => {
|
|
20
|
+
const response = await fetch(authTokenExchangeRoute, { method: 'POST' });
|
|
21
|
+
const session = await response.json();
|
|
22
|
+
tokenProvider.tokenOrchestrator.setTokens({
|
|
23
|
+
tokens: {
|
|
24
|
+
accessToken: session.tokens.accessToken,
|
|
25
|
+
idToken: session.tokens.idToken,
|
|
26
|
+
clockDrift: session.clockDrift,
|
|
27
|
+
username: session.username,
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
credentialsProvider.setIdentityIdCredentials({
|
|
31
|
+
credentials: session.credentials,
|
|
32
|
+
identityId: session.identityId,
|
|
33
|
+
}, session.tokens.idToken);
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export { createHttpOnlyCookieBasedAuthProviders };
|
|
37
|
+
//# sourceMappingURL=createHttpOnlyCookieBasedAuthProviders.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createHttpOnlyCookieBasedAuthProviders.mjs","sources":["../../../../src/auth/httpOnlyCookieBasedAuthProviders/createHttpOnlyCookieBasedAuthProviders.ts"],"sourcesContent":["import { sharedInMemoryStorage } from '@aws-amplify/core';\nimport { runInBrowserContext } from '@aws-amplify/core/internals/utils';\nimport { cognitoCredentialsProvider, cognitoUserPoolsTokenProvider, } from 'aws-amplify/auth/cognito';\nexport const createHttpOnlyCookieBasedAuthProviders = ({ authTokenExchangeRoute, }) => {\n cognitoUserPoolsTokenProvider.setKeyValueStorage(sharedInMemoryStorage);\n runInBrowserContext(() => {\n refreshSession({\n authTokenExchangeRoute,\n tokenProvider: cognitoUserPoolsTokenProvider,\n credentialsProvider: cognitoCredentialsProvider,\n });\n });\n return {\n tokenProvider: cognitoUserPoolsTokenProvider,\n credentialsProvider: cognitoCredentialsProvider,\n };\n};\nconst refreshSession = async ({ authTokenExchangeRoute, tokenProvider, credentialsProvider, }) => {\n const response = await fetch(authTokenExchangeRoute, { method: 'POST' });\n const session = await response.json();\n tokenProvider.tokenOrchestrator.setTokens({\n tokens: {\n accessToken: session.tokens.accessToken,\n idToken: session.tokens.idToken,\n clockDrift: session.clockDrift,\n username: session.username,\n },\n });\n credentialsProvider.setIdentityIdCredentials({\n credentials: session.credentials,\n identityId: session.identityId,\n }, session.tokens.idToken);\n};\n"],"names":[],"mappings":";;;;AAGY,MAAC,sCAAsC,GAAG,CAAC,EAAE,sBAAsB,GAAG,KAAK;AACvF,IAAI,6BAA6B,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,CAAC;AAC5E,IAAI,mBAAmB,CAAC,MAAM;AAC9B,QAAQ,cAAc,CAAC;AACvB,YAAY,sBAAsB;AAClC,YAAY,aAAa,EAAE,6BAA6B;AACxD,YAAY,mBAAmB,EAAE,0BAA0B;AAC3D,SAAS,CAAC,CAAC;AACX,KAAK,CAAC,CAAC;AACP,IAAI,OAAO;AACX,QAAQ,aAAa,EAAE,6BAA6B;AACpD,QAAQ,mBAAmB,EAAE,0BAA0B;AACvD,KAAK,CAAC;AACN,EAAE;AACF,MAAM,cAAc,GAAG,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,mBAAmB,GAAG,KAAK;AAClG,IAAI,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,sBAAsB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;AAC7E,IAAI,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;AAC1C,IAAI,aAAa,CAAC,iBAAiB,CAAC,SAAS,CAAC;AAC9C,QAAQ,MAAM,EAAE;AAChB,YAAY,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW;AACnD,YAAY,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO;AAC3C,YAAY,UAAU,EAAE,OAAO,CAAC,UAAU;AAC1C,YAAY,QAAQ,EAAE,OAAO,CAAC,QAAQ;AACtC,SAAS;AACT,KAAK,CAAC,CAAC;AACP,IAAI,mBAAmB,CAAC,wBAAwB,CAAC;AACjD,QAAQ,WAAW,EAAE,OAAO,CAAC,WAAW;AACxC,QAAQ,UAAU,EAAE,OAAO,CAAC,UAAU;AACtC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC/B,CAAC;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ResourcesConfig } from 'aws-amplify';
|
|
2
|
+
import { NextRequest } from 'next/server';
|
|
3
|
+
import { NextServer } from '../types';
|
|
4
|
+
interface CreateTokenExchangeRouteHandlerFactoryInput {
|
|
5
|
+
config: ResourcesConfig;
|
|
6
|
+
origin?: string;
|
|
7
|
+
setAuthCookieOptions?: NextServer.SetCookieOptions;
|
|
8
|
+
}
|
|
9
|
+
interface CreateOAuthRouteHandlerOutput {
|
|
10
|
+
POST(request: NextRequest): Promise<Response | void>;
|
|
11
|
+
}
|
|
12
|
+
export interface CreateTokenExchangeRouteHandlerInput {
|
|
13
|
+
onError(error: Error): void;
|
|
14
|
+
}
|
|
15
|
+
export type CreateTokenExchangeRouteHandler = (input: CreateTokenExchangeRouteHandlerInput) => CreateOAuthRouteHandlerOutput;
|
|
16
|
+
export type CreateTokenExchangeRouteHandlerFactory = (input: CreateTokenExchangeRouteHandlerFactoryInput) => CreateTokenExchangeRouteHandler;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createHttpOnlyCookieBasedAuthProviders } from '../auth/httpOnlyCookieBasedAuthProviders';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { parseAmplifyConfig } from '@aws-amplify/core/internals/utils';
|
|
2
2
|
import { createRunWithAmplifyServerContext } from './utils/createRunWithAmplifyServerContext.mjs';
|
|
3
|
+
import { createOAuthRouteHandlerFactory } from './oauth/createOAuthRouteHandlerFactory.mjs';
|
|
4
|
+
import { createTokenExchangeRouteHandlerFactory } from './auth/createTokenExchangeRouteHandlerFactory.mjs';
|
|
5
|
+
import { createGetOAuthInitiationRouteFactory } from './oauth/createGetOAuthInitiationRouteFactory.mjs';
|
|
3
6
|
|
|
4
7
|
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
5
8
|
// SPDX-License-Identifier: Apache-2.0
|
|
@@ -21,11 +24,25 @@ import { createRunWithAmplifyServerContext } from './utils/createRunWithAmplifyS
|
|
|
21
24
|
*
|
|
22
25
|
* export const { runWithAmplifyServerContext } = createServerRunner({ config })
|
|
23
26
|
*/
|
|
24
|
-
const createServerRunner = ({ config, }) => {
|
|
27
|
+
const createServerRunner = ({ config, origin, setAuthCookieOptions, }) => {
|
|
25
28
|
const amplifyConfig = parseAmplifyConfig(config);
|
|
26
29
|
return {
|
|
27
30
|
runWithAmplifyServerContext: createRunWithAmplifyServerContext({
|
|
28
31
|
config: amplifyConfig,
|
|
32
|
+
setAuthCookieOptions,
|
|
33
|
+
}),
|
|
34
|
+
createOAuthRouteHandler: createOAuthRouteHandlerFactory({
|
|
35
|
+
config: amplifyConfig,
|
|
36
|
+
setAuthCookieOptions,
|
|
37
|
+
}),
|
|
38
|
+
getOAuthInitiationRoute: createGetOAuthInitiationRouteFactory({
|
|
39
|
+
config: amplifyConfig,
|
|
40
|
+
origin,
|
|
41
|
+
}),
|
|
42
|
+
createTokenExchangeRouteHandler: createTokenExchangeRouteHandlerFactory({
|
|
43
|
+
config: amplifyConfig,
|
|
44
|
+
origin,
|
|
45
|
+
setAuthCookieOptions,
|
|
29
46
|
}),
|
|
30
47
|
};
|
|
31
48
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createServerRunner.mjs","sources":["../../src/createServerRunner.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { parseAmplifyConfig } from '@aws-amplify/core/internals/utils';\nimport { createRunWithAmplifyServerContext } from './utils';\n/**\n * Creates the `runWithAmplifyServerContext` function to run Amplify server side APIs in an isolated request context.\n *\n * @remarks\n * This function should be called only once; you can use the returned `runWithAmplifyServerContext` across\n * your codebase.\n *\n * @param input The input used to create the `runWithAmplifyServerContext` function.\n * @param input.config The {@link ResourcesConfig} imported from the `amplifyconfiguration.json` file or manually\n * created.\n * @returns An object that contains the `runWithAmplifyServerContext` function.\n *\n * @example\n * import { createServerRunner } from '@aws-amplify/adapter-nextjs';\n * import config from './amplifyconfiguration.json';\n *\n * export const { runWithAmplifyServerContext } = createServerRunner({ config })\n */\nexport const createServerRunner = ({ config, }) => {\n const amplifyConfig = parseAmplifyConfig(config);\n return {\n runWithAmplifyServerContext: createRunWithAmplifyServerContext({\n config: amplifyConfig,\n }),\n };\n};\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"createServerRunner.mjs","sources":["../../src/createServerRunner.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { parseAmplifyConfig } from '@aws-amplify/core/internals/utils';\nimport { createRunWithAmplifyServerContext } from './utils';\nimport { createOAuthRouteHandlerFactory } from './oauth';\nimport { createTokenExchangeRouteHandlerFactory } from './auth/createTokenExchangeRouteHandlerFactory';\nimport { createGetOAuthInitiationRouteFactory } from './oauth/createGetOAuthInitiationRouteFactory';\n/**\n * Creates the `runWithAmplifyServerContext` function to run Amplify server side APIs in an isolated request context.\n *\n * @remarks\n * This function should be called only once; you can use the returned `runWithAmplifyServerContext` across\n * your codebase.\n *\n * @param input The input used to create the `runWithAmplifyServerContext` function.\n * @param input.config The {@link ResourcesConfig} imported from the `amplifyconfiguration.json` file or manually\n * created.\n * @returns An object that contains the `runWithAmplifyServerContext` function.\n *\n * @example\n * import { createServerRunner } from '@aws-amplify/adapter-nextjs';\n * import config from './amplifyconfiguration.json';\n *\n * export const { runWithAmplifyServerContext } = createServerRunner({ config })\n */\nexport const createServerRunner = ({ config, origin, setAuthCookieOptions, }) => {\n const amplifyConfig = parseAmplifyConfig(config);\n return {\n runWithAmplifyServerContext: createRunWithAmplifyServerContext({\n config: amplifyConfig,\n setAuthCookieOptions,\n }),\n createOAuthRouteHandler: createOAuthRouteHandlerFactory({\n config: amplifyConfig,\n setAuthCookieOptions,\n }),\n getOAuthInitiationRoute: createGetOAuthInitiationRouteFactory({\n config: amplifyConfig,\n origin,\n }),\n createTokenExchangeRouteHandler: createTokenExchangeRouteHandlerFactory({\n config: amplifyConfig,\n origin,\n setAuthCookieOptions,\n }),\n };\n};\n"],"names":[],"mappings":";;;;;;AAAA;AACA;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACY,MAAC,kBAAkB,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,GAAG,KAAK;AACjF,IAAI,MAAM,aAAa,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACrD,IAAI,OAAO;AACX,QAAQ,2BAA2B,EAAE,iCAAiC,CAAC;AACvE,YAAY,MAAM,EAAE,aAAa;AACjC,YAAY,oBAAoB;AAChC,SAAS,CAAC;AACV,QAAQ,uBAAuB,EAAE,8BAA8B,CAAC;AAChE,YAAY,MAAM,EAAE,aAAa;AACjC,YAAY,oBAAoB;AAChC,SAAS,CAAC;AACV,QAAQ,uBAAuB,EAAE,oCAAoC,CAAC;AACtE,YAAY,MAAM,EAAE,aAAa;AACjC,YAAY,MAAM;AAClB,SAAS,CAAC;AACV,QAAQ,+BAA+B,EAAE,sCAAsC,CAAC;AAChF,YAAY,MAAM,EAAE,aAAa;AACjC,YAAY,MAAM;AAClB,YAAY,oBAAoB;AAChC,SAAS,CAAC;AACV,KAAK,CAAC;AACN;;;;"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { assertTokenProviderConfig, assertOAuthConfig } from '@aws-amplify/core/internals/utils';
|
|
2
|
+
import { getRedirectUrl } from './utils/getRedirectUrl.mjs';
|
|
3
|
+
|
|
4
|
+
const createGetOAuthInitiationRouteFactory = ({ config: resourcesConfig, origin }) => {
|
|
5
|
+
const getOAuthInitiationRoute = input => {
|
|
6
|
+
assertTokenProviderConfig(resourcesConfig.Auth?.Cognito);
|
|
7
|
+
assertOAuthConfig(resourcesConfig.Auth.Cognito);
|
|
8
|
+
const { Cognito: cognitoUserPoolConfig } = resourcesConfig.Auth;
|
|
9
|
+
if (!origin) {
|
|
10
|
+
throw new Error('`origin` parameter is required when using `getOAuthInitiationRoute`.');
|
|
11
|
+
}
|
|
12
|
+
const redirectUrl = getRedirectUrl(origin, cognitoUserPoolConfig.loginWith.oauth);
|
|
13
|
+
const { provider } = input;
|
|
14
|
+
return `${redirectUrl}?init=true&provider=${provider}`;
|
|
15
|
+
};
|
|
16
|
+
return getOAuthInitiationRoute;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export { createGetOAuthInitiationRouteFactory };
|
|
20
|
+
//# sourceMappingURL=createGetOAuthInitiationRouteFactory.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createGetOAuthInitiationRouteFactory.mjs","sources":["../../../src/oauth/createGetOAuthInitiationRouteFactory.ts"],"sourcesContent":["import { assertOAuthConfig, assertTokenProviderConfig, } from '@aws-amplify/core/internals/utils';\nimport { getRedirectUrl } from './utils/getRedirectUrl';\nexport const createGetOAuthInitiationRouteFactory = ({ config: resourcesConfig, origin }) => {\n const getOAuthInitiationRoute = input => {\n assertTokenProviderConfig(resourcesConfig.Auth?.Cognito);\n assertOAuthConfig(resourcesConfig.Auth.Cognito);\n const { Cognito: cognitoUserPoolConfig } = resourcesConfig.Auth;\n if (!origin) {\n throw new Error('`origin` parameter is required when using `getOAuthInitiationRoute`.');\n }\n const redirectUrl = getRedirectUrl(origin, cognitoUserPoolConfig.loginWith.oauth);\n const { provider } = input;\n return `${redirectUrl}?init=true&provider=${provider}`;\n };\n return getOAuthInitiationRoute;\n};\n"],"names":[],"mappings":";;;AAEY,MAAC,oCAAoC,GAAG,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,KAAK;AAC7F,IAAI,MAAM,uBAAuB,GAAG,KAAK,IAAI;AAC7C,QAAQ,yBAAyB,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACjE,QAAQ,iBAAiB,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACxD,QAAQ,MAAM,EAAE,OAAO,EAAE,qBAAqB,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC;AACxE,QAAQ,IAAI,CAAC,MAAM,EAAE;AACrB,YAAY,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;AACpG,SAAS;AACT,QAAQ,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,EAAE,qBAAqB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC1F,QAAQ,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;AACnC,QAAQ,OAAO,CAAC,EAAE,WAAW,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC/D,KAAK,CAAC;AACN,IAAI,OAAO,uBAAuB,CAAC;AACnC;;;;"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { assertTokenProviderConfig, assertOAuthConfig } from '@aws-amplify/core/internals/utils';
|
|
2
|
+
import { initOAuthFlow } from './utils/initOAuthFlow.mjs';
|
|
3
|
+
import { completeOAuthFlow } from './utils/completeOAuthFlow.mjs';
|
|
4
|
+
|
|
5
|
+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
6
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
7
|
+
const createOAuthRouteHandlerFactory = ({ config: resourcesConfig, origin, setAuthCookieOptions, }) => {
|
|
8
|
+
const handleRequest = async (request, { customState, redirectOnAuthComplete, onError, }) => {
|
|
9
|
+
if (!origin)
|
|
10
|
+
throw new Error('Origin is not provided');
|
|
11
|
+
assertTokenProviderConfig(resourcesConfig.Auth?.Cognito);
|
|
12
|
+
assertOAuthConfig(resourcesConfig.Auth.Cognito);
|
|
13
|
+
const { Cognito: cognitoUserPoolConfig } = resourcesConfig.Auth;
|
|
14
|
+
const { searchParams } = request.nextUrl;
|
|
15
|
+
// when request url has `init` query param - initiate oauth flow
|
|
16
|
+
if (searchParams.has('init')) {
|
|
17
|
+
return initOAuthFlow({
|
|
18
|
+
origin,
|
|
19
|
+
setAuthCookieOptions,
|
|
20
|
+
request,
|
|
21
|
+
customState,
|
|
22
|
+
cognitoUserPoolConfig,
|
|
23
|
+
oAuthConfig: cognitoUserPoolConfig.loginWith.oauth,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
if (searchParams.has('code') && searchParams.has('state')) {
|
|
27
|
+
return completeOAuthFlow({
|
|
28
|
+
origin,
|
|
29
|
+
request,
|
|
30
|
+
redirectOnComplete: redirectOnAuthComplete,
|
|
31
|
+
setAuthCookieOptions,
|
|
32
|
+
customState,
|
|
33
|
+
cognitoUserPoolConfig,
|
|
34
|
+
oAuthConfig: cognitoUserPoolConfig.loginWith.oauth,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
onError(new Error('Invalid point (update me)'));
|
|
38
|
+
};
|
|
39
|
+
return handlerInput => ({
|
|
40
|
+
async GET(request) {
|
|
41
|
+
try {
|
|
42
|
+
return await handleRequest(request, handlerInput);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
const { onError } = handlerInput;
|
|
46
|
+
onError(error);
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
export { createOAuthRouteHandlerFactory };
|
|
53
|
+
//# sourceMappingURL=createOAuthRouteHandlerFactory.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createOAuthRouteHandlerFactory.mjs","sources":["../../../src/oauth/createOAuthRouteHandlerFactory.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { assertOAuthConfig, assertTokenProviderConfig, } from '@aws-amplify/core/internals/utils';\nimport { initOAuthFlow } from './utils/initOAuthFlow';\nimport { completeOAuthFlow } from './utils/completeOAuthFlow';\nexport const createOAuthRouteHandlerFactory = ({ config: resourcesConfig, origin, setAuthCookieOptions, }) => {\n const handleRequest = async (request, { customState, redirectOnAuthComplete, onError, }) => {\n if (!origin)\n throw new Error('Origin is not provided');\n assertTokenProviderConfig(resourcesConfig.Auth?.Cognito);\n assertOAuthConfig(resourcesConfig.Auth.Cognito);\n const { Cognito: cognitoUserPoolConfig } = resourcesConfig.Auth;\n const { searchParams } = request.nextUrl;\n // when request url has `init` query param - initiate oauth flow\n if (searchParams.has('init')) {\n return initOAuthFlow({\n origin,\n setAuthCookieOptions,\n request,\n customState,\n cognitoUserPoolConfig,\n oAuthConfig: cognitoUserPoolConfig.loginWith.oauth,\n });\n }\n if (searchParams.has('code') && searchParams.has('state')) {\n return completeOAuthFlow({\n origin,\n request,\n redirectOnComplete: redirectOnAuthComplete,\n setAuthCookieOptions,\n customState,\n cognitoUserPoolConfig,\n oAuthConfig: cognitoUserPoolConfig.loginWith.oauth,\n });\n }\n onError(new Error('Invalid point (update me)'));\n };\n return handlerInput => ({\n async GET(request) {\n try {\n return await handleRequest(request, handlerInput);\n }\n catch (error) {\n const { onError } = handlerInput;\n onError(error);\n }\n },\n });\n};\n"],"names":[],"mappings":";;;;AAAA;AACA;AAIY,MAAC,8BAA8B,GAAG,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,oBAAoB,GAAG,KAAK;AAC9G,IAAI,MAAM,aAAa,GAAG,OAAO,OAAO,EAAE,EAAE,WAAW,EAAE,sBAAsB,EAAE,OAAO,GAAG,KAAK;AAChG,QAAQ,IAAI,CAAC,MAAM;AACnB,YAAY,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;AACtD,QAAQ,yBAAyB,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACjE,QAAQ,iBAAiB,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACxD,QAAQ,MAAM,EAAE,OAAO,EAAE,qBAAqB,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC;AACxE,QAAQ,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;AACjD;AACA,QAAQ,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;AACtC,YAAY,OAAO,aAAa,CAAC;AACjC,gBAAgB,MAAM;AACtB,gBAAgB,oBAAoB;AACpC,gBAAgB,OAAO;AACvB,gBAAgB,WAAW;AAC3B,gBAAgB,qBAAqB;AACrC,gBAAgB,WAAW,EAAE,qBAAqB,CAAC,SAAS,CAAC,KAAK;AAClE,aAAa,CAAC,CAAC;AACf,SAAS;AACT,QAAQ,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;AACnE,YAAY,OAAO,iBAAiB,CAAC;AACrC,gBAAgB,MAAM;AACtB,gBAAgB,OAAO;AACvB,gBAAgB,kBAAkB,EAAE,sBAAsB;AAC1D,gBAAgB,oBAAoB;AACpC,gBAAgB,WAAW;AAC3B,gBAAgB,qBAAqB;AACrC,gBAAgB,WAAW,EAAE,qBAAqB,CAAC,SAAS,CAAC,KAAK;AAClE,aAAa,CAAC,CAAC;AACf,SAAS;AACT,QAAQ,OAAO,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;AACxD,KAAK,CAAC;AACN,IAAI,OAAO,YAAY,KAAK;AAC5B,QAAQ,MAAM,GAAG,CAAC,OAAO,EAAE;AAC3B,YAAY,IAAI;AAChB,gBAAgB,OAAO,MAAM,aAAa,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AAClE,aAAa;AACb,YAAY,OAAO,KAAK,EAAE;AAC1B,gBAAgB,MAAM,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC;AACjD,gBAAgB,OAAO,CAAC,KAAK,CAAC,CAAC;AAC/B,aAAa;AACb,SAAS;AACT,KAAK,CAAC,CAAC;AACP;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createOAuthRouteHandlerFactory } from './createOAuthRouteHandlerFactory';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { AuthError, AuthProvider } from '@aws-amplify/auth';
|
|
2
|
+
import { ResourcesConfig } from 'aws-amplify';
|
|
3
|
+
import { NextRequest } from 'next/server';
|
|
4
|
+
import { NextServer } from '../types';
|
|
5
|
+
export interface CreateOAuthRouteHandlerInput {
|
|
6
|
+
/** A custom state identifying an OAuth flow. */
|
|
7
|
+
customState?: string;
|
|
8
|
+
/** The path to redirect to when an OAuth flow completes. */
|
|
9
|
+
redirectOnAuthComplete: string;
|
|
10
|
+
/**
|
|
11
|
+
* A callback function to be called with a {@link AuthError} object that thrown
|
|
12
|
+
* from an inflight OAuth flow when error occurs. You need to return a
|
|
13
|
+
* {@link Response} object to redirect end user away from the API route
|
|
14
|
+
* you set up, for example, redirect back to the sign in page by
|
|
15
|
+
* `return NextResponse.redirect('/sign-in')`.
|
|
16
|
+
*/
|
|
17
|
+
onError(error: AuthError): void;
|
|
18
|
+
}
|
|
19
|
+
interface CreateOAuthRouteHandlerOutput {
|
|
20
|
+
GET(request: NextRequest): Promise<Response | void>;
|
|
21
|
+
}
|
|
22
|
+
export type CreateOAuthRouteHandler = (input: CreateOAuthRouteHandlerInput) => CreateOAuthRouteHandlerOutput;
|
|
23
|
+
interface CreateOAuthRouteHandlerFactoryInput {
|
|
24
|
+
config: ResourcesConfig;
|
|
25
|
+
origin?: string;
|
|
26
|
+
setAuthCookieOptions?: NextServer.SetCookieOptions;
|
|
27
|
+
}
|
|
28
|
+
export type CreateOAuthRouteHandlerFactory = (input: CreateOAuthRouteHandlerFactoryInput) => CreateOAuthRouteHandler;
|
|
29
|
+
export type GetOAuthInitiationRoute = (input: {
|
|
30
|
+
provider: AuthProvider | {
|
|
31
|
+
custom: string;
|
|
32
|
+
};
|
|
33
|
+
}) => string;
|
|
34
|
+
interface CreateGetOAuthInitiationRouteFactoryInput {
|
|
35
|
+
config: ResourcesConfig;
|
|
36
|
+
origin?: string;
|
|
37
|
+
}
|
|
38
|
+
export type CreateGetOAuthInitiationRouteFactory = (input: CreateGetOAuthInitiationRouteFactoryInput) => GetOAuthInitiationRoute;
|
|
39
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { CognitoUserPoolConfig, OAuthConfig } from '@aws-amplify/core';
|
|
2
|
+
import { NextRequest } from 'next/server.js';
|
|
3
|
+
import { NextServer } from '../../types';
|
|
4
|
+
export declare const completeOAuthFlow: ({ origin, request, redirectOnComplete, cognitoUserPoolConfig, oAuthConfig, setAuthCookieOptions, }: {
|
|
5
|
+
origin: string;
|
|
6
|
+
request: NextRequest;
|
|
7
|
+
customState: string | undefined;
|
|
8
|
+
redirectOnComplete: string;
|
|
9
|
+
cognitoUserPoolConfig: CognitoUserPoolConfig;
|
|
10
|
+
oAuthConfig: OAuthConfig;
|
|
11
|
+
setAuthCookieOptions?: Partial<Pick<import("cookie").CookieSerializeOptions, "domain" | "expires" | "httpOnly" | "maxAge" | "sameSite" | "secure">> | undefined;
|
|
12
|
+
}) => Promise<Response>;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { decodeJWT } from '@aws-amplify/core';
|
|
2
|
+
import { NextResponse } from 'next/server.js';
|
|
3
|
+
import { createKeyValueStorageFromCookieStorageAdapter, validateState } from 'aws-amplify/adapter-core';
|
|
4
|
+
import { DefaultOAuthStore, DefaultTokenStore, TokenOrchestrator } from '@aws-amplify/auth/cognito';
|
|
5
|
+
import { createCookieStorageAdapterFromNextServerContext } from '../../utils/createCookieStorageAdapterFromNextServerContext.mjs';
|
|
6
|
+
import { getRedirectUrl } from './getRedirectUrl.mjs';
|
|
7
|
+
|
|
8
|
+
const completeOAuthFlow = async ({ origin, request, redirectOnComplete, cognitoUserPoolConfig, oAuthConfig, setAuthCookieOptions, }) => {
|
|
9
|
+
const { searchParams } = request.nextUrl;
|
|
10
|
+
const code = searchParams.get('code');
|
|
11
|
+
const state = searchParams.get('state');
|
|
12
|
+
const oAuthTokenEndpoint = `https://${oAuthConfig.domain}/oauth2/token`;
|
|
13
|
+
const response = NextResponse.redirect(new URL(redirectOnComplete, request.url));
|
|
14
|
+
const keyValueStorage = createKeyValueStorageFromCookieStorageAdapter(createCookieStorageAdapterFromNextServerContext({
|
|
15
|
+
request,
|
|
16
|
+
response,
|
|
17
|
+
}), setAuthCookieOptions);
|
|
18
|
+
const oAuthStore = new DefaultOAuthStore(keyValueStorage);
|
|
19
|
+
oAuthStore.setAuthConfig(cognitoUserPoolConfig);
|
|
20
|
+
await validateState(oAuthStore, state);
|
|
21
|
+
const authTokenStore = new DefaultTokenStore();
|
|
22
|
+
authTokenStore.setAuthConfig({ Cognito: cognitoUserPoolConfig });
|
|
23
|
+
authTokenStore.setKeyValueStorage(keyValueStorage);
|
|
24
|
+
const tokenOrchestrator = new TokenOrchestrator();
|
|
25
|
+
tokenOrchestrator.setAuthConfig({ Cognito: cognitoUserPoolConfig });
|
|
26
|
+
tokenOrchestrator.setAuthTokenStore(authTokenStore);
|
|
27
|
+
const codeVerifier = await oAuthStore.loadPKCE();
|
|
28
|
+
const oAuthTokenBody = {
|
|
29
|
+
grant_type: 'authorization_code',
|
|
30
|
+
code,
|
|
31
|
+
client_id: cognitoUserPoolConfig.userPoolClientId,
|
|
32
|
+
// TODO(Hui): request.nextUrl.origin should be generic and not use Next specifics
|
|
33
|
+
redirect_uri: getRedirectUrl(origin, oAuthConfig),
|
|
34
|
+
...(codeVerifier ? { code_verifier: codeVerifier } : {}),
|
|
35
|
+
};
|
|
36
|
+
const body = Object.entries(oAuthTokenBody)
|
|
37
|
+
.map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)
|
|
38
|
+
.join('&');
|
|
39
|
+
const tokenExchangeResponse = await fetch(oAuthTokenEndpoint, {
|
|
40
|
+
method: 'POST',
|
|
41
|
+
headers: {
|
|
42
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
43
|
+
},
|
|
44
|
+
body,
|
|
45
|
+
});
|
|
46
|
+
const { access_token, refresh_token: refreshToken, id_token, error, error_message: errorMessage, token_type, expires_in, } = await tokenExchangeResponse.json();
|
|
47
|
+
if (error) {
|
|
48
|
+
throw new Error(errorMessage ?? error);
|
|
49
|
+
}
|
|
50
|
+
const username = (access_token && decodeJWT(access_token).payload.username) ?? 'username';
|
|
51
|
+
await writeTokensToStorage({
|
|
52
|
+
username,
|
|
53
|
+
AccessToken: access_token,
|
|
54
|
+
IdToken: id_token,
|
|
55
|
+
RefreshToken: refreshToken,
|
|
56
|
+
TokenType: token_type,
|
|
57
|
+
ExpiresIn: expires_in,
|
|
58
|
+
}, tokenOrchestrator);
|
|
59
|
+
await oAuthStore.clearOAuthData();
|
|
60
|
+
return response;
|
|
61
|
+
};
|
|
62
|
+
const writeTokensToStorage = async (payload, tokenOrchestrator) => {
|
|
63
|
+
if (!payload.AccessToken) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const accessToken = decodeJWT(payload.AccessToken);
|
|
67
|
+
const accessTokenIssuedAtInMillis = (accessToken.payload.iat || 0) * 1000;
|
|
68
|
+
const currentTime = new Date().getTime();
|
|
69
|
+
const clockDrift = accessTokenIssuedAtInMillis > 0
|
|
70
|
+
? accessTokenIssuedAtInMillis - currentTime
|
|
71
|
+
: 0;
|
|
72
|
+
let idToken;
|
|
73
|
+
let refreshToken;
|
|
74
|
+
let deviceMetadata;
|
|
75
|
+
if (payload.RefreshToken) {
|
|
76
|
+
refreshToken = payload.RefreshToken;
|
|
77
|
+
}
|
|
78
|
+
if (payload.IdToken) {
|
|
79
|
+
idToken = decodeJWT(payload.IdToken);
|
|
80
|
+
}
|
|
81
|
+
if (payload?.NewDeviceMetadata) {
|
|
82
|
+
deviceMetadata = payload.NewDeviceMetadata;
|
|
83
|
+
}
|
|
84
|
+
const tokens = {
|
|
85
|
+
accessToken,
|
|
86
|
+
idToken,
|
|
87
|
+
refreshToken,
|
|
88
|
+
clockDrift,
|
|
89
|
+
deviceMetadata,
|
|
90
|
+
username: payload.username,
|
|
91
|
+
};
|
|
92
|
+
if (payload?.signInDetails) {
|
|
93
|
+
tokens.signInDetails = payload.signInDetails;
|
|
94
|
+
}
|
|
95
|
+
await tokenOrchestrator.setTokens({ tokens });
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
export { completeOAuthFlow };
|
|
99
|
+
//# sourceMappingURL=completeOAuthFlow.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completeOAuthFlow.mjs","sources":["../../../../src/oauth/utils/completeOAuthFlow.ts"],"sourcesContent":["import { decodeJWT, } from '@aws-amplify/core';\nimport { NextResponse } from 'next/server.js';\nimport { createKeyValueStorageFromCookieStorageAdapter, validateState, } from 'aws-amplify/adapter-core';\nimport { DefaultOAuthStore, DefaultTokenStore, TokenOrchestrator, } from '@aws-amplify/auth/cognito';\nimport { createCookieStorageAdapterFromNextServerContext } from '../../utils/createCookieStorageAdapterFromNextServerContext';\nimport { getRedirectUrl } from './getRedirectUrl';\nexport const completeOAuthFlow = async ({ origin, request, redirectOnComplete, cognitoUserPoolConfig, oAuthConfig, setAuthCookieOptions, }) => {\n const { searchParams } = request.nextUrl;\n const code = searchParams.get('code');\n const state = searchParams.get('state');\n const oAuthTokenEndpoint = `https://${oAuthConfig.domain}/oauth2/token`;\n const response = NextResponse.redirect(new URL(redirectOnComplete, request.url));\n const keyValueStorage = createKeyValueStorageFromCookieStorageAdapter(createCookieStorageAdapterFromNextServerContext({\n request,\n response,\n }), setAuthCookieOptions);\n const oAuthStore = new DefaultOAuthStore(keyValueStorage);\n oAuthStore.setAuthConfig(cognitoUserPoolConfig);\n await validateState(oAuthStore, state);\n const authTokenStore = new DefaultTokenStore();\n authTokenStore.setAuthConfig({ Cognito: cognitoUserPoolConfig });\n authTokenStore.setKeyValueStorage(keyValueStorage);\n const tokenOrchestrator = new TokenOrchestrator();\n tokenOrchestrator.setAuthConfig({ Cognito: cognitoUserPoolConfig });\n tokenOrchestrator.setAuthTokenStore(authTokenStore);\n const codeVerifier = await oAuthStore.loadPKCE();\n const oAuthTokenBody = {\n grant_type: 'authorization_code',\n code,\n client_id: cognitoUserPoolConfig.userPoolClientId,\n // TODO(Hui): request.nextUrl.origin should be generic and not use Next specifics\n redirect_uri: getRedirectUrl(origin, oAuthConfig),\n ...(codeVerifier ? { code_verifier: codeVerifier } : {}),\n };\n const body = Object.entries(oAuthTokenBody)\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)\n .join('&');\n const tokenExchangeResponse = await fetch(oAuthTokenEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body,\n });\n const { access_token, refresh_token: refreshToken, id_token, error, error_message: errorMessage, token_type, expires_in, } = await tokenExchangeResponse.json();\n if (error) {\n throw new Error(errorMessage ?? error);\n }\n const username = (access_token && decodeJWT(access_token).payload.username) ?? 'username';\n await writeTokensToStorage({\n username,\n AccessToken: access_token,\n IdToken: id_token,\n RefreshToken: refreshToken,\n TokenType: token_type,\n ExpiresIn: expires_in,\n }, tokenOrchestrator);\n await oAuthStore.clearOAuthData();\n return response;\n};\nconst writeTokensToStorage = async (payload, tokenOrchestrator) => {\n if (!payload.AccessToken) {\n return;\n }\n const accessToken = decodeJWT(payload.AccessToken);\n const accessTokenIssuedAtInMillis = (accessToken.payload.iat || 0) * 1000;\n const currentTime = new Date().getTime();\n const clockDrift = accessTokenIssuedAtInMillis > 0\n ? accessTokenIssuedAtInMillis - currentTime\n : 0;\n let idToken;\n let refreshToken;\n let deviceMetadata;\n if (payload.RefreshToken) {\n refreshToken = payload.RefreshToken;\n }\n if (payload.IdToken) {\n idToken = decodeJWT(payload.IdToken);\n }\n if (payload?.NewDeviceMetadata) {\n deviceMetadata = payload.NewDeviceMetadata;\n }\n const tokens = {\n accessToken,\n idToken,\n refreshToken,\n clockDrift,\n deviceMetadata,\n username: payload.username,\n };\n if (payload?.signInDetails) {\n tokens.signInDetails = payload.signInDetails;\n }\n await tokenOrchestrator.setTokens({ tokens });\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { AuthError } from '@aws-amplify/auth';
|
|
2
|
+
|
|
3
|
+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
4
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
const getRedirectUrl = (origin, oAuthConfig) => {
|
|
6
|
+
const redirectUrl = oAuthConfig.redirectSignIn.find(url => url.startsWith(origin));
|
|
7
|
+
if (!redirectUrl) {
|
|
8
|
+
throw new AuthError({
|
|
9
|
+
name: 'InvalidRedirectException',
|
|
10
|
+
message: 'signInRedirect or signOutRedirect had an invalid format or was not found.',
|
|
11
|
+
recoverySuggestion: 'Please make sure the signIn/Out redirect in your oauth config is valid.',
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
return redirectUrl;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export { getRedirectUrl };
|
|
18
|
+
//# sourceMappingURL=getRedirectUrl.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getRedirectUrl.mjs","sources":["../../../../src/oauth/utils/getRedirectUrl.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { AuthError } from '@aws-amplify/auth';\nexport const getRedirectUrl = (origin, oAuthConfig) => {\n const redirectUrl = oAuthConfig.redirectSignIn.find(url => url.startsWith(origin));\n if (!redirectUrl) {\n throw new AuthError({\n name: 'InvalidRedirectException',\n message: 'signInRedirect or signOutRedirect had an invalid format or was not found.',\n recoverySuggestion: 'Please make sure the signIn/Out redirect in your oauth config is valid.',\n });\n }\n return redirectUrl;\n};\n"],"names":[],"mappings":";;AAAA;AACA;AAEY,MAAC,cAAc,GAAG,CAAC,MAAM,EAAE,WAAW,KAAK;AACvD,IAAI,MAAM,WAAW,GAAG,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;AACvF,IAAI,IAAI,CAAC,WAAW,EAAE;AACtB,QAAQ,MAAM,IAAI,SAAS,CAAC;AAC5B,YAAY,IAAI,EAAE,0BAA0B;AAC5C,YAAY,OAAO,EAAE,2EAA2E;AAChG,YAAY,kBAAkB,EAAE,yEAAyE;AACzG,SAAS,CAAC,CAAC;AACX,KAAK;AACL,IAAI,OAAO,WAAW,CAAC;AACvB;;;;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { NextRequest } from 'next/server.js';
|
|
2
|
+
import { CognitoUserPoolConfig, OAuthConfig } from '@aws-amplify/core';
|
|
3
|
+
import { NextServer } from '../../types';
|
|
4
|
+
export declare const initOAuthFlow: ({ request, customState, cognitoUserPoolConfig, oAuthConfig, setAuthCookieOptions, }: {
|
|
5
|
+
origin: string;
|
|
6
|
+
request: NextRequest;
|
|
7
|
+
customState: string | undefined;
|
|
8
|
+
cognitoUserPoolConfig: CognitoUserPoolConfig;
|
|
9
|
+
oAuthConfig: OAuthConfig;
|
|
10
|
+
setAuthCookieOptions?: Partial<Pick<import("cookie").CookieSerializeOptions, "domain" | "expires" | "httpOnly" | "maxAge" | "sameSite" | "secure">> | undefined;
|
|
11
|
+
}) => Promise<Response>;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { generateState, generateCodeVerifier, createKeyValueStorageFromCookieStorageAdapter, cognitoHostedUIIdentityProviderMap } from 'aws-amplify/adapter-core';
|
|
2
|
+
import { NextResponse } from 'next/server.js';
|
|
3
|
+
import { urlSafeEncode } from '@aws-amplify/core/internals/utils';
|
|
4
|
+
import { DefaultOAuthStore } from '@aws-amplify/auth/cognito';
|
|
5
|
+
import { createCookieStorageAdapterFromNextServerContext } from '../../utils/createCookieStorageAdapterFromNextServerContext.mjs';
|
|
6
|
+
import { getRedirectUrl } from './getRedirectUrl.mjs';
|
|
7
|
+
|
|
8
|
+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
9
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
10
|
+
const initOAuthFlow = async ({ request, customState, cognitoUserPoolConfig, oAuthConfig, setAuthCookieOptions, }) => {
|
|
11
|
+
const { searchParams } = request.nextUrl;
|
|
12
|
+
const specifiedProvider = searchParams.get('provider');
|
|
13
|
+
const provider = getProvider(specifiedProvider);
|
|
14
|
+
const randomState = generateState();
|
|
15
|
+
const state = customState
|
|
16
|
+
? `${randomState}-${urlSafeEncode(customState)}`
|
|
17
|
+
: randomState;
|
|
18
|
+
const scope = oAuthConfig.scopes.join(' ');
|
|
19
|
+
const redirectUrlSearchParams = new URLSearchParams({
|
|
20
|
+
redirect_uri: getRedirectUrl(origin, oAuthConfig),
|
|
21
|
+
response_type: oAuthConfig.responseType,
|
|
22
|
+
client_id: cognitoUserPoolConfig.userPoolClientId,
|
|
23
|
+
identity_provider: provider,
|
|
24
|
+
scope,
|
|
25
|
+
state,
|
|
26
|
+
});
|
|
27
|
+
let peckKey;
|
|
28
|
+
if (oAuthConfig.responseType === 'code') {
|
|
29
|
+
const { value, method, toCodeChallenge } = generateCodeVerifier(128);
|
|
30
|
+
peckKey = value;
|
|
31
|
+
redirectUrlSearchParams.append('code_challenge', toCodeChallenge());
|
|
32
|
+
redirectUrlSearchParams.append('code_challenge_method', method);
|
|
33
|
+
}
|
|
34
|
+
const redirectUrl = new URL(`https://${oAuthConfig.domain}/oauth2/authorize?${redirectUrlSearchParams.toString()}`);
|
|
35
|
+
const response = NextResponse.redirect(redirectUrl);
|
|
36
|
+
const keyValueStorage = createKeyValueStorageFromCookieStorageAdapter(createCookieStorageAdapterFromNextServerContext({
|
|
37
|
+
request,
|
|
38
|
+
response,
|
|
39
|
+
}), setAuthCookieOptions);
|
|
40
|
+
const oauthStore = new DefaultOAuthStore(keyValueStorage);
|
|
41
|
+
oauthStore.setAuthConfig(cognitoUserPoolConfig);
|
|
42
|
+
oauthStore.storeOAuthState(state);
|
|
43
|
+
peckKey && oauthStore.storePKCE(peckKey);
|
|
44
|
+
return response;
|
|
45
|
+
};
|
|
46
|
+
const getProvider = (provider) => {
|
|
47
|
+
if (typeof provider === 'string') {
|
|
48
|
+
return resolveProvider(provider);
|
|
49
|
+
}
|
|
50
|
+
return 'COGNITO';
|
|
51
|
+
};
|
|
52
|
+
const resolveProvider = (provider) => {
|
|
53
|
+
try {
|
|
54
|
+
assertAuthProvider(provider);
|
|
55
|
+
return cognitoHostedUIIdentityProviderMap[provider];
|
|
56
|
+
}
|
|
57
|
+
catch (_) {
|
|
58
|
+
return provider;
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
function assertAuthProvider(provider) {
|
|
62
|
+
if (!['Amazon', 'Apple', 'Facebook', 'Google'].includes(provider)) {
|
|
63
|
+
throw new Error('No valid provider specified.');
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export { initOAuthFlow };
|
|
68
|
+
//# sourceMappingURL=initOAuthFlow.mjs.map
|