@opensaas/keystone-nextjs-auth 20.5.0 → 21.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # @opensaas-keystone/nextjs-auth
2
2
 
3
+ ## 21.0.0
4
+
5
+ ### Major Changes
6
+
7
+ - 4119c1c: Add ability to configure custom pages use `pages` configuration
8
+ - 4119c1c: Move `userMap` `accountMap` and `userMap` into a resolver function - `resolver` function takes in `{user,account,profile}` and returns a object that is passed in to create the identity
9
+
3
10
  ## 20.5.0
4
11
 
5
12
  ### Minor Changes
package/README.md CHANGED
@@ -44,9 +44,11 @@ const auth = createAuth({
44
44
  identityField: 'subjectId',
45
45
  sessionData: `id name email`,
46
46
  autoCreate: true,
47
- userMap: { subjectId: 'id', name: 'name' },
48
- accountMap: {},
49
- profileMap: { email: 'email' },
47
+ resolver: async ({user, profile, account}) => {
48
+ const username = user.name as string;
49
+ const email = user.email as string;
50
+ return { email, username };
51
+ },
50
52
  keystonePath: '/admin',
51
53
  sessionSecret,
52
54
  providers: [
@@ -1,9 +1,7 @@
1
1
  import type { BaseItem } from '@keystone-6/core/types';
2
2
  import { graphql } from '@keystone-6/core';
3
- import { AuthGqlNames } from '../types';
4
- export declare function getBaseAuthSchema({ listKey, gqlNames, base, }: {
3
+ export declare function getBaseAuthSchema({ listKey, base, }: {
5
4
  listKey: string;
6
- gqlNames: AuthGqlNames;
7
5
  base: graphql.BaseSchemaMeta;
8
6
  }): {
9
7
  extension: {
@@ -1,11 +1,11 @@
1
1
  import { BaseListTypeInfo, KeystoneConfig } from '@keystone-6/core/types';
2
- import { AuthConfig, KeystoneAuthConfig } from './types';
2
+ import { AuthConfig, KeystoneOAuthConfig } from './types';
3
3
  /**
4
4
  * createAuth function
5
5
  *
6
6
  * Generates config for Keystone to implement standard auth features.
7
7
  */
8
- export type { NextAuthProviders, KeystoneAuthConfig } from './types';
9
- export declare function createAuth<GeneratedListTypes extends BaseListTypeInfo>({ listKey, identityField, sessionData, autoCreate, userMap, accountMap, profileMap, keystonePath, providers, sessionSecret, }: AuthConfig<GeneratedListTypes>): {
10
- withAuth: (keystoneConfig: KeystoneConfig) => KeystoneAuthConfig;
8
+ export type { NextAuthProviders, KeystoneOAuthConfig } from './types';
9
+ export declare function createAuth<GeneratedListTypes extends BaseListTypeInfo>({ autoCreate, cookies, identityField, listKey, keystonePath, pages, resolver, providers, sessionData, sessionSecret, }: AuthConfig<GeneratedListTypes>): {
10
+ withAuth: (keystoneConfig: KeystoneConfig) => KeystoneOAuthConfig;
11
11
  };
@@ -1,18 +1,25 @@
1
+ import { CookiesOptions, EventCallbacks, PagesOptions } from 'next-auth';
1
2
  import type { KeystoneListsAPI } from '@keystone-6/core/types';
2
3
  import { Provider } from 'next-auth/providers';
3
- declare type NextAuthPageProps = {
4
+ import { JWTOptions } from 'next-auth/jwt';
5
+ declare type CoreNextAuthPageProps = {
6
+ autoCreate: boolean;
7
+ cookies?: Partial<CookiesOptions>;
8
+ events?: Partial<EventCallbacks>;
4
9
  identityField: string;
5
- mutationName: string;
6
- providers: Provider[];
7
- query: KeystoneListsAPI<any>;
8
- sessionData: string;
10
+ jwt?: Partial<JWTOptions>;
9
11
  listKey: string;
10
- autoCreate: boolean;
11
- userMap: any;
12
- accountMap: any;
13
- profileMap: any;
12
+ pages?: Partial<PagesOptions>;
13
+ providers?: Provider[];
14
+ resolver?: Function | undefined;
15
+ sessionData: string | undefined;
14
16
  sessionSecret: string;
15
17
  };
18
+ declare type NextAuthGglProps = {
19
+ mutationName?: string;
20
+ query?: KeystoneListsAPI<any>;
21
+ };
22
+ export declare type NextAuthPageProps = CoreNextAuthPageProps & NextAuthGglProps;
16
23
  export default function NextAuthPage(props: NextAuthPageProps): any;
17
24
  export declare const getNextAuthPage: (props: NextAuthPageProps) => () => any;
18
25
  export {};
@@ -1,7 +1,5 @@
1
1
  import { ExtendGraphqlSchema } from '@keystone-6/core/types';
2
- import { AuthGqlNames } from './types';
3
- export declare const getSchemaExtension: ({ identityField, listKey, gqlNames, }: {
2
+ export declare const getSchemaExtension: ({ listKey, }: {
4
3
  identityField: string;
5
4
  listKey: string;
6
- gqlNames: AuthGqlNames;
7
5
  }) => ExtendGraphqlSchema;
@@ -1,12 +1,4 @@
1
- import { AuthGqlNames } from '../types';
2
- export declare const authTemplate: ({ gqlNames, identityField, sessionData, listKey, autoCreate, userMap, accountMap, profileMap, sessionSecret, }: {
3
- gqlNames: AuthGqlNames;
4
- identityField: string;
5
- sessionData: any;
6
- listKey: string;
7
- autoCreate: boolean;
8
- userMap: any;
9
- accountMap: any;
10
- profileMap: any;
11
- sessionSecret: string;
12
- }) => string;
1
+ import { NextAuthPageProps } from '../pages/NextAuthPage';
2
+ declare type AuthTemplateOptions = NextAuthPageProps;
3
+ export declare const authTemplate: ({ autoCreate, identityField, listKey, sessionData, sessionSecret, }: AuthTemplateOptions) => string;
4
+ export {};
@@ -1,42 +1,39 @@
1
1
  import { BaseListTypeInfo, KeystoneConfig } from '@keystone-6/core/types';
2
+ import { CookiesOptions, PagesOptions } from 'next-auth';
2
3
  import { Provider } from 'next-auth/providers';
3
- export declare type AuthGqlNames = {
4
- CreateInitialInput: string;
5
- createInitialItem: string;
6
- authenticateItemWithPassword: string;
7
- ItemAuthenticationWithPasswordResult: string;
8
- ItemAuthenticationWithPasswordSuccess: string;
9
- ItemAuthenticationWithPasswordFailure: string;
10
- };
11
4
  export declare type NextAuthSession = {
12
5
  listKey: string;
13
6
  itemId: string;
14
7
  data: any;
15
8
  };
16
9
  export declare type NextAuthProviders = Provider[];
17
- declare type KeytoneAuthProviders = {
10
+ declare type KeytoneOAuthOptions = {
18
11
  providers: NextAuthProviders;
12
+ pages?: Partial<PagesOptions>;
13
+ };
14
+ declare type NextAuthOptions = {
15
+ cookies?: Partial<CookiesOptions>;
16
+ resolver: any;
19
17
  };
20
- export declare type KeystoneAuthConfig = KeystoneConfig & KeytoneAuthProviders;
18
+ export declare type KeystoneOAuthConfig = KeystoneConfig & KeytoneOAuthOptions & NextAuthOptions;
21
19
  export declare type AuthConfig<GeneratedListTypes extends BaseListTypeInfo> = {
20
+ /** Auth Create users in Keystone DB from Auth Provider */
21
+ autoCreate: boolean;
22
+ /** Adds ability to customize cookie options, for example, to facilitate cross-subdomain functionality */
23
+ cookies?: Partial<CookiesOptions>;
22
24
  /** The key of the list to authenticate users with */
23
25
  listKey: GeneratedListTypes['key'];
24
26
  /** The path of the field the identity is stored in; must be text-ish */
25
27
  identityField: GeneratedListTypes['fields'];
26
- /** Session data population */
27
- sessionData?: string;
28
- /** Auth Create users in Keystone DB from Auth Provider */
29
- autoCreate: boolean;
30
- /** Map User in next-auth to item */
31
- userMap: any;
32
- /** Map Account in next-auth to item */
33
- accountMap: any;
34
- /** Map Profile in next-auth to item */
35
- profileMap: any;
36
28
  /** Path for Keystone interface */
37
29
  keystonePath?: string;
30
+ pages?: any;
38
31
  /** Providers for Next Auth */
39
32
  providers: NextAuthProviders;
33
+ /** Resolver for user to define their profile */
34
+ resolver?: Function | undefined;
35
+ /** Session data population */
36
+ sessionData?: string | undefined;
40
37
  /** Next-Auth Session Secret */
41
38
  sessionSecret: string;
42
39
  };
@@ -5,6 +5,8 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var _objectSpread = require('@babel/runtime/helpers/objectSpread2');
6
6
  var _objectWithoutProperties = require('@babel/runtime/helpers/objectWithoutProperties');
7
7
  var _includesInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/includes');
8
+ var _indexOfInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/index-of');
9
+ var _Object$values = require('@babel/runtime-corejs3/core-js-stable/object/values');
8
10
  var _mapInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/map');
9
11
  var _JSON$stringify = require('@babel/runtime-corejs3/core-js-stable/json/stringify');
10
12
  var _URL = require('@babel/runtime-corejs3/core-js-stable/url');
@@ -14,7 +16,6 @@ var jwt = require('next-auth/jwt');
14
16
  var cookie = require('cookie');
15
17
  var ejs = require('ejs');
16
18
  var _filterInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/filter');
17
- var graphql = require('graphql');
18
19
  var core = require('@keystone-6/core');
19
20
 
20
21
  function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
@@ -38,6 +39,8 @@ function _interopNamespace(e) {
38
39
  }
39
40
 
40
41
  var _includesInstanceProperty__default = /*#__PURE__*/_interopDefault(_includesInstanceProperty);
42
+ var _indexOfInstanceProperty__default = /*#__PURE__*/_interopDefault(_indexOfInstanceProperty);
43
+ var _Object$values__default = /*#__PURE__*/_interopDefault(_Object$values);
41
44
  var _mapInstanceProperty__default = /*#__PURE__*/_interopDefault(_mapInstanceProperty);
42
45
  var _JSON$stringify__default = /*#__PURE__*/_interopDefault(_JSON$stringify);
43
46
  var _URL__default = /*#__PURE__*/_interopDefault(_URL);
@@ -55,6 +58,9 @@ module.exports = withPreconstruct({
55
58
  typescript: {
56
59
  ignoreBuildErrors: true,
57
60
  },
61
+ env: {
62
+ NEXTAUTH_URL: process.env.NEXTAUTH_URL || 'http://localhost:<%= process.env.PORT || 3000 %><%= keystonePath || '' %>/api/auth',
63
+ },
58
64
  eslint: {
59
65
  ignoreDuringBuilds: true,
60
66
  },
@@ -110,7 +116,6 @@ const nextConfigTemplate = ({
110
116
 
111
117
  function getBaseAuthSchema({
112
118
  listKey,
113
- gqlNames,
114
119
  base
115
120
  }) {
116
121
  const extension = {
@@ -150,22 +155,12 @@ function getBaseAuthSchema({
150
155
  }
151
156
 
152
157
  const getSchemaExtension = ({
153
- identityField,
154
- listKey,
155
- gqlNames
158
+ listKey
156
159
  }) => core.graphql.extend(base => {
157
160
  var _context;
158
161
 
159
- const uniqueWhereInputType = graphql.assertInputObjectType(base.schema.getType(`${listKey}WhereUniqueInput`));
160
- const identityFieldOnUniqueWhere = uniqueWhereInputType.getFields()[identityField];
161
-
162
- if ((identityFieldOnUniqueWhere === null || identityFieldOnUniqueWhere === void 0 ? void 0 : identityFieldOnUniqueWhere.type) !== graphql.GraphQLString && (identityFieldOnUniqueWhere === null || identityFieldOnUniqueWhere === void 0 ? void 0 : identityFieldOnUniqueWhere.type) !== graphql.GraphQLID) {
163
- throw new Error(`createAuth was called with an identityField of ${identityField} on the list ${listKey} ` + `but that field doesn't allow being searched uniquely with a String or ID. ` + `You should likely add \`isIndexed: 'unique'\` ` + `to the field at ${listKey}.${identityField}`);
164
- }
165
-
166
162
  const baseSchema = getBaseAuthSchema({
167
163
  listKey,
168
- gqlNames,
169
164
  base
170
165
  });
171
166
  return _filterInstanceProperty__default["default"](_context = [baseSchema.extension]).call(_context, x => x !== undefined);
@@ -177,38 +172,29 @@ import { query } from '.keystone/api';
177
172
  import keystoneConfig from '../../../../../keystone';
178
173
 
179
174
  export default getNextAuthPage({
175
+ autoCreate: <%= autoCreate %>,
180
176
  identityField: '<%= identityField %>',
181
- sessionData: '<%= sessionData %>',
182
177
  listKey: '<%= listKey %>',
183
- userMap: <%- JSON.stringify(userMap) %>,
184
- accountMap: <%- JSON.stringify(accountMap) %>,
185
- profileMap: <%- JSON.stringify(profileMap) %>,
186
- autoCreate: <%= autoCreate %>,
187
- sessionSecret: '<%= sessionSecret %>',
178
+ pages: keystoneConfig.pages,
188
179
  providers: keystoneConfig.providers,
189
180
  query,
181
+ resolver: keystoneConfig.resolver,
182
+ sessionData: '<%= sessionData %>',
183
+ sessionSecret: '<%= sessionSecret %>',
190
184
  });
191
185
  `;
192
186
  const authTemplate = ({
193
- gqlNames,
187
+ autoCreate,
194
188
  identityField,
195
- sessionData,
196
189
  listKey,
197
- autoCreate,
198
- userMap,
199
- accountMap,
200
- profileMap,
190
+ sessionData,
201
191
  sessionSecret
202
192
  }) => {
203
193
  const authOut = ejs__default["default"].render(template, {
204
- gqlNames,
205
194
  identityField,
206
195
  sessionData,
207
196
  listKey,
208
197
  autoCreate,
209
- userMap,
210
- accountMap,
211
- profileMap,
212
198
  sessionSecret
213
199
  });
214
200
  return authOut;
@@ -222,31 +208,21 @@ const _excluded = ["get", "start"];
222
208
  */
223
209
 
224
210
  function createAuth({
225
- listKey,
226
- identityField,
227
- sessionData,
228
211
  autoCreate,
229
- userMap,
230
- accountMap,
231
- profileMap,
212
+ cookies,
213
+ identityField,
214
+ listKey,
232
215
  keystonePath,
216
+ pages,
217
+ resolver,
233
218
  providers,
219
+ sessionData,
234
220
  sessionSecret
235
221
  }) {
236
222
  // The protectIdentities flag is currently under review to see whether it should be
237
223
  // part of the createAuth API (in which case its use cases need to be documented and tested)
238
224
  // or whether always being true is what we want, in which case we can refactor our code
239
225
  // to match this. -TL
240
- const gqlNames = {
241
- // Core
242
- authenticateItemWithPassword: `authenticate${listKey}WithPassword`,
243
- ItemAuthenticationWithPasswordResult: `${listKey}AuthenticationWithPasswordResult`,
244
- ItemAuthenticationWithPasswordSuccess: `${listKey}AuthenticationWithPasswordSuccess`,
245
- ItemAuthenticationWithPasswordFailure: `${listKey}AuthenticationWithPasswordFailure`,
246
- // Initial data
247
- CreateInitialInput: `CreateInitial${listKey}Input`,
248
- createInitialItem: `createInitial${listKey}`
249
- };
250
226
  const customPath = !keystonePath || keystonePath === '/' ? '' : keystonePath;
251
227
  /**
252
228
  * pageMiddleware
@@ -263,16 +239,14 @@ function createAuth({
263
239
  context,
264
240
  isValidSession
265
241
  }) => {
242
+ var _context;
243
+
266
244
  const {
267
245
  req,
268
246
  session
269
247
  } = context;
270
248
  const pathname = url__default["default"].parse(req === null || req === void 0 ? void 0 : req.url).pathname;
271
249
 
272
- if (pathname === `${customPath}/api/__keystone_api_build`) {
273
- return;
274
- }
275
-
276
250
  if (isValidSession) {
277
251
  if (pathname === `${customPath}/api/auth/signin`) {
278
252
  return {
@@ -291,7 +265,11 @@ function createAuth({
291
265
  return;
292
266
  }
293
267
 
294
- if (!session && !_includesInstanceProperty__default["default"](pathname).call(pathname, `${customPath}/api/auth/`)) {
268
+ if (_includesInstanceProperty__default["default"](pathname).call(pathname, '/_next/') || _includesInstanceProperty__default["default"](pathname).call(pathname, '/api/auth/')) {
269
+ return;
270
+ }
271
+
272
+ if (!session && !_includesInstanceProperty__default["default"](pathname).call(pathname, `${customPath}/api/auth/`) && !(_indexOfInstanceProperty__default["default"](_context = _Object$values__default["default"](pages)).call(_context, pathname) > -1)) {
295
273
  return {
296
274
  kind: 'redirect',
297
275
  to: `${customPath}/api/auth/signin`
@@ -313,14 +291,10 @@ function createAuth({
313
291
  mode: 'write',
314
292
  outputPath: 'pages/api/auth/[...nextauth].js',
315
293
  src: authTemplate({
316
- gqlNames,
294
+ autoCreate,
317
295
  identityField,
318
- sessionData,
319
296
  listKey,
320
- autoCreate,
321
- userMap,
322
- accountMap,
323
- profileMap,
297
+ sessionData,
324
298
  sessionSecret
325
299
  })
326
300
  }, {
@@ -339,7 +313,8 @@ function createAuth({
339
313
  */
340
314
 
341
315
 
342
- const publicPages = [`${customPath}/api/auth/csrf`, `${customPath}/api/auth/signin`, `${customPath}/api/auth/callback`, `${customPath}/api/auth/session`, `${customPath}/api/auth/providers`, `${customPath}/api/auth/signout`];
316
+ const publicPages = [`${customPath}/api/__keystone_api_build`, `${customPath}/api/auth/csrf`, `${customPath}/api/auth/signin`, `${customPath}/api/auth/callback`, `${customPath}/api/auth/session`, `${customPath}/api/auth/providers`, `${customPath}/api/auth/signout`, `${customPath}/api/auth/error`]; // TODO: Add Provider Types
317
+ // @ts-ignore
343
318
 
344
319
  function addPages(provider) {
345
320
  const name = provider.id;
@@ -357,8 +332,7 @@ function createAuth({
357
332
 
358
333
  const extendGraphqlSchema = getSchemaExtension({
359
334
  identityField,
360
- listKey,
361
- gqlNames
335
+ listKey
362
336
  });
363
337
  /**
364
338
  * validateConfig
@@ -372,7 +346,9 @@ function createAuth({
372
346
  if (listConfig === undefined) {
373
347
  const msg = `A createAuth() invocation specifies the list "${listKey}" but no list with that key has been defined.`;
374
348
  throw new Error(msg);
375
- } // TODO: Check for String-like typing for identityField? How?
349
+ } // TODO: Check if providers
350
+ // TODO: Check other required commands/data
351
+ // TODO: Check for String-like typing for identityField? How?
376
352
  // TODO: Validate that the identifyField is unique.
377
353
  // TODO: If this field isn't required, what happens if I try to log in as `null`?
378
354
 
@@ -380,9 +356,9 @@ function createAuth({
380
356
  const identityFieldConfig = listConfig.fields[identityField];
381
357
 
382
358
  if (identityFieldConfig === undefined) {
383
- const i = _JSON$stringify__default["default"](identityField);
359
+ const identityFieldName = _JSON$stringify__default["default"](identityField);
384
360
 
385
- const msg = `A createAuth() invocation for the "${listKey}" list specifies ${i} as its identityField but no field with that key exists on the list.`;
361
+ const msg = `A createAuth() invocation for the "${listKey}" list specifies ${identityFieldName} as its identityField but no field with that key exists on the list.`;
386
362
  throw new Error(msg);
387
363
  }
388
364
  };
@@ -405,7 +381,15 @@ function createAuth({
405
381
  sessionStrategy = _objectWithoutProperties(_sessionStrategy, _excluded);
406
382
 
407
383
  return _objectSpread(_objectSpread({}, sessionStrategy), {}, {
408
- start,
384
+ start: async ({
385
+ res
386
+ }) => {
387
+ console.log('start');
388
+ const session = await start({
389
+ res
390
+ });
391
+ return session;
392
+ },
409
393
  get: async ({
410
394
  req
411
395
  }) => {
@@ -420,9 +404,8 @@ function createAuth({
420
404
  if (((_req$headers$authoriz = req.headers.authorization) === null || _req$headers$authoriz === void 0 ? void 0 : _req$headers$authoriz.split(' ')[0]) === 'Bearer') {
421
405
  var _token$data;
422
406
 
423
- const request = req;
424
407
  const token = await jwt.getToken({
425
- req: request,
408
+ req,
426
409
  secret: sessionSecret
427
410
  });
428
411
 
@@ -451,6 +434,7 @@ function createAuth({
451
434
  secure: process.env.NODE_ENV === 'production',
452
435
  path: '/',
453
436
  sameSite: 'lax',
437
+ // TODO: Update parse to URL
454
438
  domain: url__default["default"].parse(req.url).hostname
455
439
  }));
456
440
  }
@@ -487,19 +471,23 @@ function createAuth({
487
471
  },
488
472
  enableSessionItem: true,
489
473
  isAccessAllowed: async context => {
490
- var _context$req, _context$req2, _keystoneConfig$ui3;
474
+ var _context$req, _keystoneConfig$ui3;
491
475
 
492
- if (process.env.NODE_ENV !== 'production' && ((_context$req = context.req) === null || _context$req === void 0 ? void 0 : _context$req.url) !== undefined && new _URL__default["default"](context.req.url, 'http://example.com').pathname === `${customPath}/api/__keystone_api_build`) {
476
+ const {
477
+ req
478
+ } = context;
479
+ const pathname = url__default["default"].parse(req === null || req === void 0 ? void 0 : req.url).pathname; // Allow nextjs scripts and static files to be accessed without auth
480
+
481
+ if (_includesInstanceProperty__default["default"](pathname).call(pathname, '/_next/')) {
493
482
  return true;
494
- } // Allow access to the adminMeta data from the /init path to correctly render that page
495
- // even if the user isn't logged in (which should always be the case if they're seeing /init)
483
+ } // Allow keystone to access /api/__keystone_api_build for hot reloading
496
484
 
497
485
 
498
- const headers = (_context$req2 = context.req) === null || _context$req2 === void 0 ? void 0 : _context$req2.headers;
499
- const host = headers ? headers['x-forwarded-host'] || headers.host : null;
500
- const thisUrl = headers !== null && headers !== void 0 && headers.referer ? new _URL__default["default"](headers.referer) : undefined;
501
- const accessingInitPage = (thisUrl === null || thisUrl === void 0 ? void 0 : thisUrl.pathname) === '/init' && (thisUrl === null || thisUrl === void 0 ? void 0 : thisUrl.host) === host && (await context.sudo().query[listKey].count({})) === 0;
502
- return accessingInitPage || ((_keystoneConfig$ui3 = keystoneConfig.ui) !== null && _keystoneConfig$ui3 !== void 0 && _keystoneConfig$ui3.isAccessAllowed ? keystoneConfig.ui.isAccessAllowed(context) : context.session !== undefined);
486
+ if (process.env.NODE_ENV !== 'production' && ((_context$req = context.req) === null || _context$req === void 0 ? void 0 : _context$req.url) !== undefined && new _URL__default["default"](context.req.url, 'http://example.com').pathname === `${customPath}/api/__keystone_api_build`) {
487
+ return true;
488
+ }
489
+
490
+ return (_keystoneConfig$ui3 = keystoneConfig.ui) !== null && _keystoneConfig$ui3 !== void 0 && _keystoneConfig$ui3.isAccessAllowed ? keystoneConfig.ui.isAccessAllowed(context) : context.session !== undefined;
503
491
  }
504
492
  });
505
493
  }
@@ -509,8 +497,11 @@ function createAuth({
509
497
  const existingExtendGraphQLSchema = keystoneConfig.extendGraphqlSchema;
510
498
  return _objectSpread(_objectSpread({}, keystoneConfig), {}, {
511
499
  ui,
512
- session,
500
+ cookies,
513
501
  providers,
502
+ pages,
503
+ resolver,
504
+ session,
514
505
  lists: _objectSpread({}, keystoneConfig.lists),
515
506
  experimental: _objectSpread(_objectSpread({}, keystoneConfig.experimental), {}, {
516
507
  generateNodeAPI: true