Commit Graph

116 Commits

Author SHA1 Message Date
Iain Collins
f3532ebef2 Update models to use better table/collection names
* Use plural table/collection names
* Use snake_case on SQL
* Use camelCase on Document DB
* Updated docs
2020-06-14 03:50:22 +01:00
Iain Collins
5e9f392ba8 Bump beta version to 72 2020-06-14 03:50:22 +01:00
Iain Collins
5cf0056e69 Add script to extract schema from databases 2020-06-14 03:50:22 +01:00
Iain Collins
ac12d6a6e2 Add database drivers as devDependencies for testing 2020-06-14 03:50:22 +01:00
Iain Collins
cc0c15e37c Refactor models and schemas 2020-06-14 03:50:22 +01:00
Iain Collins
d30b112d71 Add getProfileFromToken option 2020-06-12 02:08:43 +01:00
Iain Collins
156c8e1e97 Make email addresses optional when signin in 2020-06-11 13:10:59 +01:00
Iain Collins
416785941b Added JWT helper method 2020-06-09 09:44:35 +01:00
Nicola Molinari
0918cdbfa0 fix: missing file export jwt.js in npm release 2020-06-08 14:45:01 +01:00
Iain Collins
077f60e7c4 Allow session.get callback to use data from JWT 2020-06-08 12:25:01 +01:00
Iain Collins
96900e77f6 Fix typos in README 2020-06-08 10:56:17 +01:00
Iain Collins
0d825bbc39 Refactor JWT, Sessions and add allowSignin() method (#223)
## Database

- [x] Databases are now optional - useful with OAuth + JWT if you only need access control
- [x] Updated documentation and added example code for custom database adapters

## JWT

- [x] JWT option is now an object that groups JWT related options together (was a boolean)
- [X] Refactored JWT lib and add AES encryption / decryption as well as signing / verification
- [x] Allows JWT encode/decode methods to be overridden as options
- [x] Contents of JWT can easily customised - without needing to use custom encode/decode
- [x] Exported JWT methods so they can be called from custom API routes
- [x] Updated documentation for new JWT options

## Sessions

- [x] All session options (eg. `maxAge`, `updateAge`) now grouped under single `session` option
- [x] Using JWT for sessions is now enabled from session object (`session.jwt: true`)
- [x] All options involving time now use seconds (instead of milliseconds) for consistency
- [x] Added option to customise the Session object that is returned from `/api/auth/session`
- [x] Update documentation for new Session options

## Other improvements

- [x] Added `allowSignin()` option to control what users / accounts are allowed to sign in
- [x] Refactored `callbackUrlHandler()` - this option  is now called `allowCallbackUrl()` 
- [x] Minor improvements to NextAuth.js client API methods
- [x] Minor to NextAuth.js API routes
- [x] Minor improvements to built-in error pages
- [x] Refactored database models
   All tables now include a `created` column for each row which contains the `datetime` of when the row (e.g. User / Account / Session) was created.
  Additionally, sessions now use the name 'expiry' for the expiry `datetime` value for consistency with other models.
2020-06-08 04:01:21 +01:00
Iain Collins
50039e5a6b Bump beta version to 62
This includes the OKTA provider and an improved README.
2020-06-06 03:02:10 +01:00
Iain Collins
315d75e40b Fix bug parsing hostname from database URL
Resolves #200
2020-06-03 22:01:37 +01:00
Iain Collins
50b9743bb6 HOTFIX for incorrect params to createSession
Resolves #197
2020-06-03 09:14:51 +01:00
Iain Collins
ceb35cd036 Add JWT session support
* Now has jwt and jwtSecret options
* Set jwt: true to use JWT instead of DB for session
* Enable 'debug: true' to log JWT_SESSION_TOKEN to console if you want to see what it contains
* Magical!
2020-06-03 04:41:43 +01:00
Iain Collins
6df7322493 Fix bug in Apple provider 2020-06-01 17:48:06 +01:00
Iain Collins
8a2ee7cbce HOTFIX CSS on signin page in Chome 2020-06-01 13:33:52 +01:00
Iain Collins
a465e2cda8 Improve styling on built-in pages
Improved font usage and button apperance.
2020-06-01 13:24:11 +01:00
Iain Collins
81c22f81ca Bump beta version number 2020-06-01 12:24:45 +01:00
Iain Collins
e993bc4f2a Bump beta version number 2020-06-01 04:03:44 +01:00
Iain Collins
59403ec607 Refactor Apple provider to genereate secret dynamically
See #176
2020-06-01 02:20:29 +01:00
Iain Collins
9d2d7133a1 Bump beta version number 2020-06-01 01:06:44 +01:00
Iain Collins
b39d491df3 Rename tests dir to test (more conventional) 2020-06-01 01:06:44 +01:00
Iain Collins
39e97c3b96 Restructure and extend documentation
Includes some minor tweaks to options to match documentation (non breaking changes).
2020-05-31 05:15:39 +01:00
Gerald Nolan
fd6fceb884 Sign In with Apple 2020-05-27 14:30:15 +01:00
Iain Collins
981984b562 Improve database URI handling
* Fix bug in parser (.query -> search)
* Comments to explain what is going on
* Fallback to TypeORM parser
2020-05-26 17:48:04 +01:00
Iain Collins
1e9053d879 Add support for passing URL to 'database' option
* Database configuration now only needs a single line!
* You can still specify options using query string parameters.
* You can still specify an object, so this is not a breaking change.
2020-05-26 13:19:47 +01:00
Iain Collins
d112800b98 Add custom pages
Now supports 'pages' option, which can be any URL.

If specified, these replace the built in pages.

Example usage:

pages: {
  signin: 'https://example.com/signin',
  signout: 'https://example.com/signout',
  checkEmail: 'https://example.com/check-email',
  error: 'https://example.com/error'
}
2020-05-26 01:02:02 +01:00
Iain Collins
c8bf342d8b Fix sqlite support 2020-05-25 21:43:50 +01:00
Iain Collins
63ceb1a260 Don't lookup session if session token empty 2020-05-25 21:24:45 +01:00
Iain Collins
2f16d8448d Fix issues with database; make it easier to test
These changes fix compatibility issues with common SQL databases including MySQL, MariaDB and Postgres.

* Fixes #147 - datetime now ANSI SQL timestamp
* Fixes #160 - AccessToken and RefreshToken type change from varchar to text
* Adds Docker Compose files to make it easier to test database integration.

TODO:

* Update documentation with configuration examples and latest compatibility info
* Create DB URI parser (currently only object config works)
* Database table/collection name prefix (will default to `next-auth_`)
* MongoDB support

MongoDB has some issues which mean it will require additional work and refactoring to support (while preserving SQL DB support, which is important).

It's going to take some thinking about to get right; MongoDB support might have to be dropped from 2.0 (and follow in a subsequent release) but I'm going to review options and consider the impact before making a call.
2020-05-25 18:15:33 +01:00
Iain Collins
74b334f7ad Fix default exports in entrypoints
Resolves #157
2020-05-25 12:11:35 +01:00
Iain Collins
bc6fd4aa32 Bump version number to beta 43 2020-05-23 03:56:54 +01:00
Iain Collins
cf8e6980be Simplify database configuration
* Now accepts 'database' as an option as an alterantive to 'adapter'.
* If specified, 'database' can be a string or object and will load the default adapter.
* The 'adapter' option is still valid, and overrides the 'database' option.

 If neither option is specified, displays console error and web error page.
2020-05-21 20:51:58 +01:00
Iain Collins
420bb9a74c Fix default session expiry time
Due to typo, was setting default expiry time to 30 hours, instead of 30 days.

This also made update session  behave incorrectly.
2020-05-20 18:39:28 +01:00
Iain Collins
5afa4f6e2b Refactor adapter logic
* Refactored adapter, with less redundant logic
* Removed logic from models
* Added email verification expiry support (defaults to 24 hours)
* Refactored session expiry handling and unified it with how email expiry works
* Default session expiry is still 30 days
* Now only updates expiry for a session at most once every 24 hours by default, to reduce writes to database
* Email verification max age, session max age and how often sessions are updated (to reduce database writes) are all simple options now
* Invalid sessionTokens are now deleted from the client
* Email verfication messages are now deleted once used (or when expired)
* Debug output is now an option (set `debug: true` to enable)
* Removed confusing options / callback from default adapter (except for passing in custom models/schemas)
* Adapter can now access all next-auth options, to make configuration easier
2020-05-19 02:08:10 +01:00
Iain Collins
50678d73bd Allow sessionToken cookie options to override defaults
This makes it possible to configure  session tokens to be deleted when the browser window is closed if desired.

Session expiry can now be treated as an optional field (but is always set and enforced by default).
2020-05-18 19:04:36 +01:00
Iain Collins
6d7066e4db Fix bug in session route
Accidentally included set cookie of a conditional it needs to be in.
2020-05-18 18:03:26 +01:00
Iain Collins
52eb11b385 Add session expiry logic
* By default, sessions are 30 day 'rolling sessions' and the timestamp for when they expire is extended when they are accessed to keep them alive.
* When sessions expire (ie after 30 days of inactivity), session object returns empty (as if there is no session) and users must sign in in again.
* Cleaning up old sessions from the database is not currently handled by the default adapter, but I do intend to add some logic to do this (added @TODO).
* The session expiry date can be changed by passing a custom updateSession() callback handler function in the options to the default adapter.

Using a custom `updateSession()` method with the default adapter, it is possible to specify other behaviour:

e.g.

* Disable rolling sessions (e.g. force a new login every X days).
* Create a session expiry date far into the future on initial sign in, so that they effectively never expire.
* Set a decently long max expiry time (e.g. 90+ days) but only actually update the session expiry time if the current expiry time is < 30 days; so that sessions stay valid for 30 days (and at most 90 days of inactivity) so that idle sessions are valid for at least 30 days (and maybe longer) but you don't need to write to your session database as often (useful if slow/expensive).

Note: Adapter options are passed as second option to the default adapter (the first option being the DB connection details). This is probably confusing and might be a design mistake.

const adapter = Adapter.Default({ /* database object * /}, {
  updateSession: async (session, isNewSession) => {
    // 1st arg is the current session (or null) so it's easy to check current
    // expiry date, get user specific info, etc.
    // 2nd arg is true if this is a brand new session.
    //
    // Function should return an ISO date (e.g. toISOString) or false/null to
    // prevent an update from being applied; but should always return a session
    // if isNewSession is set or the sign in will fail.
  }
})

Relying on on Adapter options is a little obtuse / confusing and so I'm considering it an 'advanced option' right now. In future, we might change how session expiry dates and behaviour is set to make it easier.

Note: There are some other updates in this PR, that's just from the linter and some improvements to formatting of contributing guide.
2020-05-18 17:49:32 +01:00
Iain Collins
26a8b20459 Bump version number
Debugging issue with deployment of docs site.
2020-05-17 20:42:16 +01:00
Iain Collins
8aa4045651 Force email to lowercase in all flows 2020-05-17 17:45:00 +01:00
Iain Collins
8a516904b8 Force email to lowercase in all flows 2020-05-17 17:45:00 +01:00
Iain Collins
df4c71496b Fix bugs with sign in flow and error handling 2020-05-17 17:45:00 +01:00
Iain Collins
026bef6f60 Improve error handling
* Better error handling, more specific messages.
* Async email option has been removed as was problematic on serverless.
* Refactored email sign in so that sending emails is now handled by the email provider.
* How email configuration works is now more customimzable - and cleanly seperated from  database logic.
* Now possible to define logic for async email (e.g. pass messages to a queue) or use any email provider or API.
2020-05-17 17:45:00 +01:00
Iain Collins
2b168e183b Improve error messages 2020-05-17 17:45:00 +01:00
Iain Collins
c86ea5e9dc Refactor sign in; make async email optional
* Email providers can now set  the option 'async' to 'true' to send emails AFTER displaying confirmation page, or to 'false' send emails BEFORE returning to the user. Defaults to false.

Setting it to true is faster for the user, but is hard to debug as it's not easy to know if it worked or not.

* Fixed bug with unsubscribe option.

* Moved oAuth and Email signin handlers together in `lib` dir.
2020-05-17 17:45:00 +01:00
Iain Collins
966577fc02 Improve email sign in flow 2020-05-17 17:45:00 +01:00
Iain Collins
d0d3af5f12 Bump version to beta 23 2020-05-17 17:45:00 +01:00
Iain Collins
fc28374f88 Add email sign in flow
* Added email verification adapater methods
* Added support on sign in page for email providers
* Added check email page
* Added SMTP transport to send email messages

Includes refactoring of model and handlers for the email verification flow.
2020-05-17 17:45:00 +01:00