You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: src/pages/[platform]/build-a-backend/server-side-rendering/index.mdx
+99-76Lines changed: 99 additions & 76 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -38,17 +38,28 @@ Before you begin:
38
38
39
39
## Install the Amplify Next.js adapter
40
40
41
+
<Calloutwarning>
42
+
43
+
**Note:** Amplify JS v6 supports Next.js with the version range: `>=13.5.0 <16.0.0`.
44
+
Ensure you have the correct version to integrate with Amplify.
45
+
46
+
</Callout>
47
+
41
48
To use Amplify APIs server-side, you need to install the Amplify Next.js adapter in addition to the Amplify libraries:
42
49
43
50
```bash title="Terminal" showLineNumbers={false}
44
51
npm add aws-amplify @aws-amplify/adapter-nextjs
45
52
```
46
53
47
-
## Configure Amplify APIs for server-side usage
54
+
## Configure Amplify in Next.js
48
55
49
-
You will need to create a `runWithAmplifyServerContextRunner` function to use Amplify APIs on the server-side of your Next.js app.
56
+
<BlockSwitcher>
57
+
58
+
<Blockname="Configure Amplify for server-side usage">
50
59
51
-
You can create an `amplifyServerUtils.ts` file under a `utils` folder in your codebase. In this file, you will import the Amplify backend outputs from the `amplify_outputs.json` file that is generated by the Amplify CLI, and use the `createServerRunner` function to create the `runWithAmplifyServerContextRunner` function.
60
+
You will need to create a `runWithAmplifyServerContext` function to use Amplify APIs on the server-side of your Next.js app.
61
+
62
+
You can create an `amplifyServerUtils.ts` file under a `utils` folder in your codebase. In this file, you will import the Amplify backend outputs from the `amplify_outputs.json` file that is generated by the Amplify CLI, and use the `createServerRunner` function to create the `runWithAmplifyServerContext` function.
52
63
53
64
For example, the `utils/amplifyServerUtils.ts` file may contain the following content:
You can use the exported `runWithAmplifyServerContext` function to call Amplify APIs within isolated request contexts. You can review examples under the [Calling Amplify category APIs on the server side](#calling-amplify-category-apis-on-the-server-side) section.
65
76
66
77
<Callout>
67
-
**TIP:** You only need to call the `createServerRunner` function once and reuse the `runWithAmplifyServerContext` function throughout.
78
+
**Tip:** You only need to call the `createServerRunner` function once and reuse the `runWithAmplifyServerContext` function throughout.
68
79
</Callout>
69
80
70
-
## Configure Amplify library for client-side usage
81
+
</Block>
82
+
<Blockname="Configure Amplify for client-side usage">
83
+
84
+
<Callout>
85
+
**Tip**: You only need do this step if you are using Amplify APIs on the client side of your Next.js app, for example, calling Amplify Auth `signIn` API to sign in a user, or use GraphQL subscriptions on the client side.
86
+
</Callout>
71
87
72
88
When you use the Amplify library on the client-side of your Next.js app, you will need to configure Amplify by calling the `Amplify.configure` as you would to use Amplify in a single-page application.
73
89
74
90
<Callout>
75
91
76
-
**NOTE:** To use the Amplify library on the client side in a Next.js app, you will need to set `ssr` to `true` when calling `Amplify.configure`. This instructs the Amplify library to store tokens in the cookie store of a browser. Cookies will be sent along with requests to your Next.js server for authentication.
92
+
**Note:** To use the Amplify library on the client side in a Next.js app, you will need to set `ssr` to `true` when calling `Amplify.configure`. This instructs the Amplify library to store tokens in the cookie store of a browser. Cookies will be sent along with requests to your Next.js server for authentication.
77
93
78
94
</Callout>
79
95
@@ -96,6 +112,12 @@ export default function RootLayoutThatConfiguresAmplifyOnTheClient({
96
112
}
97
113
```
98
114
115
+
<Calloutwarning>
116
+
117
+
Make sure you call `Amplify.configure` as early as possible in your application’s life-cycle. A missing configuration or `NoCredentials` error is thrown if `Amplify.configure` has not been called before other Amplify JavaScript APIs. Review the [Library Not Configured Troubleshooting guide](/gen1/[platform]/build-a-backend/troubleshooting/library-not-configured/) for possible causes of this issue.
118
+
119
+
</Callout>
120
+
99
121
<Callout>
100
122
101
123
To avoid repetitive calls to `Amplify.configure`, you can call it once in a top-level client-side rendered layout component.
@@ -154,79 +176,25 @@ export default function RootLayout({
154
176
155
177
</Accordion>
156
178
157
-
## Authentication with Next.js server-side runtime
158
-
159
-
You can use the Amplify Auth category APIs to sign up and sign in your end users on the client side. When you set `ssr: true` when calling `Amplify.configure`, the Amplify library uses cookies to store tokens which will be sent along with HTTP requests to your Next.js app server.
160
-
161
-
### Manage Auth session with the Next.js Middleware
162
-
163
-
You can use the `fetchAuthSession` API to check the auth sessions that are attached to the incoming requests in the middleware of your Next.js app to protect your routes. For example:
In this example, if the incoming request is not associated with a valid user session the request will be redirected to the `/sign-in` route.
181
+
</BlockSwitcher>
211
182
212
-
<Callout>
213
183
214
-
**NOTE:** When calling `fetchAuthSession` with a `response` context, it will send the refreshed tokens (if any) back to the client via the `Set-Cookie` header in the response.
215
184
216
-
</Callout>
185
+
## Authentication with Next.js server-side runtime
217
186
218
187
### (Experimental) Perform authentication on the server side and enable HttpOnly cookies
219
188
220
189
<Calloutwarning>
221
190
222
-
**Warning:** Once you enable the server-side sign-in feature, auth tokens are stored in HttpOnly cookies and you may not change the HttpOnly attribute. Since these cookies are inaccessible from client-side scripts, you won’t be able to use any Amplify JS APIs on the client side. Therefore, you don’t need to configure Amplify on the client side. You can keep using [these Amplify JS server-side APIs](/[platform]/build-a-backend/server-side-rendering/#supported-apis-for-nextjs-server-side-usage) on the server side.
223
-
224
-
</Callout>
191
+
**Warning:** This feature is experimental and may change in future releases.
225
192
226
-
**Prerequisites**
193
+
Once you enable the server-side sign-in feature, auth tokens are stored in HttpOnly cookies and you may not change the HttpOnly attribute. Since these cookies are inaccessible from client-side scripts, you won’t be able to use any Amplify JS APIs on the client side. Therefore, you don’t need to configure Amplify on the client side. You can keep using [these Amplify JS server-side APIs](/[platform]/build-a-backend/server-side-rendering/#supported-apis-for-nextjs-server-side-usage) on the server side.
227
194
228
-
To authenticate users on the server side, you must enable either Amazon Cognito Managed Login or Hosted UI in your Amazon Cognito User Pool client.
195
+
</Callout>
229
196
197
+
Additional setup is required to enable server-side authentication flows in your Next.js app.
230
198
231
199
#### Step 1 - Specify the origin of your app in environment variables
232
200
@@ -322,17 +290,18 @@ You can provide the callback API routes as the redirect URLs in the Auth resourc
This enables Amazon Cognito Hosted UI to support the server-side authentication flows. You may upgrade to the latest Amazon Cognito Managed Login Branding to customize the sign-in and sign-up pages. See [Amazon Cognito user pool managed login](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-managed-login.html) for more information.
304
+
336
305
#### Step 5 - Use Anchor link for initiating server-side authentication flows
337
306
338
307
Use HTML anchor links to navigate users to the sign-in and sign-up routes. For example:
When an end user clicks on the buttons above, a corresponding server-side authentication flow will be initiated.
388
357
358
+
### Validate user session with the Next.js Middleware
359
+
360
+
You can use the `fetchAuthSession` API to check the auth sessions that are attached to the incoming requests in the middleware of your Next.js app to protect your routes. For example:
In this example, if the incoming request is not associated with a valid user session the request will be redirected to the `/sign-in` route.
408
+
409
+
<Callout>
410
+
411
+
**Note:** When calling `fetchAuthSession` with a `response` context, it will send the refreshed tokens (if any) back to the client via the `Set-Cookie` header in the response.
412
+
413
+
</Callout>
414
+
389
415
## Calling Amplify category APIs on the server side
390
416
391
417
For the **Auth** categories to use Amplify APIs on the server in your Next.js app, you will need to:
@@ -397,7 +423,7 @@ For the **GraphQL API** category, review [Connect to data from Server-side Runti
397
423
398
424
<Callout>
399
425
400
-
**NOTE:** A subset of Amplify APIs can now be called on the server side of a Next.js app. These APIs are exported from the `/server` sub paths. See [the full list](#supported-apis-for-nextjs-server-side-usage) of supported APIs.
426
+
**Note:** A subset of Amplify APIs can now be called on the server side of a Next.js app. These APIs are exported from the `/server` sub paths. See [the full list](#supported-apis-for-nextjs-server-side-usage) of supported APIs.
401
427
402
428
</Callout>
403
429
@@ -445,10 +471,7 @@ export default async function AuthGetCurrentUserServer() {
445
471
});
446
472
447
473
return (
448
-
<AuthFetchResult
449
-
description="The API is called on the server side."
450
-
data={currentUser}
451
-
/>
474
+
<p>{`Hello, ${currentUser.username}`}</p>
452
475
);
453
476
} catch (error) {
454
477
console.error(error);
@@ -496,7 +519,7 @@ export default async function StaticallyRenderedPage() {
496
519
497
520
<Callout>
498
521
499
-
**NOTE:** The URL returned by the `getUrl` API expires in the above example. You may want to specify the `revalidate` parameter to rerender the page as required to ensure the URL gets regenerated.
522
+
**Note:** The URL returned by the `getUrl` API expires in the above example. You may want to specify the `revalidate` parameter to rerender the page as required to ensure the URL gets regenerated.
0 commit comments