@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.
Files changed (88) hide show
  1. package/dist/cjs/auth/createTokenExchangeRouteHandlerFactory.js +52 -0
  2. package/dist/cjs/auth/createTokenExchangeRouteHandlerFactory.js.map +1 -0
  3. package/dist/cjs/auth/httpOnlyCookieBasedAuthProviders/createHttpOnlyCookieBasedAuthProviders.js +39 -0
  4. package/dist/cjs/auth/httpOnlyCookieBasedAuthProviders/createHttpOnlyCookieBasedAuthProviders.js.map +1 -0
  5. package/dist/cjs/auth/httpOnlyCookieBasedAuthProviders/index.js +8 -0
  6. package/dist/cjs/auth/httpOnlyCookieBasedAuthProviders/index.js.map +1 -0
  7. package/dist/cjs/auth/types.js +4 -0
  8. package/dist/cjs/auth/types.js.map +1 -0
  9. package/dist/cjs/client/index.js +7 -0
  10. package/dist/cjs/client/index.js.map +1 -0
  11. package/dist/cjs/createServerRunner.js +18 -1
  12. package/dist/cjs/createServerRunner.js.map +1 -1
  13. package/dist/cjs/oauth/createGetOAuthInitiationRouteFactory.js +22 -0
  14. package/dist/cjs/oauth/createGetOAuthInitiationRouteFactory.js.map +1 -0
  15. package/dist/cjs/oauth/createOAuthRouteHandlerFactory.js +55 -0
  16. package/dist/cjs/oauth/createOAuthRouteHandlerFactory.js.map +1 -0
  17. package/dist/cjs/oauth/index.js +9 -0
  18. package/dist/cjs/oauth/index.js.map +1 -0
  19. package/dist/cjs/oauth/types.js +6 -0
  20. package/dist/cjs/oauth/types.js.map +1 -0
  21. package/dist/cjs/oauth/utils/completeOAuthFlow.js +101 -0
  22. package/dist/cjs/oauth/utils/completeOAuthFlow.js.map +1 -0
  23. package/dist/cjs/oauth/utils/getRedirectUrl.js +20 -0
  24. package/dist/cjs/oauth/utils/getRedirectUrl.js.map +1 -0
  25. package/dist/cjs/oauth/utils/initOAuthFlow.js +70 -0
  26. package/dist/cjs/oauth/utils/initOAuthFlow.js.map +1 -0
  27. package/dist/cjs/utils/createRunWithAmplifyServerContext.js +2 -2
  28. package/dist/cjs/utils/createRunWithAmplifyServerContext.js.map +1 -1
  29. package/dist/esm/api/createServerRunnerForAPI.d.ts +1 -1
  30. package/dist/esm/auth/createTokenExchangeRouteHandlerFactory.d.ts +2 -0
  31. package/dist/esm/auth/createTokenExchangeRouteHandlerFactory.mjs +50 -0
  32. package/dist/esm/auth/createTokenExchangeRouteHandlerFactory.mjs.map +1 -0
  33. package/dist/esm/auth/httpOnlyCookieBasedAuthProviders/createHttpOnlyCookieBasedAuthProviders.d.ts +4 -0
  34. package/dist/esm/auth/httpOnlyCookieBasedAuthProviders/createHttpOnlyCookieBasedAuthProviders.mjs +37 -0
  35. package/dist/esm/auth/httpOnlyCookieBasedAuthProviders/createHttpOnlyCookieBasedAuthProviders.mjs.map +1 -0
  36. package/dist/esm/auth/httpOnlyCookieBasedAuthProviders/index.d.ts +2 -0
  37. package/dist/esm/auth/httpOnlyCookieBasedAuthProviders/index.mjs +3 -0
  38. package/dist/esm/auth/httpOnlyCookieBasedAuthProviders/index.mjs.map +1 -0
  39. package/dist/esm/auth/types.d.ts +17 -0
  40. package/dist/esm/auth/types.mjs +2 -0
  41. package/dist/esm/auth/types.mjs.map +1 -0
  42. package/dist/esm/client/index.d.ts +1 -0
  43. package/dist/esm/client/index.mjs +3 -0
  44. package/dist/esm/client/index.mjs.map +1 -0
  45. package/dist/esm/createServerRunner.mjs +18 -1
  46. package/dist/esm/createServerRunner.mjs.map +1 -1
  47. package/dist/esm/oauth/createGetOAuthInitiationRouteFactory.d.ts +2 -0
  48. package/dist/esm/oauth/createGetOAuthInitiationRouteFactory.mjs +20 -0
  49. package/dist/esm/oauth/createGetOAuthInitiationRouteFactory.mjs.map +1 -0
  50. package/dist/esm/oauth/createOAuthRouteHandlerFactory.d.ts +2 -0
  51. package/dist/esm/oauth/createOAuthRouteHandlerFactory.mjs +53 -0
  52. package/dist/esm/oauth/createOAuthRouteHandlerFactory.mjs.map +1 -0
  53. package/dist/esm/oauth/index.d.ts +1 -0
  54. package/dist/esm/oauth/index.mjs +2 -0
  55. package/dist/esm/oauth/index.mjs.map +1 -0
  56. package/dist/esm/oauth/types.d.ts +39 -0
  57. package/dist/esm/oauth/types.mjs +2 -0
  58. package/dist/esm/oauth/types.mjs.map +1 -0
  59. package/dist/esm/oauth/utils/completeOAuthFlow.d.ts +12 -0
  60. package/dist/esm/oauth/utils/completeOAuthFlow.mjs +99 -0
  61. package/dist/esm/oauth/utils/completeOAuthFlow.mjs.map +1 -0
  62. package/dist/esm/oauth/utils/getRedirectUrl.d.ts +2 -0
  63. package/dist/esm/oauth/utils/getRedirectUrl.mjs +18 -0
  64. package/dist/esm/oauth/utils/getRedirectUrl.mjs.map +1 -0
  65. package/dist/esm/oauth/utils/initOAuthFlow.d.ts +11 -0
  66. package/dist/esm/oauth/utils/initOAuthFlow.mjs +68 -0
  67. package/dist/esm/oauth/utils/initOAuthFlow.mjs.map +1 -0
  68. package/dist/esm/types/NextServer.d.ts +19 -1
  69. package/dist/esm/utils/createRunWithAmplifyServerContext.d.ts +2 -1
  70. package/dist/esm/utils/createRunWithAmplifyServerContext.mjs +2 -2
  71. package/dist/esm/utils/createRunWithAmplifyServerContext.mjs.map +1 -1
  72. package/package.json +78 -72
  73. package/src/api/createServerRunnerForAPI.ts +7 -1
  74. package/src/auth/createTokenExchangeRouteHandlerFactory.ts +70 -0
  75. package/src/auth/httpOnlyCookieBasedAuthProviders/createHttpOnlyCookieBasedAuthProviders.ts +57 -0
  76. package/src/auth/httpOnlyCookieBasedAuthProviders/index.ts +3 -0
  77. package/src/auth/types.ts +26 -0
  78. package/src/client/index.ts +1 -0
  79. package/src/createServerRunner.ts +19 -0
  80. package/src/oauth/createGetOAuthInitiationRouteFactory.ts +35 -0
  81. package/src/oauth/createOAuthRouteHandlerFactory.ts +77 -0
  82. package/src/oauth/index.ts +4 -0
  83. package/src/oauth/types.ts +60 -0
  84. package/src/oauth/utils/completeOAuthFlow.ts +176 -0
  85. package/src/oauth/utils/getRedirectUrl.ts +23 -0
  86. package/src/oauth/utils/initOAuthFlow.ts +109 -0
  87. package/src/types/NextServer.ts +27 -1
  88. package/src/utils/createRunWithAmplifyServerContext.ts +3 -0
@@ -0,0 +1,2 @@
1
+ import { CreateTokenExchangeRouteHandlerFactory } from './types';
2
+ export declare const createTokenExchangeRouteHandlerFactory: CreateTokenExchangeRouteHandlerFactory;
@@ -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;;;;"}
@@ -0,0 +1,4 @@
1
+ import { LibraryOptions } from '@aws-amplify/core';
2
+ export declare const createHttpOnlyCookieBasedAuthProviders: ({ authTokenExchangeRoute, }: {
3
+ authTokenExchangeRoute: string;
4
+ }) => LibraryOptions['Auth'];
@@ -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,2 @@
1
+ import 'client-only';
2
+ export { createHttpOnlyCookieBasedAuthProviders } from './createHttpOnlyCookieBasedAuthProviders';
@@ -0,0 +1,3 @@
1
+ import 'client-only';
2
+ export { createHttpOnlyCookieBasedAuthProviders } from './createHttpOnlyCookieBasedAuthProviders.mjs';
3
+ //# sourceMappingURL=index.mjs.map
@@ -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,2 @@
1
+
2
+ //# sourceMappingURL=types.mjs.map
@@ -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,3 @@
1
+ import 'client-only';
2
+ export { createHttpOnlyCookieBasedAuthProviders } from '../auth/httpOnlyCookieBasedAuthProviders/createHttpOnlyCookieBasedAuthProviders.mjs';
3
+ //# sourceMappingURL=index.mjs.map
@@ -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":";;;AAAA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACY,MAAC,kBAAkB,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK;AACnD,IAAI,MAAM,aAAa,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACrD,IAAI,OAAO;AACX,QAAQ,2BAA2B,EAAE,iCAAiC,CAAC;AACvE,YAAY,MAAM,EAAE,aAAa;AACjC,SAAS,CAAC;AACV,KAAK,CAAC;AACN;;;;"}
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,2 @@
1
+ import { CreateGetOAuthInitiationRouteFactory } from './types';
2
+ export declare const createGetOAuthInitiationRouteFactory: CreateGetOAuthInitiationRouteFactory;
@@ -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,2 @@
1
+ import { CreateOAuthRouteHandlerFactory } from './types';
2
+ export declare const createOAuthRouteHandlerFactory: CreateOAuthRouteHandlerFactory;
@@ -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,2 @@
1
+ export { createOAuthRouteHandlerFactory } from './createOAuthRouteHandlerFactory.mjs';
2
+ //# sourceMappingURL=index.mjs.map
@@ -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,2 @@
1
+
2
+ //# sourceMappingURL=types.mjs.map
@@ -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,2 @@
1
+ import { OAuthConfig } from '@aws-amplify/core';
2
+ export declare const getRedirectUrl: (origin: string, oAuthConfig: OAuthConfig) => string;
@@ -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