mirror of
https://github.com/SrIzan10/next-auth.git
synced 2026-05-01 10:55:20 +00:00
Compare commits
478 Commits
@auth/core
...
@auth/svel
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d6abccd9a0 | ||
|
|
2f35daae37 | ||
|
|
a0f3b04c43 | ||
|
|
c7dec376a1 | ||
|
|
925a52e0ec | ||
|
|
2318e44de4 | ||
|
|
d73812bce5 | ||
|
|
ee36d09a08 | ||
|
|
0cb7fd2e7c | ||
|
|
3b414bd7b5 | ||
|
|
37bb6ebd2c | ||
|
|
2ecf52c342 | ||
|
|
cda07c239e | ||
|
|
fa60b79abe | ||
|
|
39e1a76e8f | ||
|
|
953ef9d04a | ||
|
|
94f3031765 | ||
|
|
ad7bf07ddf | ||
|
|
f30308ac30 | ||
|
|
6eaaeb15e9 | ||
|
|
8b3f0696a5 | ||
|
|
c69a157832 | ||
|
|
60af446338 | ||
|
|
ce85444760 | ||
|
|
142abe3eea | ||
|
|
da211e6cbe | ||
|
|
79ad6156ed | ||
|
|
28f287d63e | ||
|
|
1ab77d0e11 | ||
|
|
787c1ff7d0 | ||
|
|
208b3b4a43 | ||
|
|
c4f6330f70 | ||
|
|
44127068e1 | ||
|
|
9e3f1aacf7 | ||
|
|
83051c6862 | ||
|
|
f1acab67e6 | ||
|
|
6a31ed3216 | ||
|
|
0998fc0b98 | ||
|
|
bd20d750c2 | ||
|
|
8e29b4df0c | ||
|
|
9632a56d45 | ||
|
|
12161b9613 | ||
|
|
a3b5276a5a | ||
|
|
7c1078b9a9 | ||
|
|
37d3461155 | ||
|
|
6111662df7 | ||
|
|
5da6549c48 | ||
|
|
1ca87809d6 | ||
|
|
7f6967fc3c | ||
|
|
2313ef63e0 | ||
|
|
523fcbab71 | ||
|
|
83d8b447db | ||
|
|
ddffa57d00 | ||
|
|
807d5d7920 | ||
|
|
0f0dd9228a | ||
|
|
b087fdb817 | ||
|
|
443bfd6c32 | ||
|
|
7c44d916ed | ||
|
|
b489fef2e2 | ||
|
|
98add24526 | ||
|
|
0ddd47cc0a | ||
|
|
0100888d9b | ||
|
|
9eeea02fe2 | ||
|
|
0a57fea430 | ||
|
|
51750e1a06 | ||
|
|
039a14d992 | ||
|
|
da821d2789 | ||
|
|
be5c42e350 | ||
|
|
b68f461f8b | ||
|
|
95c5ba0b5d | ||
|
|
25388de027 | ||
|
|
ad77e1c2b7 | ||
|
|
cd654c3001 | ||
|
|
6f9ca4143d | ||
|
|
e97b27414a | ||
|
|
9018939ee7 | ||
|
|
c2fc41b44d | ||
|
|
01d7eb4feb | ||
|
|
2388c20cc6 | ||
|
|
9a1bef9e72 | ||
|
|
35a72d2273 | ||
|
|
5f1b75a7a2 | ||
|
|
fa58065951 | ||
|
|
b31f2af66c | ||
|
|
71bb6f2590 | ||
|
|
6c07331cc5 | ||
|
|
c8ef94b2be | ||
|
|
75a59fbd92 | ||
|
|
3dd47b0735 | ||
|
|
4dc1d421f8 | ||
|
|
99ca67f1cf | ||
|
|
a087df8494 | ||
|
|
1aa4994de6 | ||
|
|
88023f69b9 | ||
|
|
b02057a72d | ||
|
|
400da8c766 | ||
|
|
b48104801b | ||
|
|
ccbbc800d2 | ||
|
|
d7888263ca | ||
|
|
47d3151410 | ||
|
|
7d264860ab | ||
|
|
6184b936f5 | ||
|
|
1954258a0a | ||
|
|
c580f0db22 | ||
|
|
d1cf701ed9 | ||
|
|
69398e2d3a | ||
|
|
856b5c50fc | ||
|
|
2830b7de5b | ||
|
|
40a0faa586 | ||
|
|
a6b4d958ac | ||
|
|
cc13df9d51 | ||
|
|
06b8d4772c | ||
|
|
d644d1fcbf | ||
|
|
380f2de961 | ||
|
|
dc5f3e1873 | ||
|
|
93f3fcd1b7 | ||
|
|
1d9b9ba47c | ||
|
|
8f6108f230 | ||
|
|
15943d6696 | ||
|
|
81589bf738 | ||
|
|
09402bf2fc | ||
|
|
e39a968a7b | ||
|
|
b03378be7f | ||
|
|
af415e9438 | ||
|
|
90eeeeab2f | ||
|
|
f0b475fc72 | ||
|
|
f4f8c4a0b3 | ||
|
|
6f2cb460c9 | ||
|
|
46f285f6f0 | ||
|
|
6bdb8af78d | ||
|
|
04e0637fd8 | ||
|
|
b5712448a1 | ||
|
|
605d15c3cc | ||
|
|
d1479125cb | ||
|
|
2e09bc0d19 | ||
|
|
843fc6ff8f | ||
|
|
6695ff8503 | ||
|
|
80c1f375b8 | ||
|
|
5a13288d47 | ||
|
|
26201e6271 | ||
|
|
d0d7b90ba1 | ||
|
|
874624dfbe | ||
|
|
4b5cd08800 | ||
|
|
1c104afef9 | ||
|
|
ff5b8ba8e2 | ||
|
|
42d5899efd | ||
|
|
b278975c3f | ||
|
|
997e595b5b | ||
|
|
527c25b128 | ||
|
|
0e2bbda537 | ||
|
|
7f3b35593f | ||
|
|
bce6b00c43 | ||
|
|
1bbd5d51d1 | ||
|
|
b24b02fe71 | ||
|
|
2c5c4d18c4 | ||
|
|
e3f9b398f0 | ||
|
|
ab13930020 | ||
|
|
f6bb16b264 | ||
|
|
a220245d03 | ||
|
|
7462e797de | ||
|
|
36286b1fae | ||
|
|
2e8e90a9be | ||
|
|
d06a552bf6 | ||
|
|
5cb8dd5f37 | ||
|
|
7c1a3b547e | ||
|
|
2534ae8801 | ||
|
|
14a120277b | ||
|
|
c49f484743 | ||
|
|
676b39d5b1 | ||
|
|
e27dbcab2f | ||
|
|
63805c7d75 | ||
|
|
5d1c35e8aa | ||
|
|
a77f557cbf | ||
|
|
657492d921 | ||
|
|
d1d63bddba | ||
|
|
99ac4899b5 | ||
|
|
2130765a57 | ||
|
|
4079274aaf | ||
|
|
3d7985fd6d | ||
|
|
331e0ce51e | ||
|
|
8af666a4cc | ||
|
|
fed0a67917 | ||
|
|
0332d86942 | ||
|
|
8b38d32430 | ||
|
|
1e5f840a26 | ||
|
|
5981712681 | ||
|
|
dd2b85c6a5 | ||
|
|
3c0475acae | ||
|
|
416881c4c9 | ||
|
|
b91167091c | ||
|
|
497dacff41 | ||
|
|
2a1e1d1cd2 | ||
|
|
00f65b3476 | ||
|
|
470e55f8db | ||
|
|
d722962206 | ||
|
|
cee1bddbd5 | ||
|
|
e0ae913e5c | ||
|
|
1db27fcd07 | ||
|
|
95407df289 | ||
|
|
22adc2eb3c | ||
|
|
725f976b39 | ||
|
|
28ae5d4639 | ||
|
|
0f4d43e9ad | ||
|
|
28583b8ab0 | ||
|
|
1e7538a955 | ||
|
|
4258857e52 | ||
|
|
e9d8805609 | ||
|
|
fb43c5da05 | ||
|
|
326eadf0ed | ||
|
|
a5e0db4bb3 | ||
|
|
334e23343a | ||
|
|
be046a6cb2 | ||
|
|
bdee262abe | ||
|
|
3f89e668ec | ||
|
|
533320eb94 | ||
|
|
dfe6509472 | ||
|
|
1bde7cc8df | ||
|
|
cef05d5e2d | ||
|
|
c0dea283ba | ||
|
|
0204766e0f | ||
|
|
a336ba762c | ||
|
|
681d53c2f8 | ||
|
|
06e891c0ea | ||
|
|
b9a84350b5 | ||
|
|
44c38247da | ||
|
|
9b9af4d5e5 | ||
|
|
fd2179bdca | ||
|
|
7bb037bb9d | ||
|
|
52f70e9f4f | ||
|
|
505f69b519 | ||
|
|
b21709db40 | ||
|
|
aff7b37ef9 | ||
|
|
daa85be1ad | ||
|
|
c31718ca10 | ||
|
|
fbcfedf0e8 | ||
|
|
bd032335eb | ||
|
|
128e0f3a10 | ||
|
|
557fb9d741 | ||
|
|
b4d6ed5f5f | ||
|
|
035836da98 | ||
|
|
294039a497 | ||
|
|
b2450ef625 | ||
|
|
a81bb3e51e | ||
|
|
bb506f7eb9 | ||
|
|
87d9cc4244 | ||
|
|
d2e3b76031 | ||
|
|
c36834b3b0 | ||
|
|
8f7145801a | ||
|
|
fdce27b8ca | ||
|
|
4056dafa7a | ||
|
|
f0b61bd5fd | ||
|
|
866e42b343 | ||
|
|
6d4cde4b02 | ||
|
|
2377596bb6 | ||
|
|
3c7c25cefa | ||
|
|
c441f681af | ||
|
|
c05951f0f9 | ||
|
|
d142252499 | ||
|
|
700daec919 | ||
|
|
d8481f3825 | ||
|
|
3539a35601 | ||
|
|
3be7bb7a79 | ||
|
|
031cdd13b2 | ||
|
|
212b321f7e | ||
|
|
1ccb88b3f0 | ||
|
|
16d680b110 | ||
|
|
6e027811ef | ||
|
|
e5df406429 | ||
|
|
e4ddb533ff | ||
|
|
4e16b21a60 | ||
|
|
dd9f1b7421 | ||
|
|
4ebec5d385 | ||
|
|
c1f3cbda3c | ||
|
|
ba3ed049d1 | ||
|
|
9238294192 | ||
|
|
83c6bfe237 | ||
|
|
07109616c8 | ||
|
|
95c8f7930e | ||
|
|
8005f0cdb0 | ||
|
|
6e0ae59ed3 | ||
|
|
1b19aa39b8 | ||
|
|
69cda58707 | ||
|
|
b20a5f554a | ||
|
|
f8d77c4daf | ||
|
|
a3d23450a8 | ||
|
|
9abee0b2ee | ||
|
|
5cf580d10b | ||
|
|
00d495d9e3 | ||
|
|
5884574765 | ||
|
|
ae5360b028 | ||
|
|
7c963515b5 | ||
|
|
8cf4cc2ea9 | ||
|
|
9388a56efa | ||
|
|
3a75fb955a | ||
|
|
01bb91612a | ||
|
|
3b25935c83 | ||
|
|
394920dfd4 | ||
|
|
85dc5bede8 | ||
|
|
8f854c61d0 | ||
|
|
e8fbe58997 | ||
|
|
d2288ee4cc | ||
|
|
5a6f76bf2c | ||
|
|
15bed6260c | ||
|
|
1423733d61 | ||
|
|
77d8f47f51 | ||
|
|
3120d28299 | ||
|
|
e6a320bb0f | ||
|
|
7d4d436efe | ||
|
|
c6f5c4d1cf | ||
|
|
09a075cc7e | ||
|
|
f1475955ea | ||
|
|
e6f48775fa | ||
|
|
ba87e86d47 | ||
|
|
b0dd1fac93 | ||
|
|
054288316b | ||
|
|
5e02019a3c | ||
|
|
9da0e66193 | ||
|
|
287c8f0f91 | ||
|
|
87ed5077ad | ||
|
|
2cbf815445 | ||
|
|
d63166db3a | ||
|
|
f387793d71 | ||
|
|
b0ecf4e861 | ||
|
|
5a73c6efa3 | ||
|
|
4aec142525 | ||
|
|
45f423ed5d | ||
|
|
2e52a89c52 | ||
|
|
ecde35e9c4 | ||
|
|
5a51330d55 | ||
|
|
b2db3eabee | ||
|
|
3865e44c1e | ||
|
|
9f5acc5749 | ||
|
|
0bbc8246b8 | ||
|
|
511f66b0a8 | ||
|
|
ae57199258 | ||
|
|
aad425fced | ||
|
|
8ef1010bb1 | ||
|
|
950ca3169a | ||
|
|
edbf0fc011 | ||
|
|
46bac818fe | ||
|
|
9e64eb0cdd | ||
|
|
955e379330 | ||
|
|
7be4461253 | ||
|
|
c2e06dc445 | ||
|
|
4dd70a5f6f | ||
|
|
98dbf56494 | ||
|
|
6b4644f7e7 | ||
|
|
bcf909b69e | ||
|
|
4dcdd21242 | ||
|
|
137d993a13 | ||
|
|
8dda662cd6 | ||
|
|
8a438bab32 | ||
|
|
4aaad03e9c | ||
|
|
4fa0d1fa2a | ||
|
|
c081773667 | ||
|
|
1ab0a2aed4 | ||
|
|
cac9816d32 | ||
|
|
65defc709e | ||
|
|
1601626d31 | ||
|
|
8c4f439279 | ||
|
|
a3cc9cb5f8 | ||
|
|
0ad4be2809 | ||
|
|
aea4aaf25f | ||
|
|
9bd7bc8a47 | ||
|
|
bf8fc9ca94 | ||
|
|
7116248e87 | ||
|
|
ef8f353d94 | ||
|
|
01620f9b7c | ||
|
|
87d41aff94 | ||
|
|
2d21f5ea5e | ||
|
|
adf7cae7a0 | ||
|
|
f9b75e0a39 | ||
|
|
9d6f54539d | ||
|
|
0e51c66e11 | ||
|
|
e47c3c81f1 | ||
|
|
d69edb8501 | ||
|
|
e5c0e3513b | ||
|
|
ca208ce732 | ||
|
|
dcb601987b | ||
|
|
7fd799a9ac | ||
|
|
fdd5e2390d | ||
|
|
fdecbb59c4 | ||
|
|
677d8a346f | ||
|
|
aad0b8db0e | ||
|
|
137bbb8d84 | ||
|
|
d7fbd05eba | ||
|
|
532aa24495 | ||
|
|
f5da5a5f33 | ||
|
|
3b85f46c21 | ||
|
|
6aa1af2ffb | ||
|
|
9364625681 | ||
|
|
1bf2e1d468 | ||
|
|
ac304f17da | ||
|
|
3a685b28f8 | ||
|
|
5b34b95c58 | ||
|
|
a706105205 | ||
|
|
39c78f27b5 | ||
|
|
b179f15cf3 | ||
|
|
54561a1231 | ||
|
|
0ea9ada3a9 | ||
|
|
209c368a73 | ||
|
|
52c5b7cad3 | ||
|
|
b8d83f52b3 | ||
|
|
7dacfbabf0 | ||
|
|
bb372cc5cc | ||
|
|
c6ca01a99e | ||
|
|
6c45abf383 | ||
|
|
2ba5314e35 | ||
|
|
582a3c339a | ||
|
|
ea23a93442 | ||
|
|
1d67ad41cc | ||
|
|
7c50b3da98 | ||
|
|
1b2c373fa1 | ||
|
|
f7275c7527 | ||
|
|
e699ff14b8 | ||
|
|
6eab7ac25f | ||
|
|
9b05dbc540 | ||
|
|
132a76d951 | ||
|
|
66cbb522d9 | ||
|
|
553924d902 | ||
|
|
cba81f0b8c | ||
|
|
b7171ab790 | ||
|
|
43c8f663c6 | ||
|
|
b16b048991 | ||
|
|
62a5d70f9b | ||
|
|
1b671ae83d | ||
|
|
cc4b9fc2fc | ||
|
|
4935166372 | ||
|
|
695f937dbd | ||
|
|
ad9eec3676 | ||
|
|
2e924edcdf | ||
|
|
c7627778eb | ||
|
|
8b5644453b | ||
|
|
84291d3e81 | ||
|
|
67e5c236f6 | ||
|
|
8972defa4b | ||
|
|
85667dd681 | ||
|
|
d9532745eb | ||
|
|
1e6daa8304 | ||
|
|
70a3e3f662 | ||
|
|
875f79d11e | ||
|
|
6cfe502ae0 | ||
|
|
91c6b05ed8 | ||
|
|
45a18930c8 | ||
|
|
6f22a49c7d | ||
|
|
fea30069c9 | ||
|
|
cd01707530 | ||
|
|
d9a2df3a3d | ||
|
|
f4a1ed1eb7 | ||
|
|
a97737cc18 | ||
|
|
b44d1a005e | ||
|
|
2c077e1491 | ||
|
|
19804661d2 | ||
|
|
b7f1e3e7f8 | ||
|
|
7757024d79 | ||
|
|
3f15dc67e1 | ||
|
|
5359694b8f | ||
|
|
66686fa5fc | ||
|
|
1d6330b719 | ||
|
|
0eb20d1097 | ||
|
|
ac30402c6a | ||
|
|
caa6c6ae42 | ||
|
|
a6ac48314e | ||
|
|
f8675bc245 | ||
|
|
3d4842dcc9 | ||
|
|
7d7d1b2f80 | ||
|
|
9a4f3db7b0 | ||
|
|
6aad07a95c | ||
|
|
cfed5b976f | ||
|
|
d34108091f | ||
|
|
7bf79b89a8 | ||
|
|
4cd688703a | ||
|
|
57b176840e | ||
|
|
6298d955df | ||
|
|
2ad1cb3f8c | ||
|
|
98707282eb | ||
|
|
f4a2430891 | ||
|
|
575bcb5710 |
41
.eslintrc.js
41
.eslintrc.js
@@ -1,41 +0,0 @@
|
|||||||
const path = require("path")
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
root: true,
|
|
||||||
parser: "@typescript-eslint/parser",
|
|
||||||
overrides: [
|
|
||||||
{
|
|
||||||
files: ["*.ts", "*.tsx"],
|
|
||||||
extends: ["standard-with-typescript", "prettier"],
|
|
||||||
rules: {
|
|
||||||
camelcase: "off",
|
|
||||||
"@typescript-eslint/naming-convention": "off",
|
|
||||||
"@typescript-eslint/strict-boolean-expressions": "off",
|
|
||||||
"@typescript-eslint/explicit-function-return-type": "off",
|
|
||||||
"@typescript-eslint/restrict-template-expressions": "off",
|
|
||||||
},
|
|
||||||
|
|
||||||
parserOptions: {
|
|
||||||
project: [
|
|
||||||
path.resolve(__dirname, "./packages/**/tsconfig.eslint.json"),
|
|
||||||
path.resolve(__dirname, "./packages/frameworks/**/tsconfig.json"),
|
|
||||||
path.resolve(__dirname, "./apps/**/tsconfig.json"),
|
|
||||||
],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
extends: ["prettier"],
|
|
||||||
globals: {
|
|
||||||
localStorage: "readonly",
|
|
||||||
location: "readonly",
|
|
||||||
fetch: "readonly",
|
|
||||||
},
|
|
||||||
rules: {
|
|
||||||
camelcase: "off",
|
|
||||||
},
|
|
||||||
plugins: ["jest"],
|
|
||||||
env: {
|
|
||||||
"jest/globals": true,
|
|
||||||
},
|
|
||||||
ignorePatterns: [".eslintrc.js"],
|
|
||||||
}
|
|
||||||
2
.github/ISSUE_TEMPLATE/1_bug_framework.yml
vendored
2
.github/ISSUE_TEMPLATE/1_bug_framework.yml
vendored
@@ -30,7 +30,7 @@ body:
|
|||||||
Run this command in your project's root folder and paste the result:
|
Run this command in your project's root folder and paste the result:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
npx envinfo --system --binaries --browsers --npmPackages "next,react,next-auth"
|
npx envinfo --system --binaries --browsers --npmPackages "next,react,next-auth,@auth/*"
|
||||||
```
|
```
|
||||||
Alternatively, you can manually gather the version information from your package.json for these packages: "next", "react" and "next-auth". Please also mention your OS and Node.js version, as well as the browser you are using.
|
Alternatively, you can manually gather the version information from your package.json for these packages: "next", "react" and "next-auth". Please also mention your OS and Node.js version, as well as the browser you are using.
|
||||||
validations:
|
validations:
|
||||||
|
|||||||
5
.github/ISSUE_TEMPLATE/2_bug_provider.yml
vendored
5
.github/ISSUE_TEMPLATE/2_bug_provider.yml
vendored
@@ -25,12 +25,14 @@ body:
|
|||||||
- "Custom provider"
|
- "Custom provider"
|
||||||
- "42 School"
|
- "42 School"
|
||||||
- "Apple"
|
- "Apple"
|
||||||
|
- "Asgardeo"
|
||||||
- "Atlassian"
|
- "Atlassian"
|
||||||
- "Auth0"
|
- "Auth0"
|
||||||
- "Authentik"
|
- "Authentik"
|
||||||
- "Azure Active Directory"
|
- "Azure Active Directory"
|
||||||
- "Azure Active Directory B2C"
|
- "Azure Active Directory B2C"
|
||||||
- "Battlenet"
|
- "Battlenet"
|
||||||
|
- "Beyond Identity"
|
||||||
- "Box"
|
- "Box"
|
||||||
- "Bungie"
|
- "Bungie"
|
||||||
- "Cognito"
|
- "Cognito"
|
||||||
@@ -57,6 +59,7 @@ body:
|
|||||||
- "Medium"
|
- "Medium"
|
||||||
- "Naver"
|
- "Naver"
|
||||||
- "Netlify"
|
- "Netlify"
|
||||||
|
- "Notion"
|
||||||
- "Okta"
|
- "Okta"
|
||||||
- "OneLogin"
|
- "OneLogin"
|
||||||
- "Osso"
|
- "Osso"
|
||||||
@@ -87,7 +90,7 @@ body:
|
|||||||
Run this command in your project's root folder and paste the result:
|
Run this command in your project's root folder and paste the result:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
npx envinfo --system --binaries --browsers --npmPackages "next,react,next-auth"
|
npx envinfo --system --binaries --browsers --npmPackages "next,react,next-auth,@auth/*"
|
||||||
```
|
```
|
||||||
Alternatively, you can manually gather the version information from your package.json for these packages: "next", "react" and "next-auth". Please also mention your OS and Node.js version, as well as the browser you are using.
|
Alternatively, you can manually gather the version information from your package.json for these packages: "next", "react" and "next-auth". Please also mention your OS and Node.js version, as well as the browser you are using.
|
||||||
validations:
|
validations:
|
||||||
|
|||||||
6
.github/ISSUE_TEMPLATE/3_bug_adapter.yml
vendored
6
.github/ISSUE_TEMPLATE/3_bug_adapter.yml
vendored
@@ -29,10 +29,10 @@ body:
|
|||||||
- "@next-auth/mongodb-adapter"
|
- "@next-auth/mongodb-adapter"
|
||||||
- "@next-auth/neo4j-adapter"
|
- "@next-auth/neo4j-adapter"
|
||||||
- "@next-auth/pouchdb-adapter"
|
- "@next-auth/pouchdb-adapter"
|
||||||
- "@next-auth/prisma-adapter"
|
- "@auth/prisma-adapter"
|
||||||
- "@next-auth/sequelize-adapter"
|
- "@next-auth/sequelize-adapter"
|
||||||
- "@next-auth/supabase-adapter"
|
- "@next-auth/supabase-adapter"
|
||||||
- "@next-auth/typeorm-legacy-adapter"
|
- "@auth/typeorm-adapter"
|
||||||
- "@next-auth/upstash-redis-adapter"
|
- "@next-auth/upstash-redis-adapter"
|
||||||
- "@next-auth/xata-adapter"
|
- "@next-auth/xata-adapter"
|
||||||
validations:
|
validations:
|
||||||
@@ -44,7 +44,7 @@ body:
|
|||||||
Run this command in your project's root folder and paste the result:
|
Run this command in your project's root folder and paste the result:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
npx envinfo --system --binaries --browsers --npmPackages "next,react,next-auth" && npx envinfo --npmPackages "@next-auth/*"
|
npx envinfo --system --binaries --browsers --npmPackages "next,react,next-auth,@auth/*" && npx envinfo --npmPackages "@next-auth/*"
|
||||||
```
|
```
|
||||||
Alternatively, if the above command did not work, we need the version of the following packages from your package.json: "next", "react", "next-auth" and your adapter. Please also mention your OS and Node.js version, as well as the browser you are using.
|
Alternatively, if the above command did not work, we need the version of the following packages from your package.json: "next", "react", "next-auth" and your adapter. Please also mention your OS and Node.js version, as well as the browser you are using.
|
||||||
validations:
|
validations:
|
||||||
|
|||||||
2
.github/ISSUE_TEMPLATE/config.yml
vendored
2
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -1 +1 @@
|
|||||||
blank_issues_enabled: false
|
blank_issues_enabled: false
|
||||||
|
|||||||
8
.github/PULL_REQUEST_TEMPLATE.md
vendored
8
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -8,7 +8,7 @@ merge of your pull request!
|
|||||||
> _NOTE_:
|
> _NOTE_:
|
||||||
>
|
>
|
||||||
> - It's a good idea to open an issue first to discuss potential changes.
|
> - It's a good idea to open an issue first to discuss potential changes.
|
||||||
> - Please make sure that you are _NOT_ opening a PR to fix a potential security vulnerability. Instead, please follow the [Security guidelines](../Security.md) to disclose the issue to us confidentially.
|
> - Please make sure that you are _NOT_ opening a PR to fix a potential security vulnerability. Instead, please follow the [Security guidelines](https://github.com/nextauthjs/.github/blob/main/SECURITY.md) to disclose the issue to us confidentially.
|
||||||
|
|
||||||
## ☕️ Reasoning
|
## ☕️ Reasoning
|
||||||
|
|
||||||
@@ -28,7 +28,7 @@ Fixes: INSERT_ISSUE_LINK_HERE
|
|||||||
|
|
||||||
## 📌 Resources
|
## 📌 Resources
|
||||||
|
|
||||||
- [Security guidelines](../Security.md)
|
- [Security guidelines](https://github.com/nextauthjs/.github/blob/main/SECURITY.md)
|
||||||
- [Contributing guidelines](../CONTRIBUTING.md)
|
- [Contributing guidelines](https://github.com/nextauthjs/.github/blob/main/CONTRIBUTING.md)
|
||||||
- [Code of conduct](../CODE_OF_CONDUCT.md)
|
- [Code of conduct](https://github.com/nextauthjs/.github/blob/main/CODE_OF_CONDUCT.md)
|
||||||
- [Contributing to Open Source](https://kcd.im/pull-request)
|
- [Contributing to Open Source](https://kcd.im/pull-request)
|
||||||
|
|||||||
2
.github/actions/issue-validator/index.mjs
vendored
2
.github/actions/issue-validator/index.mjs
vendored
File diff suppressed because one or more lines are too long
3
.github/actions/issue-validator/licenses.txt
vendored
3
.github/actions/issue-validator/licenses.txt
vendored
@@ -526,7 +526,7 @@ IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|||||||
root
|
root
|
||||||
ISC License
|
ISC License
|
||||||
|
|
||||||
Copyright (c) 2018-2021, Iain Collins
|
Copyright (c) 2022-2023, Balázs Orbán
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
Permission to use, copy, modify, and/or distribute this software for any
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
@@ -540,6 +540,7 @@ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|||||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
|
||||||
|
|
||||||
tr46
|
tr46
|
||||||
MIT
|
MIT
|
||||||
|
|
||||||
|
|||||||
5
.github/actions/issue-validator/repro.md
vendored
5
.github/actions/issue-validator/repro.md
vendored
@@ -14,9 +14,9 @@ Ensure the link is pointing to a codebase that is accessible (e.g. not a private
|
|||||||
|
|
||||||
### **What happens if I don't provide a sufficient minimal reproduction?**
|
### **What happens if I don't provide a sufficient minimal reproduction?**
|
||||||
|
|
||||||
Issues with the `incomplete` label that receives no meaningful activity (e.g. new comments with a reproduction link) are automatically closed and locked after 30 days.
|
Issues with the `incomplete` label that receives no meaningful activity (e.g. new comments with a reproduction link) are closed after 7 days.
|
||||||
|
|
||||||
If your issue has _not_ been resolved in that time and it has been closed/locked, please open a new issue with the required reproduction.
|
If your issue has _not_ been resolved in that time and it has been closed/locked, please open a new issue with the required reproduction. (It's less likely that we check back on already closed issues.)
|
||||||
|
|
||||||
### **I did not open this issue, but it is relevant to me, what can I do to help?**
|
### **I did not open this issue, but it is relevant to me, what can I do to help?**
|
||||||
|
|
||||||
@@ -35,4 +35,3 @@ Upvoting issues to show your interest will help us prioritize and address them a
|
|||||||
- [How to create a Minimal, Complete, and Verifiable example](https://stackoverflow.com/help/mcve)
|
- [How to create a Minimal, Complete, and Verifiable example](https://stackoverflow.com/help/mcve)
|
||||||
- [Reporting a NextAuth.js bug](https://github.com/nextauthjs/next-auth/blob/main/.github/ISSUE_TEMPLATE/1_bug_framework.yml)
|
- [Reporting a NextAuth.js bug](https://github.com/nextauthjs/next-auth/blob/main/.github/ISSUE_TEMPLATE/1_bug_framework.yml)
|
||||||
- [How to Contribute to Open Source (Next.js)](https://www.youtube.com/watch?v=cuoNzXFLitc)
|
- [How to Contribute to Open Source (Next.js)](https://www.youtube.com/watch?v=cuoNzXFLitc)
|
||||||
|
|
||||||
|
|||||||
@@ -7,8 +7,6 @@ import { readFileSync } from "node:fs"
|
|||||||
import { join } from "node:path"
|
import { join } from "node:path"
|
||||||
|
|
||||||
const addReproductionLabel = "incomplete"
|
const addReproductionLabel = "incomplete"
|
||||||
const __dirname =
|
|
||||||
"/home/runner/work/nextauthjs/next-auth/.github/actions/issue-validator"
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @typedef {{
|
* @typedef {{
|
||||||
@@ -73,7 +71,12 @@ async function run() {
|
|||||||
}),
|
}),
|
||||||
client.issues.createComment({
|
client.issues.createComment({
|
||||||
...issueCommon,
|
...issueCommon,
|
||||||
body: readFileSync(join(__dirname, "repro.md"), "utf8"),
|
body: readFileSync(
|
||||||
|
join(
|
||||||
|
"/home/runner/work/next-auth/next-auth/.github/actions/issue-validator/repro.md"
|
||||||
|
),
|
||||||
|
"utf8"
|
||||||
|
),
|
||||||
}),
|
}),
|
||||||
])
|
])
|
||||||
return core.info(
|
return core.info(
|
||||||
|
|||||||
6
.github/issue-labeler.yml
vendored
6
.github/issue-labeler.yml
vendored
@@ -25,7 +25,7 @@ pouchdb:
|
|||||||
- "@next-auth/pouchdb-adapter"
|
- "@next-auth/pouchdb-adapter"
|
||||||
|
|
||||||
prisma:
|
prisma:
|
||||||
- "@next-auth/prisma-adapter"
|
- "@auth/prisma-adapter"
|
||||||
|
|
||||||
sequelize:
|
sequelize:
|
||||||
- "@next-auth/sequelize-adapter"
|
- "@next-auth/sequelize-adapter"
|
||||||
@@ -33,8 +33,8 @@ sequelize:
|
|||||||
supabase:
|
supabase:
|
||||||
- "@next-auth/supabase-adapter"
|
- "@next-auth/supabase-adapter"
|
||||||
|
|
||||||
typeorm-legacy:
|
typeorm:
|
||||||
- "@next-auth/typeorm-legacy-adapter"
|
- "@auth/typeorm-adapter"
|
||||||
|
|
||||||
upstash-redis:
|
upstash-redis:
|
||||||
- "@next-auth/upstash-redis-adapter"
|
- "@next-auth/upstash-redis-adapter"
|
||||||
|
|||||||
98
.github/pr-labeler.yml
vendored
98
.github/pr-labeler.yml
vendored
@@ -1,74 +1,26 @@
|
|||||||
# https://github.com/actions/labeler#create-githublabeleryml
|
# https://github.com/actions/labeler#create-githublabeleryml
|
||||||
|
adapters: ["packages/core/src/adapters.ts", "packages/adapter-*/**/*"]
|
||||||
test:
|
core: ["packages/core/src/**/*"]
|
||||||
- test/**/*
|
dgraph: ["packages/adapter-dgraph/**/*"]
|
||||||
- types/tests/**/*
|
documentation: ["packages/docs/docs/**/*"]
|
||||||
|
dynamodb: ["packages/adapter-dynamodb/**/*"]
|
||||||
providers:
|
examples: ["apps/examples/**/*"]
|
||||||
- packages/next-auth/src/providers/**/*
|
fauna: ["packages/adapter-fauna/**/*"]
|
||||||
- test/integration/**/*
|
firebase: ["packages/adapter-firebase/**/*"]
|
||||||
|
frameworks: ["packages/frameworks-*/**/*"]
|
||||||
adapters:
|
legacy: ["packages/next-auth/**/*"]
|
||||||
- packages/next-auth/src/adapters.ts
|
mikro-orm: ["packages/adapter-mikro-orm/**/*"]
|
||||||
- packages/adapter-*/**
|
mongodb: ["packages/adapter-mongodb/**/*"]
|
||||||
|
neo4j: ["packages/adapter-neo4j/**/*"]
|
||||||
dgraph:
|
playgrounds: ["apps/playgrounds/**/*"]
|
||||||
- packages/adapter-dgraph/**
|
pouchdb: ["packages/adapter-pouchdb/**/*"]
|
||||||
|
prisma: ["packages/adapter-prisma/**/*"]
|
||||||
dynamodb:
|
providers: ["packages/core/src/providers/**/*"]
|
||||||
- packages/adapter-dynamodb/**
|
sequelize: ["packages/adapter-sequelize/**/*"]
|
||||||
|
solidjs: ["packages/frameworks-solid-start/**/*"]
|
||||||
fauna:
|
supabase: ["packages/adapter-supabase/**/*"]
|
||||||
- packages/adapter-fauna/**
|
svelte: ["packages/frameworks-sveltekit/**/*"]
|
||||||
|
test: ["**test**/*"]
|
||||||
firebase:
|
typeorm: ["packages/adapter-typeorm/**/*"]
|
||||||
- packages/adapter-firebase/**
|
upstash-redis: ["packages/adapter-upstash-redis/**/*"]
|
||||||
|
xata: ["packages/adapter-xata/**/*"]
|
||||||
mikro-orm:
|
|
||||||
- packages/adapter-mikro-orm/**
|
|
||||||
|
|
||||||
mongodb:
|
|
||||||
- packages/adapter-mongodb/**
|
|
||||||
|
|
||||||
neo4j:
|
|
||||||
- packages/adapter-neo4j/**
|
|
||||||
|
|
||||||
pouchdb:
|
|
||||||
- packages/adapter-pouchdb/**
|
|
||||||
|
|
||||||
prisma:
|
|
||||||
- packages/adapter-prisma/**
|
|
||||||
|
|
||||||
sequelize:
|
|
||||||
- packages/adapter-sequelize/**
|
|
||||||
|
|
||||||
supabase:
|
|
||||||
- packages/adapter-supabase/**
|
|
||||||
|
|
||||||
typeorm-legacy:
|
|
||||||
- packages/adapter-typeorm-legacy/**
|
|
||||||
|
|
||||||
upstash-redis:
|
|
||||||
- packages/adapter-upstash-redis/**
|
|
||||||
|
|
||||||
xata:
|
|
||||||
- packages/adapter-xata/**
|
|
||||||
|
|
||||||
core:
|
|
||||||
- packages/next-auth/src/**/*
|
|
||||||
|
|
||||||
style:
|
|
||||||
- packages/next-auth/src/css/**/*
|
|
||||||
|
|
||||||
client:
|
|
||||||
- packages/next-auth/src/client/**/*
|
|
||||||
- packages/next-auth/src/react/**/*
|
|
||||||
|
|
||||||
pages:
|
|
||||||
- packages/next-auth/src/core/pages/**/*
|
|
||||||
|
|
||||||
TypeScript:
|
|
||||||
- packages/next-auth/src/**/types.ts
|
|
||||||
|
|
||||||
documentation:
|
|
||||||
- packages/docs/docs/**/*
|
|
||||||
|
|||||||
20
.github/sync.yml
vendored
20
.github/sync.yml
vendored
@@ -1,12 +1,26 @@
|
|||||||
nextauthjs/next-auth-example:
|
nextauthjs/sveltekit-auth-example:
|
||||||
- source: apps/example-nextjs
|
- source: apps/examples/sveltekit
|
||||||
|
dest: .
|
||||||
|
deleteOrphaned: true
|
||||||
|
- .github/FUNDING.yml
|
||||||
|
- LICENSE
|
||||||
|
|
||||||
|
nextauthjs/solid-start-auth-example:
|
||||||
|
- source: "apps/examples/solid-start"
|
||||||
dest: .
|
dest: .
|
||||||
deleteOrphaned: true
|
deleteOrphaned: true
|
||||||
- .github/FUNDING.yml
|
- .github/FUNDING.yml
|
||||||
- LICENSE
|
- LICENSE
|
||||||
|
|
||||||
nextauthjs/next-auth-gatsby-example:
|
nextauthjs/next-auth-gatsby-example:
|
||||||
- source: apps/example-gatsby
|
- source: apps/playgrounds/gatsby
|
||||||
|
dest: .
|
||||||
|
deleteOrphaned: true
|
||||||
|
- .github/FUNDING.yml
|
||||||
|
- LICENSE
|
||||||
|
|
||||||
|
nextauthjs/next-auth-example:
|
||||||
|
- source: apps/examples/nextjs
|
||||||
dest: .
|
dest: .
|
||||||
deleteOrphaned: true
|
deleteOrphaned: true
|
||||||
- .github/FUNDING.yml
|
- .github/FUNDING.yml
|
||||||
|
|||||||
9
.github/version-pr/index.js
vendored
9
.github/version-pr/index.js
vendored
@@ -5,14 +5,15 @@ const core = require("@actions/core")
|
|||||||
try {
|
try {
|
||||||
const packageJSONPath = path.join(
|
const packageJSONPath = path.join(
|
||||||
process.cwd(),
|
process.cwd(),
|
||||||
"packages/next-auth/package.json"
|
`packages/${process.env.PACKAGE_PATH || "next-auth"}/package.json`
|
||||||
)
|
)
|
||||||
const packageJSON = JSON.parse(fs.readFileSync(packageJSONPath, "utf8"))
|
const packageJSON = JSON.parse(fs.readFileSync(packageJSONPath, "utf8"))
|
||||||
|
|
||||||
const sha8 = process.env.GITHUB_SHA.substring(0, 8)
|
const sha8 = process.env.GITHUB_SHA.substring(0, 8)
|
||||||
const prNumber = process.env.PR_NUMBER
|
const prefix = "0.0.0-"
|
||||||
|
const pr = process.env.PR_NUMBER
|
||||||
const packageVersion = `0.0.0-pr.${prNumber}.${sha8}`
|
const source = pr ? `pr.${pr}` : "manual"
|
||||||
|
const packageVersion = `${prefix}${source}.${sha8}`
|
||||||
packageJSON.version = packageVersion
|
packageJSON.version = packageVersion
|
||||||
core.setOutput("version", packageVersion)
|
core.setOutput("version", packageVersion)
|
||||||
fs.writeFileSync(packageJSONPath, JSON.stringify(packageJSON))
|
fs.writeFileSync(packageJSONPath, JSON.stringify(packageJSON))
|
||||||
|
|||||||
6
.github/workflows/issue-validator.yml
vendored
6
.github/workflows/issue-validator.yml
vendored
@@ -11,7 +11,7 @@ jobs:
|
|||||||
- uses: actions/setup-node@v3
|
- uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: 18
|
node-version: 18
|
||||||
- name: 'Run issue validator'
|
- name: Run issue validator
|
||||||
run: node ./.github/actions/issue-validator/index.mjs
|
run: node /home/runner/work/next-auth/next-auth/.github/actions/issue-validator/index.mjs
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|||||||
144
.github/workflows/release.yml
vendored
144
.github/workflows/release.yml
vendored
@@ -3,11 +3,59 @@ name: Release
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- "main"
|
- main
|
||||||
- "beta"
|
- beta
|
||||||
- "next"
|
- next
|
||||||
- "3.x"
|
- 3.x
|
||||||
pull_request:
|
pull_request:
|
||||||
|
# TODO: Support latest releases
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
name:
|
||||||
|
type: choice
|
||||||
|
description: Package name (npm)
|
||||||
|
options:
|
||||||
|
- "@auth/core"
|
||||||
|
- "@auth/nextjs"
|
||||||
|
- "@auth/dgraph-adapter"
|
||||||
|
- "@auth/drizzle-adapter"
|
||||||
|
- "@auth/dynamodb-adapter"
|
||||||
|
- "@auth/fauna-adapter"
|
||||||
|
- "@auth/firebase-adapter"
|
||||||
|
- "@auth/mikro-orm-adapter"
|
||||||
|
- "@auth/mongodb-adapter"
|
||||||
|
- "@auth/neo4j-adapter"
|
||||||
|
- "@auth/pouchdb-adapter"
|
||||||
|
- "@auth/prisma-adapter"
|
||||||
|
- "@auth/sequelize-adapter"
|
||||||
|
- "@auth/supabase-adapter"
|
||||||
|
- "@auth/typeorm-adapter"
|
||||||
|
- "@auth/upstash-redis-adapter"
|
||||||
|
- "@auth/xata-adapter"
|
||||||
|
- "next-auth"
|
||||||
|
# TODO: Infer from package name
|
||||||
|
path:
|
||||||
|
type: choice
|
||||||
|
description: Directory name (packages/*)
|
||||||
|
options:
|
||||||
|
- "core"
|
||||||
|
- "frameworks-nextjs"
|
||||||
|
- "adapter-dgraph"
|
||||||
|
- "adapter-drizzle"
|
||||||
|
- "adapter-dynamodb"
|
||||||
|
- "adapter-fauna"
|
||||||
|
- "adapter-firebase"
|
||||||
|
- "adapter-mikro-orm"
|
||||||
|
- "adapter-mongodb"
|
||||||
|
- "adapter-neo4j"
|
||||||
|
- "adapter-pouchdb"
|
||||||
|
- "adapter-prisma"
|
||||||
|
- "adapter-sequelize"
|
||||||
|
- "adapter-supabase"
|
||||||
|
- "adapter-typeorm"
|
||||||
|
- "adapter-upstash-redis"
|
||||||
|
- "adapter-xata"
|
||||||
|
- "next-auth"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
test:
|
test:
|
||||||
@@ -20,8 +68,6 @@ jobs:
|
|||||||
fetch-depth: 2
|
fetch-depth: 2
|
||||||
- name: Install pnpm
|
- name: Install pnpm
|
||||||
uses: pnpm/action-setup@v2.2.4
|
uses: pnpm/action-setup@v2.2.4
|
||||||
with:
|
|
||||||
version: 7.5.1
|
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@v3
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
@@ -29,13 +75,30 @@ jobs:
|
|||||||
cache: "pnpm"
|
cache: "pnpm"
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: pnpm install
|
run: pnpm install
|
||||||
- name: Build
|
|
||||||
run: pnpm build
|
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
run: pnpm test
|
run: pnpm test
|
||||||
|
timeout-minutes: 15
|
||||||
env:
|
env:
|
||||||
UPSTASH_REDIS_URL: ${{ secrets.UPSTASH_REDIS_URL }}
|
UPSTASH_REDIS_URL: ${{ secrets.UPSTASH_REDIS_URL }}
|
||||||
UPSTASH_REDIS_KEY: ${{ secrets.UPSTASH_REDIS_KEY }}
|
UPSTASH_REDIS_KEY: ${{ secrets.UPSTASH_REDIS_KEY }}
|
||||||
|
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
|
||||||
|
TURBO_TEAM: ${{ secrets.TURBO_TEAM }}
|
||||||
|
# - name: Run E2E tests
|
||||||
|
# if: github.repository == 'nextauthjs/next-auth'
|
||||||
|
# run: pnpm e2e
|
||||||
|
# timeout-minutes: 15
|
||||||
|
# env:
|
||||||
|
# AUTH0_USERNAME: ${{ secrets.AUTH0_USERNAME }}
|
||||||
|
# AUTH0_PASSWORD: ${{ secrets.AUTH0_PASSWORD }}
|
||||||
|
# TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
|
||||||
|
# TURBO_TEAM: ${{ secrets.TURBO_TEAM }}
|
||||||
|
# - name: Upload E2E artifacts
|
||||||
|
# if: github.repository == 'nextauthjs/next-auth'
|
||||||
|
# uses: actions/upload-artifact@v3
|
||||||
|
# with:
|
||||||
|
# name: playwright-report
|
||||||
|
# path: apps/dev/nextjs/playwright-report/
|
||||||
|
# retention-days: 30
|
||||||
# - name: Coverage
|
# - name: Coverage
|
||||||
# uses: codecov/codecov-action@v1
|
# uses: codecov/codecov-action@v1
|
||||||
# with:
|
# with:
|
||||||
@@ -52,10 +115,9 @@ jobs:
|
|||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
token: ${{ secrets.GH_PAT_CLASSIC }}
|
||||||
- name: Install pnpm
|
- name: Install pnpm
|
||||||
uses: pnpm/action-setup@v2.2.4
|
uses: pnpm/action-setup@v2.2.4
|
||||||
with:
|
|
||||||
version: 7.5.1
|
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@v3
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
@@ -64,15 +126,12 @@ jobs:
|
|||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: pnpm install
|
run: pnpm install
|
||||||
- name: Publish to npm and GitHub
|
- name: Publish to npm and GitHub
|
||||||
run: |
|
run: pnpm release
|
||||||
git config --global user.email "balazsorban44@users.noreply.github.com"
|
|
||||||
git config --global user.name "Balázs Orbán"
|
|
||||||
pnpm release
|
|
||||||
env:
|
env:
|
||||||
RELEASE_TOKEN: ${{ secrets.RELEASE_TOKEN }}
|
# Use GH_PAT when this is fixed:
|
||||||
GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }}
|
# https://github.com/github/roadmap/issues/622
|
||||||
NPM_TOKEN_PKG: ${{ secrets.NPM_TOKEN_PKG }}
|
GITHUB_TOKEN: ${{ secrets.GH_PAT_CLASSIC }}
|
||||||
NPM_TOKEN_ORG: ${{ secrets.NPM_TOKEN_ORG }}
|
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||||
release-pr:
|
release-pr:
|
||||||
name: Publish PR
|
name: Publish PR
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -84,8 +143,6 @@ jobs:
|
|||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
- name: Install pnpm
|
- name: Install pnpm
|
||||||
uses: pnpm/action-setup@v2.2.4
|
uses: pnpm/action-setup@v2.2.4
|
||||||
with:
|
|
||||||
version: 7.5.1
|
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@v3
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
@@ -100,19 +157,52 @@ jobs:
|
|||||||
PR_NUMBER: ${{ github.event.number }}
|
PR_NUMBER: ${{ github.event.number }}
|
||||||
- name: Publish to npm
|
- name: Publish to npm
|
||||||
run: |
|
run: |
|
||||||
cd packages/next-auth
|
cd packages/core
|
||||||
echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> .npmrc
|
echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> .npmrc
|
||||||
pnpm publish --no-git-checks --access public --tag experimental
|
pnpm publish --no-git-checks --access public --tag experimental
|
||||||
env:
|
env:
|
||||||
NPM_TOKEN: ${{ secrets.NPM_TOKEN_PKG }}
|
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||||
- name: Comment version on PR
|
- name: Comment version on PR
|
||||||
uses: NejcZdovc/comment-pr@v2
|
uses: NejcZdovc/comment-pr@v2
|
||||||
with:
|
with:
|
||||||
message:
|
message:
|
||||||
"🎉 Experimental release [published 📦️ on npm](https://npmjs.com/package/next-auth/v/${{ env.VERSION }})!\n \
|
"🎉 Experimental release [published 📦️ on npm](https://npmjs.com/package/@auth/core/v/${{ env.VERSION }})!\n \
|
||||||
```sh\npnpm add next-auth@${{ env.VERSION }}\n```\n \
|
```sh\npnpm add @auth/core@${{ env.VERSION }}\n```\n \
|
||||||
```sh\nyarn add next-auth@${{ env.VERSION }}\n```\n \
|
```sh\nyarn add @auth/core@${{ env.VERSION }}\n```\n \
|
||||||
```sh\nnpm i next-auth@${{ env.VERSION }}\n```"
|
```sh\nnpm i @auth/core@${{ env.VERSION }}\n```"
|
||||||
env:
|
env:
|
||||||
VERSION: ${{ steps.determine-version.outputs.version }}
|
VERSION: ${{ steps.determine-version.outputs.version }}
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GH_PAT }}
|
||||||
|
release-manual:
|
||||||
|
name: Publish manually
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: ${{ github.event_name == 'workflow_dispatch' }}
|
||||||
|
steps:
|
||||||
|
- name: Init
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Install pnpm
|
||||||
|
uses: pnpm/action-setup@v2.2.4
|
||||||
|
- name: Setup Node
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: 18
|
||||||
|
cache: "pnpm"
|
||||||
|
- name: Install dependencies
|
||||||
|
run: pnpm install
|
||||||
|
- name: Determine version
|
||||||
|
uses: ./.github/version-pr
|
||||||
|
id: determine-version
|
||||||
|
env:
|
||||||
|
PACKAGE_PATH: ${{ github.event.inputs.path }}
|
||||||
|
- name: Publish to npm
|
||||||
|
run: |
|
||||||
|
pnpm build
|
||||||
|
cd packages/$PACKAGE_PATH
|
||||||
|
echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> .npmrc
|
||||||
|
pnpm publish --no-git-checks --access public --tag experimental
|
||||||
|
echo "🎉 Experimental release published 📦️ on npm: https://npmjs.com/package/${{ github.event.inputs.name }}/v/${{ env.VERSION }}"
|
||||||
|
echo "Install via: pnpm add ${{ github.event.inputs.name }}@${{ env.VERSION }}"
|
||||||
|
env:
|
||||||
|
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||||
|
PACKAGE_PATH: ${{ github.event.inputs.path }}
|
||||||
|
VERSION: ${{ steps.determine-version.outputs.version }}
|
||||||
|
|||||||
7
.github/workflows/sync-examples.yml
vendored
7
.github/workflows/sync-examples.yml
vendored
@@ -11,8 +11,9 @@ jobs:
|
|||||||
- name: Checkout Repository
|
- name: Checkout Repository
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
- name: Run GitHub File Sync
|
- name: Run GitHub File Sync
|
||||||
# Can update to v1 when https://github.com/BetaHuhn/repo-file-sync-action/issues/168 is resolved
|
uses: balazsorban44/repo-file-sync-action@master
|
||||||
uses: BetaHuhn/repo-file-sync-action@v1.16.5
|
|
||||||
with:
|
with:
|
||||||
GH_PAT: ${{ secrets.SYNC_EXAMPLE_PAT }}
|
GH_PAT: ${{ secrets.GH_PAT }}
|
||||||
|
IS_FINE_GRAINED: true
|
||||||
SKIP_PR: true
|
SKIP_PR: true
|
||||||
|
ORIGINAL_MESSAGE: true
|
||||||
|
|||||||
29
.gitignore
vendored
29
.gitignore
vendored
@@ -1,7 +1,6 @@
|
|||||||
# Misc
|
# Misc
|
||||||
.DS_Store
|
.DS_Store
|
||||||
.npmrc
|
.eslintcache
|
||||||
|
|
||||||
.env
|
.env
|
||||||
.env.local
|
.env.local
|
||||||
.env.development.local
|
.env.development.local
|
||||||
@@ -12,8 +11,9 @@ npm-debug.log*
|
|||||||
yarn-debug.log*
|
yarn-debug.log*
|
||||||
yarn-error.log*
|
yarn-error.log*
|
||||||
firebase-debug.log
|
firebase-debug.log
|
||||||
|
ui-debug.log
|
||||||
.pnpm-debug.log
|
.pnpm-debug.log
|
||||||
|
.husky
|
||||||
|
|
||||||
# Dependencies
|
# Dependencies
|
||||||
node_modules
|
node_modules
|
||||||
@@ -34,24 +34,22 @@ packages/next-auth/utils
|
|||||||
packages/next-auth/core
|
packages/next-auth/core
|
||||||
packages/next-auth/jwt
|
packages/next-auth/jwt
|
||||||
packages/next-auth/react
|
packages/next-auth/react
|
||||||
packages/next-auth/adapters.d.ts
|
|
||||||
packages/next-auth/adapters.js
|
|
||||||
packages/next-auth/index.d.ts
|
|
||||||
packages/next-auth/index.js
|
|
||||||
packages/next-auth/next
|
packages/next-auth/next
|
||||||
packages/next-auth/middleware.d.ts
|
packages/*/*.js
|
||||||
packages/next-auth/middleware.js
|
packages/*/*.d.ts
|
||||||
|
packages/*/*.d.ts.map
|
||||||
|
|
||||||
# Development app
|
# Development app
|
||||||
apps/dev/src/css
|
apps/dev/src/css
|
||||||
apps/dev/prisma/migrations
|
apps/dev/prisma/migrations
|
||||||
apps/dev/typeorm
|
apps/dev/typeorm
|
||||||
|
apps/dev/nextjs-2
|
||||||
|
|
||||||
# VS
|
# VS
|
||||||
/.vs/slnx.sqlite-journal
|
/.vs/slnx.sqlite-journal
|
||||||
/.vs/slnx.sqlite
|
/.vs/slnx.sqlite
|
||||||
/.vs
|
/.vs
|
||||||
.vscode
|
.vscode/generated*
|
||||||
|
|
||||||
# Jetbrains
|
# Jetbrains
|
||||||
.idea
|
.idea
|
||||||
@@ -81,11 +79,12 @@ docs/.docusaurus
|
|||||||
docs/providers.json
|
docs/providers.json
|
||||||
|
|
||||||
# Core
|
# Core
|
||||||
packages/core/adapters.*
|
packages/core/src/providers/oauth-types.ts
|
||||||
packages/core/index.*
|
|
||||||
packages/core/jwt
|
|
||||||
packages/core/lib
|
packages/core/lib
|
||||||
packages/core/providers
|
packages/core/providers
|
||||||
|
packages/core/src/lib/pages/styles.ts
|
||||||
|
docs/docs/reference/core
|
||||||
|
docs/docs/reference/sveltekit
|
||||||
|
|
||||||
|
|
||||||
# SvelteKit
|
# SvelteKit
|
||||||
@@ -95,3 +94,7 @@ packages/frameworks-sveltekit/.svelte-kit
|
|||||||
packages/frameworks-sveltekit/package
|
packages/frameworks-sveltekit/package
|
||||||
packages/frameworks-sveltekit/vite.config.js.timestamp-*
|
packages/frameworks-sveltekit/vite.config.js.timestamp-*
|
||||||
packages/frameworks-sveltekit/vite.config.ts.timestamp-*
|
packages/frameworks-sveltekit/vite.config.ts.timestamp-*
|
||||||
|
|
||||||
|
# Adapters
|
||||||
|
|
||||||
|
docs/docs/reference/adapter
|
||||||
1
.husky/.gitignore
vendored
1
.husky/.gitignore
vendored
@@ -1 +0,0 @@
|
|||||||
_
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
. "$(dirname "$0")/_/husky.sh"
|
|
||||||
|
|
||||||
# npx pretty-quick --staged
|
|
||||||
67
.prettierignore
Normal file
67
.prettierignore
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
.cache-loader
|
||||||
|
.DS_Store
|
||||||
|
.pnpm-debug.log
|
||||||
|
.turbo
|
||||||
|
.vscode/generated*
|
||||||
|
/_work
|
||||||
|
/actions-runner
|
||||||
|
node_modules
|
||||||
|
patches
|
||||||
|
pnpm-lock.yaml
|
||||||
|
.github/actions/issue-validator/index.mjs
|
||||||
|
*.d.ts
|
||||||
|
*.d.ts.map
|
||||||
|
|
||||||
|
.svelte-kit
|
||||||
|
.next
|
||||||
|
.nuxt
|
||||||
|
|
||||||
|
# --------------- Docs ---------------
|
||||||
|
|
||||||
|
.docusaurus
|
||||||
|
build
|
||||||
|
docs/docs/reference/core
|
||||||
|
docs/docs/reference/sveltekit
|
||||||
|
static
|
||||||
|
docs/providers.json
|
||||||
|
|
||||||
|
# --------------- Packages ---------------
|
||||||
|
|
||||||
|
coverage
|
||||||
|
dist
|
||||||
|
packages/**/*.cjs
|
||||||
|
packages/**/*.js
|
||||||
|
|
||||||
|
# @auth/core
|
||||||
|
packages/core/src/providers/oauth-types.ts
|
||||||
|
packages/core/src/lib/pages/styles.ts
|
||||||
|
|
||||||
|
# @auth/sveltekit
|
||||||
|
packages/frameworks-sveltekit/package
|
||||||
|
packages/frameworks-sveltekit/vite.config.{js,ts}.timestamp-*
|
||||||
|
|
||||||
|
# next-auth
|
||||||
|
packages/next-auth/src/providers/oauth-types.ts
|
||||||
|
packages/next-auth/css/index.css
|
||||||
|
|
||||||
|
|
||||||
|
# Adapters
|
||||||
|
.branches
|
||||||
|
db.sqlite
|
||||||
|
dev.db
|
||||||
|
dynamodblocal-bin
|
||||||
|
firebase-debug.log
|
||||||
|
firestore-debug.log
|
||||||
|
migrations
|
||||||
|
test.schema.gql
|
||||||
|
|
||||||
|
# --------------- Apps ---------------
|
||||||
|
|
||||||
|
|
||||||
|
# Examples should have their own Prettier config since they are templates too
|
||||||
|
apps/example-sveltekit
|
||||||
|
|
||||||
|
# Development app
|
||||||
|
apps/dev/prisma
|
||||||
|
apps/dev/migrations
|
||||||
|
apps/dev/typeorm
|
||||||
8
.vscode/settings.json
vendored
Normal file
8
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"files.exclude": {
|
||||||
|
"packages/core/{lib,providers,*.js,*.d.ts,*.d.ts.map}": true,
|
||||||
|
"packages/next-auth/{client,core,css,jwt,next,providers,react,utils,*.js,*.d.ts}": true
|
||||||
|
},
|
||||||
|
"typescript.tsdk": "node_modules/typescript/lib",
|
||||||
|
"openInGitHub.remote.branch": "main"
|
||||||
|
}
|
||||||
14
.vscode/snippets.code-snippets
vendored
Normal file
14
.vscode/snippets.code-snippets
vendored
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"oauth2-spec": {
|
||||||
|
"description": "Markdown link to OAuth 2 specification",
|
||||||
|
"scope": "typescript",
|
||||||
|
"prefix": "oauth2",
|
||||||
|
"body": ["[OAuth 2](https://datatracker.ietf.org/doc/html/rfc6749)"]
|
||||||
|
},
|
||||||
|
"oidc-spec": {
|
||||||
|
"description": "Markdown link to OpenID Connect specification",
|
||||||
|
"scope": "typescript",
|
||||||
|
"prefix": "oidc",
|
||||||
|
"body": ["[OIDC](https://openid.net/specs/openid-connect-core-1_0.html)"]
|
||||||
|
}
|
||||||
|
}
|
||||||
4
LICENSE
4
LICENSE
@@ -1,6 +1,6 @@
|
|||||||
ISC License
|
ISC License
|
||||||
|
|
||||||
Copyright (c) 2018-2021, Iain Collins
|
Copyright (c) 2022-2023, Balázs Orbán
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
Permission to use, copy, modify, and/or distribute this software for any
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
@@ -12,4 +12,4 @@ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|||||||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
|||||||
4
apps/dev/nextjs-v4/.vscode/settings.json
vendored
Normal file
4
apps/dev/nextjs-v4/.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"typescript.tsdk": "../../node_modules/.pnpm/typescript@4.8.4/node_modules/typescript/lib",
|
||||||
|
"typescript.enablePromptUseWorkspaceTsdk": true
|
||||||
|
}
|
||||||
14
apps/dev/nextjs-v4/app/api/auth/[...nextauth]/route.ts
Normal file
14
apps/dev/nextjs-v4/app/api/auth/[...nextauth]/route.ts
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import NextAuth, { type NextAuthOptions } from "next-auth"
|
||||||
|
import GitHub from "next-auth/providers/github"
|
||||||
|
|
||||||
|
export const authOptions: NextAuthOptions = {
|
||||||
|
providers: [
|
||||||
|
GitHub({
|
||||||
|
clientId: process.env.GITHUB_ID,
|
||||||
|
clientSecret: process.env.GITHUB_SECRET,
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
|
const handler = NextAuth(authOptions)
|
||||||
|
export { handler as GET, handler as POST }
|
||||||
6
apps/dev/nextjs-v4/app/server-component/page.tsx
Normal file
6
apps/dev/nextjs-v4/app/server-component/page.tsx
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
import { getServerSession } from "next-auth/next"
|
||||||
|
|
||||||
|
export default async function Page() {
|
||||||
|
const session = await getServerSession()
|
||||||
|
return <pre>{JSON.stringify(session, null, 2)}</pre>
|
||||||
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
/// <reference types="next" />
|
/// <reference types="next" />
|
||||||
/// <reference types="next/image-types/global" />
|
/// <reference types="next/image-types/global" />
|
||||||
|
/// <reference types="next/navigation-types/compat/navigation" />
|
||||||
|
|
||||||
// NOTE: This file should not be edited
|
// NOTE: This file should not be edited
|
||||||
// see https://nextjs.org/docs/basic-features/typescript for more information.
|
// see https://nextjs.org/docs/basic-features/typescript for more information.
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "next-auth-app",
|
"name": "next-auth-app-v4",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "NextAuth.js Developer app",
|
"description": "NextAuth.js Developer app",
|
||||||
"private": true,
|
"private": true,
|
||||||
@@ -15,22 +15,21 @@
|
|||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@next-auth/fauna-adapter": "workspace:*",
|
"@next-auth/fauna-adapter": "workspace:*",
|
||||||
"@next-auth/prisma-adapter": "workspace:*",
|
"@auth/prisma-adapter": "workspace:*",
|
||||||
"@next-auth/supabase-adapter": "workspace:*",
|
"@next-auth/supabase-adapter": "workspace:*",
|
||||||
"@next-auth/typeorm-legacy-adapter": "workspace:*",
|
"@auth/typeorm-adapter": "workspace:*",
|
||||||
"@prisma/client": "^3",
|
"@prisma/client": "^3",
|
||||||
"@supabase/supabase-js": "^2.0.5",
|
"@supabase/supabase-js": "^2.0.5",
|
||||||
"faunadb": "^4",
|
"faunadb": "^4",
|
||||||
"next": "13.0.6",
|
"next": "13.3.0",
|
||||||
"next-auth": "workspace:*",
|
"next-auth": "workspace:*",
|
||||||
"@auth/core": "workspace:*",
|
|
||||||
"nodemailer": "^6",
|
"nodemailer": "^6",
|
||||||
"react": "^18",
|
"react": "^18",
|
||||||
"react-dom": "^18"
|
"react-dom": "^18"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/jsonwebtoken": "^8.5.5",
|
"@types/jsonwebtoken": "^8.5.5",
|
||||||
"@types/react": "^18.0.15",
|
"@types/react": "^18.0.37",
|
||||||
"@types/react-dom": "^18.0.6",
|
"@types/react-dom": "^18.0.6",
|
||||||
"fake-smtp-server": "^0.8.0",
|
"fake-smtp-server": "^0.8.0",
|
||||||
"pg": "^8.7.3",
|
"pg": "^8.7.3",
|
||||||
132
apps/dev/nextjs-v4/pages/api/auth-old/[...nextauth].ts
Normal file
132
apps/dev/nextjs-v4/pages/api/auth-old/[...nextauth].ts
Normal file
@@ -0,0 +1,132 @@
|
|||||||
|
import NextAuth, { NextAuthOptions } from "next-auth"
|
||||||
|
|
||||||
|
// Providers
|
||||||
|
import Apple from "next-auth/providers/apple"
|
||||||
|
import Auth0 from "next-auth/providers/auth0"
|
||||||
|
import AzureAD from "next-auth/providers/azure-ad"
|
||||||
|
import AzureB2C from "next-auth/providers/azure-ad-b2c"
|
||||||
|
import BoxyHQSAML from "next-auth/providers/boxyhq-saml"
|
||||||
|
// import Cognito from "next-auth/providers/cognito"
|
||||||
|
import Credentials from "next-auth/providers/credentials"
|
||||||
|
import Discord from "next-auth/providers/discord"
|
||||||
|
import DuendeIDS6 from "next-auth/providers/duende-identity-server6"
|
||||||
|
// import Email from "next-auth/providers/email"
|
||||||
|
import Facebook from "next-auth/providers/facebook"
|
||||||
|
import Foursquare from "next-auth/providers/foursquare"
|
||||||
|
import Freshbooks from "next-auth/providers/freshbooks"
|
||||||
|
import GitHub from "next-auth/providers/github"
|
||||||
|
import Gitlab from "next-auth/providers/gitlab"
|
||||||
|
import Google from "next-auth/providers/google"
|
||||||
|
// import IDS4 from "next-auth/providers/identity-server4"
|
||||||
|
import Instagram from "next-auth/providers/instagram"
|
||||||
|
// import Keycloak from "next-auth/providers/keycloak"
|
||||||
|
import Line from "next-auth/providers/line"
|
||||||
|
import LinkedIn from "next-auth/providers/linkedin"
|
||||||
|
import Mailchimp from "next-auth/providers/mailchimp"
|
||||||
|
// import Okta from "next-auth/providers/okta"
|
||||||
|
import Osu from "next-auth/providers/osu"
|
||||||
|
import Patreon from "next-auth/providers/patreon"
|
||||||
|
import Slack from "next-auth/providers/slack"
|
||||||
|
import Spotify from "next-auth/providers/spotify"
|
||||||
|
import Trakt from "next-auth/providers/trakt"
|
||||||
|
import Twitch from "next-auth/providers/twitch"
|
||||||
|
import Twitter from "next-auth/providers/twitter"
|
||||||
|
import Vk from "next-auth/providers/vk"
|
||||||
|
import Wikimedia from "next-auth/providers/wikimedia"
|
||||||
|
import WorkOS from "next-auth/providers/workos"
|
||||||
|
|
||||||
|
// // Prisma
|
||||||
|
// import { PrismaClient } from "@prisma/client"
|
||||||
|
// import { PrismaAdapter } from "@auth/prisma-adapter"
|
||||||
|
// const client = globalThis.prisma || new PrismaClient()
|
||||||
|
// if (process.env.NODE_ENV !== "production") globalThis.prisma = client
|
||||||
|
// const adapter = PrismaAdapter(client)
|
||||||
|
|
||||||
|
// // Fauna
|
||||||
|
// import { Client as FaunaClient } from "faunadb"
|
||||||
|
// import { FaunaAdapter } from "@next-auth/fauna-adapter"
|
||||||
|
// const opts = { secret: process.env.FAUNA_SECRET, domain: process.env.FAUNA_DOMAIN }
|
||||||
|
// const client = globalThis.fauna || new FaunaClient(opts)
|
||||||
|
// if (process.env.NODE_ENV !== "production") globalThis.fauna = client
|
||||||
|
// const adapter = FaunaAdapter(client)
|
||||||
|
|
||||||
|
// // TypeORM
|
||||||
|
// import { TypeORMAdapter } from "@auth/typeorm-adapter"
|
||||||
|
// const adapter = TypeORMAdapter({
|
||||||
|
// type: "sqlite",
|
||||||
|
// name: "next-auth-test-memory",
|
||||||
|
// database: "./typeorm/dev.db",
|
||||||
|
// synchronize: true,
|
||||||
|
// })
|
||||||
|
|
||||||
|
// // Supabase
|
||||||
|
// import { SupabaseAdapter } from "@next-auth/supabase-adapter"
|
||||||
|
// const adapter = SupabaseAdapter({
|
||||||
|
// url: process.env.NEXT_PUBLIC_SUPABASE_URL,
|
||||||
|
// secret: process.env.SUPABASE_SERVICE_ROLE_KEY,
|
||||||
|
// })
|
||||||
|
|
||||||
|
export const authOptions: NextAuthOptions = {
|
||||||
|
// adapter,
|
||||||
|
// debug: process.env.NODE_ENV !== "production",
|
||||||
|
theme: {
|
||||||
|
logo: "https://next-auth.js.org/img/logo/logo-sm.png",
|
||||||
|
brandColor: "#1786fb",
|
||||||
|
},
|
||||||
|
providers: [
|
||||||
|
Credentials({
|
||||||
|
credentials: { password: { label: "Password", type: "password" } },
|
||||||
|
async authorize(credentials) {
|
||||||
|
if (credentials.password !== "pw") return null
|
||||||
|
return { name: "Fill Murray", email: "bill@fillmurray.com", image: "https://www.fillmurray.com/64/64", id: "1", foo: "" }
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
Apple({ clientId: process.env.APPLE_ID, clientSecret: process.env.APPLE_SECRET }),
|
||||||
|
Auth0({ clientId: process.env.AUTH0_ID, clientSecret: process.env.AUTH0_SECRET, issuer: process.env.AUTH0_ISSUER }),
|
||||||
|
AzureAD({
|
||||||
|
clientId: process.env.AZURE_AD_CLIENT_ID,
|
||||||
|
clientSecret: process.env.AZURE_AD_CLIENT_SECRET,
|
||||||
|
tenantId: process.env.AZURE_AD_TENANT_ID,
|
||||||
|
}),
|
||||||
|
AzureB2C({ clientId: process.env.AZURE_B2C_ID, clientSecret: process.env.AZURE_B2C_SECRET, issuer: process.env.AZURE_B2C_ISSUER }),
|
||||||
|
BoxyHQSAML({ issuer: "https://jackson-demo.boxyhq.com", clientId: "tenant=boxyhq.com&product=saml-demo.boxyhq.com", clientSecret: "dummy" }),
|
||||||
|
// Cognito({ clientId: process.env.COGNITO_ID, clientSecret: process.env.COGNITO_SECRET, issuer: process.env.COGNITO_ISSUER }),
|
||||||
|
Discord({ clientId: process.env.DISCORD_ID, clientSecret: process.env.DISCORD_SECRET }),
|
||||||
|
DuendeIDS6({ clientId: "interactive.confidential", clientSecret: "secret", issuer: "https://demo.duendesoftware.com" }),
|
||||||
|
Facebook({ clientId: process.env.FACEBOOK_ID, clientSecret: process.env.FACEBOOK_SECRET }),
|
||||||
|
Foursquare({ clientId: process.env.FOURSQUARE_ID, clientSecret: process.env.FOURSQUARE_SECRET }),
|
||||||
|
Freshbooks({ clientId: process.env.FRESHBOOKS_ID, clientSecret: process.env.FRESHBOOKS_SECRET }),
|
||||||
|
GitHub({ clientId: process.env.GITHUB_ID, clientSecret: process.env.GITHUB_SECRET }),
|
||||||
|
Gitlab({ clientId: process.env.GITLAB_ID, clientSecret: process.env.GITLAB_SECRET }),
|
||||||
|
Google({ clientId: process.env.GOOGLE_ID, clientSecret: process.env.GOOGLE_SECRET }),
|
||||||
|
// IDS4({ clientId: process.env.IDS4_ID, clientSecret: process.env.IDS4_SECRET, issuer: process.env.IDS4_ISSUER }),
|
||||||
|
Instagram({ clientId: process.env.INSTAGRAM_ID, clientSecret: process.env.INSTAGRAM_SECRET }),
|
||||||
|
// Keycloak({ clientId: process.env.KEYCLOAK_ID, clientSecret: process.env.KEYCLOAK_SECRET, issuer: process.env.KEYCLOAK_ISSUER }),
|
||||||
|
Line({ clientId: process.env.LINE_ID, clientSecret: process.env.LINE_SECRET }),
|
||||||
|
LinkedIn({ clientId: process.env.LINKEDIN_ID, clientSecret: process.env.LINKEDIN_SECRET }),
|
||||||
|
Mailchimp({ clientId: process.env.MAILCHIMP_ID, clientSecret: process.env.MAILCHIMP_SECRET }),
|
||||||
|
// Okta({ clientId: process.env.OKTA_ID, clientSecret: process.env.OKTA_SECRET, issuer: process.env.OKTA_ISSUER }),
|
||||||
|
Osu({ clientId: process.env.OSU_CLIENT_ID, clientSecret: process.env.OSU_CLIENT_SECRET }),
|
||||||
|
Patreon({ clientId: process.env.PATREON_ID, clientSecret: process.env.PATREON_SECRET }),
|
||||||
|
Slack({ clientId: process.env.SLACK_ID, clientSecret: process.env.SLACK_SECRET }),
|
||||||
|
Spotify({ clientId: process.env.SPOTIFY_ID, clientSecret: process.env.SPOTIFY_SECRET }),
|
||||||
|
Trakt({ clientId: process.env.TRAKT_ID, clientSecret: process.env.TRAKT_SECRET }),
|
||||||
|
Twitch({ clientId: process.env.TWITCH_ID, clientSecret: process.env.TWITCH_SECRET }),
|
||||||
|
Twitter({ clientId: process.env.TWITTER_ID, clientSecret: process.env.TWITTER_SECRET }),
|
||||||
|
// TwitterLegacy({ clientId: process.env.TWITTER_LEGACY_ID, clientSecret: process.env.TWITTER_LEGACY_SECRET }),
|
||||||
|
Vk({ clientId: process.env.VK_ID, clientSecret: process.env.VK_SECRET }),
|
||||||
|
Wikimedia({ clientId: process.env.WIKIMEDIA_ID, clientSecret: process.env.WIKIMEDIA_SECRET }),
|
||||||
|
WorkOS({ clientId: process.env.WORKOS_ID, clientSecret: process.env.WORKOS_SECRET }),
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
|
if (authOptions.adapter) {
|
||||||
|
// TODO:
|
||||||
|
// authOptions.providers.unshift(
|
||||||
|
// // NOTE: You can start a fake e-mail server with `pnpm email`
|
||||||
|
// // and then go to `http://localhost:1080` in the browser
|
||||||
|
// Email({ server: "smtp://127.0.0.1:1025?tls.rejectUnauthorized=false" })
|
||||||
|
// )
|
||||||
|
}
|
||||||
|
|
||||||
|
export default NextAuth(authOptions)
|
||||||
19
apps/dev/nextjs-v4/pages/api/examples/protected.js
Normal file
19
apps/dev/nextjs-v4/pages/api/examples/protected.js
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
// This is an example of to protect an API route
|
||||||
|
import { getServerSession } from "next-auth/next"
|
||||||
|
import { authOptions } from "../auth/[...nextauth]"
|
||||||
|
|
||||||
|
export default async (req, res) => {
|
||||||
|
const session = await getServerSession(req, res, authOptions)
|
||||||
|
|
||||||
|
if (session) {
|
||||||
|
res.send({
|
||||||
|
content:
|
||||||
|
"This is protected content. You can access this content because you are signed in.",
|
||||||
|
session,
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
res.send({
|
||||||
|
error: "You must be sign in to view the protected content on this page.",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
8
apps/dev/nextjs-v4/pages/api/examples/session.js
Normal file
8
apps/dev/nextjs-v4/pages/api/examples/session.js
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
// This is an example of how to access a session from an API route
|
||||||
|
import { getServerSession } from "next-auth/next"
|
||||||
|
import { authOptions } from "../auth/[...nextauth]"
|
||||||
|
|
||||||
|
export default async (req, res) => {
|
||||||
|
const session = await getServerSession(req, res, authOptions)
|
||||||
|
res.json(session)
|
||||||
|
}
|
||||||
30
apps/dev/nextjs-v4/pages/api/examples/supabase-rls.js
Normal file
30
apps/dev/nextjs-v4/pages/api/examples/supabase-rls.js
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
// This is an example of how to query data from Supabase with RLS.
|
||||||
|
// Learn more about Row Levele Security (RLS): https://supabase.com/docs/guides/auth/row-level-security
|
||||||
|
import { getServerSession } from "next-auth/next"
|
||||||
|
import { authOptions } from "../auth/[...nextauth]"
|
||||||
|
import { createClient } from "@supabase/supabase-js"
|
||||||
|
|
||||||
|
export default async (req, res) => {
|
||||||
|
const session = await getServerSession(req, res, authOptions)
|
||||||
|
|
||||||
|
if (!session)
|
||||||
|
return res.send(JSON.stringify({ error: "No session!" }, null, 2))
|
||||||
|
|
||||||
|
const { supabaseAccessToken } = session
|
||||||
|
|
||||||
|
const supabase = createClient(
|
||||||
|
process.env.NEXT_PUBLIC_SUPABASE_URL,
|
||||||
|
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY,
|
||||||
|
{
|
||||||
|
global: {
|
||||||
|
headers: {
|
||||||
|
Authorization: `Bearer ${supabaseAccessToken}`,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
// Now you can query with RLS enabled.
|
||||||
|
const { data, error } = await supabase.from("users").select("*")
|
||||||
|
|
||||||
|
res.send(JSON.stringify({ supabaseAccessToken, data, error }, null, 2))
|
||||||
|
}
|
||||||
48
apps/dev/nextjs-v4/pages/protected-ssr.js
Normal file
48
apps/dev/nextjs-v4/pages/protected-ssr.js
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
// This is an example of how to protect content using server rendering
|
||||||
|
import { getServerSession } from "next-auth/next"
|
||||||
|
import { authOptions } from "./api/auth/[...nextauth]"
|
||||||
|
import Layout from "../components/layout"
|
||||||
|
import AccessDenied from "../components/access-denied"
|
||||||
|
|
||||||
|
export default function Page({ content, session }) {
|
||||||
|
// If no session exists, display access denied message
|
||||||
|
if (!session) {
|
||||||
|
return (
|
||||||
|
<Layout>
|
||||||
|
<AccessDenied />
|
||||||
|
</Layout>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// If session exists, display content
|
||||||
|
return (
|
||||||
|
<Layout>
|
||||||
|
<h1>Protected Page</h1>
|
||||||
|
<p>
|
||||||
|
<strong>{content}</strong>
|
||||||
|
</p>
|
||||||
|
</Layout>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getServerSideProps(context) {
|
||||||
|
const session = await getServerSession(context.req, context.res, authOptions)
|
||||||
|
let content = null
|
||||||
|
|
||||||
|
if (session) {
|
||||||
|
const hostname = process.env.NEXTAUTH_URL || "http://localhost:3000"
|
||||||
|
const options = { headers: { cookie: context.req.headers.cookie } }
|
||||||
|
const res = await fetch(`${hostname}/api/examples/protected`, options)
|
||||||
|
const json = await res.json()
|
||||||
|
if (json.content) {
|
||||||
|
content = json.content
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
props: {
|
||||||
|
session,
|
||||||
|
content,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
46
apps/dev/nextjs-v4/pages/server.js
Normal file
46
apps/dev/nextjs-v4/pages/server.js
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
import { getServerSession } from "next-auth/next"
|
||||||
|
import Layout from "../components/layout"
|
||||||
|
import { authOptions } from "./api/auth/[...nextauth]"
|
||||||
|
|
||||||
|
export default function Page() {
|
||||||
|
// As this page uses Server Side Rendering, the `session` will be already
|
||||||
|
// populated on render without needing to go through a loading stage.
|
||||||
|
// This is possible because of the shared context configured in `_app.js` that
|
||||||
|
// is used by `useSession()`.
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Layout>
|
||||||
|
<h1>Server Side Rendering</h1>
|
||||||
|
<p>
|
||||||
|
This page uses the <strong>getServerSession()</strong> method in{" "}
|
||||||
|
<strong>getServerSideProps()</strong>.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Using <strong>getServerSession()</strong> in{" "}
|
||||||
|
<strong>getServerSideProps()</strong> is currently the recommended
|
||||||
|
approach, although the API may still change, if you need to support
|
||||||
|
Server Side Rendering with authentication.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Using <strong>getSession()</strong> is still recommended on the client.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
The advantage of Server Side Rendering is this page does not require
|
||||||
|
client side JavaScript.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
The disadvantage of Server Side Rendering is that this page is slower to
|
||||||
|
render.
|
||||||
|
</p>
|
||||||
|
</Layout>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Export the `session` prop to use sessions with Server Side Rendering
|
||||||
|
export async function getServerSideProps(context) {
|
||||||
|
return {
|
||||||
|
props: {
|
||||||
|
session: await getServerSession(context.req, context.res, authOptions),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
64
apps/dev/nextjs-v4/pages/supabase-ssr.js
Normal file
64
apps/dev/nextjs-v4/pages/supabase-ssr.js
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
// This is an example of how to protect content using server rendering
|
||||||
|
// and fetching data from Supabase with RLS enabled.
|
||||||
|
import { getServerSession } from "next-auth/next"
|
||||||
|
import { authOptions } from "./api/auth/[...nextauth]"
|
||||||
|
import { createClient } from "@supabase/supabase-js"
|
||||||
|
import Layout from "../components/layout"
|
||||||
|
import AccessDenied from "../components/access-denied"
|
||||||
|
|
||||||
|
export default function Page({ data, session }) {
|
||||||
|
// If no session exists, display access denied message
|
||||||
|
if (!session) {
|
||||||
|
return (
|
||||||
|
<Layout>
|
||||||
|
<AccessDenied />
|
||||||
|
</Layout>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// If session exists, display content
|
||||||
|
return (
|
||||||
|
<Layout>
|
||||||
|
<h1>Protected Page</h1>
|
||||||
|
<p>Data fetched during SSR from Supabase with RSL enabled:</p>
|
||||||
|
<pre>{JSON.stringify(data, null, 2)}</pre>
|
||||||
|
</Layout>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getServerSideProps(context) {
|
||||||
|
const session = await getServerSession(context.req, context.res, authOptions)
|
||||||
|
|
||||||
|
if (!session)
|
||||||
|
return {
|
||||||
|
props: {
|
||||||
|
session,
|
||||||
|
data: null,
|
||||||
|
error: "No session",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
const { supabaseAccessToken } = session
|
||||||
|
|
||||||
|
const supabase = createClient(
|
||||||
|
process.env.NEXT_PUBLIC_SUPABASE_URL,
|
||||||
|
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY,
|
||||||
|
{
|
||||||
|
global: {
|
||||||
|
headers: {
|
||||||
|
Authorization: `Bearer ${supabaseAccessToken}`,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
// Now you can query with RLS enabled.
|
||||||
|
const { data, error } = await supabase.from("users").select("*")
|
||||||
|
|
||||||
|
return {
|
||||||
|
props: {
|
||||||
|
session,
|
||||||
|
data,
|
||||||
|
error,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "Account" (
|
||||||
|
"id" TEXT NOT NULL PRIMARY KEY,
|
||||||
|
"userId" TEXT NOT NULL,
|
||||||
|
"type" TEXT NOT NULL,
|
||||||
|
"provider" TEXT NOT NULL,
|
||||||
|
"providerAccountId" TEXT NOT NULL,
|
||||||
|
"refresh_token" TEXT,
|
||||||
|
"access_token" TEXT,
|
||||||
|
"expires_at" INTEGER,
|
||||||
|
"token_type" TEXT,
|
||||||
|
"scope" TEXT,
|
||||||
|
"id_token" TEXT,
|
||||||
|
"session_state" TEXT,
|
||||||
|
"oauth_token_secret" TEXT,
|
||||||
|
"oauth_token" TEXT,
|
||||||
|
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
"updatedAt" DATETIME NOT NULL,
|
||||||
|
CONSTRAINT "Account_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "Session" (
|
||||||
|
"id" TEXT NOT NULL PRIMARY KEY,
|
||||||
|
"sessionToken" TEXT NOT NULL,
|
||||||
|
"userId" TEXT NOT NULL,
|
||||||
|
"expires" DATETIME NOT NULL,
|
||||||
|
CONSTRAINT "Session_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "User" (
|
||||||
|
"id" TEXT NOT NULL PRIMARY KEY,
|
||||||
|
"name" TEXT,
|
||||||
|
"email" TEXT,
|
||||||
|
"emailVerified" DATETIME,
|
||||||
|
"image" TEXT
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "VerificationToken" (
|
||||||
|
"identifier" TEXT NOT NULL,
|
||||||
|
"token" TEXT NOT NULL,
|
||||||
|
"expires" DATETIME NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE UNIQUE INDEX "Account_provider_providerAccountId_key" ON "Account"("provider", "providerAccountId");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE UNIQUE INDEX "Session_sessionToken_key" ON "Session"("sessionToken");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE UNIQUE INDEX "User_email_key" ON "User"("email");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE UNIQUE INDEX "VerificationToken_token_key" ON "VerificationToken"("token");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE UNIQUE INDEX "VerificationToken_identifier_token_key" ON "VerificationToken"("identifier", "token");
|
||||||
3
apps/dev/nextjs-v4/prisma/migrations/migration_lock.toml
Normal file
3
apps/dev/nextjs-v4/prisma/migrations/migration_lock.toml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Please do not edit this file manually
|
||||||
|
# It should be added in your version-control system (i.e. Git)
|
||||||
|
provider = "sqlite"
|
||||||
@@ -23,7 +23,8 @@
|
|||||||
{
|
{
|
||||||
"name": "next"
|
"name": "next"
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"strictNullChecks": true
|
||||||
},
|
},
|
||||||
"include": [
|
"include": [
|
||||||
"next-env.d.ts",
|
"next-env.d.ts",
|
||||||
75
apps/dev/nextjs/.env.local.example
Normal file
75
apps/dev/nextjs/.env.local.example
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
# Rename file to .env.local (or .env) and populate values
|
||||||
|
# to be able to run the dev app
|
||||||
|
|
||||||
|
NEXTAUTH_URL=http://localhost:3000
|
||||||
|
|
||||||
|
# You can use `openssl rand -hex 32` or
|
||||||
|
# https://generate-secret.vercel.app/32 to generate a secret.
|
||||||
|
# Note: Changing a secret may invalidate existing sessions
|
||||||
|
# and/or verification tokens.
|
||||||
|
NEXTAUTH_SECRET=secret
|
||||||
|
|
||||||
|
ASGARDEO_CLIENT_ID=
|
||||||
|
ASGARDEO_CLIENT_SECRET=
|
||||||
|
ASGARDEO_ISSUER=
|
||||||
|
|
||||||
|
AUTH0_ID=
|
||||||
|
AUTH0_SECRET=
|
||||||
|
AUTH0_ISSUER=
|
||||||
|
|
||||||
|
# Beyond Identity Provider
|
||||||
|
BEYOND_IDENTITY_CLIENT_ID=
|
||||||
|
BEYOND_IDENTITY_CLIENT_SECRET=
|
||||||
|
BEYOND_IDENTITY_ISSUER=
|
||||||
|
|
||||||
|
GITHUB_ID=
|
||||||
|
GITHUB_SECRET=
|
||||||
|
|
||||||
|
NOTION_ID=
|
||||||
|
NOTION_SECRET=
|
||||||
|
NOTION_REDIRECT_URI=
|
||||||
|
|
||||||
|
IDS4_ID=
|
||||||
|
IDS4_SECRET=
|
||||||
|
IDS4_ISSUER=
|
||||||
|
|
||||||
|
KEYCLOAK_ID=
|
||||||
|
KEYCLOAK_SECRET=
|
||||||
|
KEYCLOAK_ISSUER=
|
||||||
|
|
||||||
|
LINE_ID=
|
||||||
|
LINE_SECRET=
|
||||||
|
|
||||||
|
TRAKT_ID=
|
||||||
|
TRAKT_SECRET=
|
||||||
|
|
||||||
|
TWITCH_ID=
|
||||||
|
TWITCH_SECRET=
|
||||||
|
|
||||||
|
TWITTER_ID=
|
||||||
|
TWITTER_SECRET=
|
||||||
|
|
||||||
|
WIKIMEDIA_ID=
|
||||||
|
WIKIMEDIA_SECRET=
|
||||||
|
|
||||||
|
# Yandex OAuth. new app -> https://oauth.yandex.com/client/new/id
|
||||||
|
YANDEX_ID=
|
||||||
|
YANDEX_SECRET=
|
||||||
|
|
||||||
|
# Example configuration for a Gmail account (will need SMTP enabled)
|
||||||
|
EMAIL_SERVER=smtps://user@gmail.com:password@smtp.gmail.com:465
|
||||||
|
EMAIL_FROM=user@gmail.com
|
||||||
|
|
||||||
|
# Note: If using with Prisma adapter, you need to use a `.env`
|
||||||
|
# file rather than a `.env.local` file to configure env vars.
|
||||||
|
# Postgres: DATABASE_URL=postgres://nextauth:password@127.0.0.1:5432/nextauth?synchronize=true
|
||||||
|
# MySQL: DATABASE_URL=mysql://nextauth:password@127.0.0.1:3306/nextauth?synchronize=true
|
||||||
|
# MongoDB: DATABASE_URL=mongodb://nextauth:password@127.0.0.1:27017/nextauth?synchronize=true
|
||||||
|
DATABASE_URL=
|
||||||
|
|
||||||
|
# Supabase Example Configuration
|
||||||
|
# Supabase Example Configuration
|
||||||
|
# NEXT_PUBLIC_SUPABASE_URL=http://localhost:54321
|
||||||
|
# SUPABASE_SERVICE_ROLE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6InNlcnZpY2Vfcm9sZSJ9.vI9obAHOGyVVKa3pD--kJlyxp-Z2zV9UUMAhKpNLAcU
|
||||||
|
# SUPABASE_JWT_SECRET=super-secret-jwt-token-with-at-least-32-characters-long
|
||||||
|
# NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24ifQ.625_WdcF3KHqz5amU0x2X5WWHP-OEs_4qj0ssLNHzTs
|
||||||
4
apps/dev/nextjs/.gitignore
vendored
Normal file
4
apps/dev/nextjs/.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
node_modules/
|
||||||
|
/test-results/
|
||||||
|
/playwright-report/
|
||||||
|
/playwright/.cache/
|
||||||
4
apps/dev/nextjs/.vscode/settings.json
vendored
Normal file
4
apps/dev/nextjs/.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"typescript.tsdk": "../../../node_modules/.pnpm/typescript@4.9.4/node_modules/typescript/lib",
|
||||||
|
"typescript.enablePromptUseWorkspaceTsdk": true
|
||||||
|
}
|
||||||
6
apps/dev/nextjs/README.md
Normal file
6
apps/dev/nextjs/README.md
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
# NextAuth.js Development App
|
||||||
|
|
||||||
|
This folder contains a Next.js app using NextAuth.js for local development. See the following section on how to start:
|
||||||
|
|
||||||
|
[Setting up local environment
|
||||||
|
](https://github.com/nextauthjs/.github/blob/main/CONTRIBUTING.md#setting-up-local-environment)
|
||||||
12
apps/dev/nextjs/app/layout.tsx
Normal file
12
apps/dev/nextjs/app/layout.tsx
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
export default function RootLayout({
|
||||||
|
children,
|
||||||
|
}: {
|
||||||
|
children: React.ReactNode
|
||||||
|
}) {
|
||||||
|
return (
|
||||||
|
<html>
|
||||||
|
<head></head>
|
||||||
|
<body>{children}</body>
|
||||||
|
</html>
|
||||||
|
)
|
||||||
|
}
|
||||||
28
apps/dev/nextjs/components/footer.js
Normal file
28
apps/dev/nextjs/components/footer.js
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
import Link from "next/link"
|
||||||
|
import styles from "./footer.module.css"
|
||||||
|
import packageJSON from "package.json"
|
||||||
|
|
||||||
|
export default function Footer() {
|
||||||
|
return (
|
||||||
|
<footer className={styles.footer}>
|
||||||
|
<hr />
|
||||||
|
<ul className={styles.navItems}>
|
||||||
|
<li className={styles.navItem}>
|
||||||
|
<a href="https://authjs.dev">Documentation</a>
|
||||||
|
</li>
|
||||||
|
<li className={styles.navItem}>
|
||||||
|
<a href="https://www.npmjs.com/package/@auth/core">NPM</a>
|
||||||
|
</li>
|
||||||
|
<li className={styles.navItem}>
|
||||||
|
<a href="https://github.com/nextauthjs/next-auth-example">GitHub</a>
|
||||||
|
</li>
|
||||||
|
<li className={styles.navItem}>
|
||||||
|
<Link href="/policy">Policy</Link>
|
||||||
|
</li>
|
||||||
|
<li className={styles.navItem}>
|
||||||
|
<em>{packageJSON.version}</em>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</footer>
|
||||||
|
)
|
||||||
|
}
|
||||||
89
apps/dev/nextjs/components/header.js
Normal file
89
apps/dev/nextjs/components/header.js
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
import Link from "next/link"
|
||||||
|
import { useSession } from "next-auth/react"
|
||||||
|
import styles from "./header.module.css"
|
||||||
|
|
||||||
|
// The approach used in this component shows how to built a sign in and sign out
|
||||||
|
// component that works on pages which support both client and server side
|
||||||
|
// rendering, and avoids any flash incorrect content on initial page load.
|
||||||
|
export default function Header() {
|
||||||
|
const { data: session, status } = useSession()
|
||||||
|
|
||||||
|
return (
|
||||||
|
<header>
|
||||||
|
<noscript>
|
||||||
|
<style>{".nojs-show { opacity: 1; top: 0; }"}</style>
|
||||||
|
</noscript>
|
||||||
|
<div className={styles.signedInStatus}>
|
||||||
|
<p
|
||||||
|
className={`nojs-show ${
|
||||||
|
!session && status === "loading" ? styles.loading : styles.loaded
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
{!session && (
|
||||||
|
<>
|
||||||
|
<span className={styles.notSignedInText}>
|
||||||
|
You are not signed in
|
||||||
|
</span>
|
||||||
|
<a href="/api/auth/signin" className={styles.buttonPrimary}>
|
||||||
|
Sign in
|
||||||
|
</a>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
{session && (
|
||||||
|
<>
|
||||||
|
{session.user.image && (
|
||||||
|
<img src={session.user.image} className={styles.avatar} />
|
||||||
|
)}
|
||||||
|
<span className={styles.signedInText}>
|
||||||
|
<small>Signed in as</small>
|
||||||
|
<br />
|
||||||
|
<strong>{session.user.email} </strong>
|
||||||
|
{session.user.name ? `(${session.user.name})` : null}
|
||||||
|
</span>
|
||||||
|
<a href="/api/auth/signout" className={styles.button}>
|
||||||
|
Sign out
|
||||||
|
</a>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<nav>
|
||||||
|
<ul className={styles.navItems}>
|
||||||
|
<li className={styles.navItem}>
|
||||||
|
<Link href="/">Home</Link>
|
||||||
|
</li>
|
||||||
|
<li className={styles.navItem}>
|
||||||
|
<Link href="/client">Client</Link>
|
||||||
|
</li>
|
||||||
|
<li className={styles.navItem}>
|
||||||
|
<Link href="/server">Server</Link>
|
||||||
|
</li>
|
||||||
|
<li className={styles.navItem}>
|
||||||
|
<Link href="/protected">Protected</Link>
|
||||||
|
</li>
|
||||||
|
<li className={styles.navItem}>
|
||||||
|
<Link href="/protected-ssr">Protected(SSR)</Link>
|
||||||
|
</li>
|
||||||
|
<li className={styles.navItem}>
|
||||||
|
<Link href="/api-example">API</Link>
|
||||||
|
</li>
|
||||||
|
<li className={styles.navItem}>
|
||||||
|
<Link href="/credentials">Credentials</Link>
|
||||||
|
</li>
|
||||||
|
<li className={styles.navItem}>
|
||||||
|
<Link href="/email">Email</Link>
|
||||||
|
</li>
|
||||||
|
<li className={styles.navItem}>
|
||||||
|
<Link href="/middleware-protected">Middleware protected</Link>
|
||||||
|
</li>
|
||||||
|
<li className={styles.navItem}>
|
||||||
|
<Link href="/supabase-client-rls">Supabase RLS</Link>
|
||||||
|
</li>
|
||||||
|
<li className={styles.navItem}>
|
||||||
|
<Link href="/supabase-ssr">Supabase RLS(SSR)</Link>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
)
|
||||||
|
}
|
||||||
12
apps/dev/nextjs/components/layout.js
Normal file
12
apps/dev/nextjs/components/layout.js
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import Header from "components/header"
|
||||||
|
import Footer from "components/footer"
|
||||||
|
|
||||||
|
export default function Layout({ children }) {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Header />
|
||||||
|
<main>{children}</main>
|
||||||
|
<Footer />
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
45
apps/dev/nextjs/middleware.ts
Normal file
45
apps/dev/nextjs/middleware.ts
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
export { default } from "next-auth/middleware"
|
||||||
|
|
||||||
|
export const config = { matcher: ["/middleware-protected"] }
|
||||||
|
|
||||||
|
// Other ways to use this middleware
|
||||||
|
|
||||||
|
// import withAuth from "next-auth/middleware"
|
||||||
|
// import { withAuth } from "next-auth/middleware"
|
||||||
|
|
||||||
|
// export function middleware(req, ev) {
|
||||||
|
// return withAuth(req)
|
||||||
|
// }
|
||||||
|
|
||||||
|
// export function middleware(req, ev) {
|
||||||
|
// return withAuth(req, ev)
|
||||||
|
// }
|
||||||
|
|
||||||
|
// export function middleware(req, ev) {
|
||||||
|
// return withAuth(req, {
|
||||||
|
// callbacks: {
|
||||||
|
// authorized: ({ token }) => !!token,
|
||||||
|
// },
|
||||||
|
// })
|
||||||
|
// }
|
||||||
|
|
||||||
|
// export default withAuth(function middleware(req, ev) {
|
||||||
|
// console.log(req.nextauth.token)
|
||||||
|
// })
|
||||||
|
|
||||||
|
// export default withAuth(
|
||||||
|
// function middleware(req, ev) {
|
||||||
|
// console.log(req, ev)
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// callbacks: {
|
||||||
|
// authorized: ({ token }) => token.name === "Balázs Orbán",
|
||||||
|
// },
|
||||||
|
// }
|
||||||
|
// )
|
||||||
|
|
||||||
|
// export default withAuth({
|
||||||
|
// callbacks: {
|
||||||
|
// authorized: ({ token }) => !!token,
|
||||||
|
// },
|
||||||
|
// })
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
/// <reference types="next" />
|
/// <reference types="next" />
|
||||||
/// <reference types="next/image-types/global" />
|
/// <reference types="next/image-types/global" />
|
||||||
|
/// <reference types="next/navigation-types/compat/navigation" />
|
||||||
|
|
||||||
// NOTE: This file should not be edited
|
// NOTE: This file should not be edited
|
||||||
// see https://nextjs.org/docs/basic-features/typescript for more information.
|
// see https://nextjs.org/docs/basic-features/typescript for more information.
|
||||||
9
apps/dev/nextjs/next.config.js
Normal file
9
apps/dev/nextjs/next.config.js
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
/** @type {import("next").NextConfig} */
|
||||||
|
module.exports = {
|
||||||
|
webpack(config) {
|
||||||
|
config.experiments = { ...config.experiments, topLevelAwait: true }
|
||||||
|
return config
|
||||||
|
},
|
||||||
|
experimental: { appDir: true },
|
||||||
|
typescript: { ignoreBuildErrors: true },
|
||||||
|
}
|
||||||
43
apps/dev/nextjs/package.json
Normal file
43
apps/dev/nextjs/package.json
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"name": "next-auth-app",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Next.js + Auth.js Developer app",
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"clean": "rm -rf .next",
|
||||||
|
"dev": "next dev",
|
||||||
|
"build": "next build",
|
||||||
|
"start": "next start",
|
||||||
|
"email": "fake-smtp-server",
|
||||||
|
"start:email": "pnpm email",
|
||||||
|
"e2e": "pnpm dlx playwright test"
|
||||||
|
},
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"@auth/core": "workspace:*",
|
||||||
|
"@next-auth/fauna-adapter": "workspace:*",
|
||||||
|
"@auth/prisma-adapter": "workspace:*",
|
||||||
|
"@next-auth/supabase-adapter": "workspace:*",
|
||||||
|
"@auth/typeorm-adapter": "workspace:*",
|
||||||
|
"@prisma/client": "^3",
|
||||||
|
"@supabase/supabase-js": "^2.0.5",
|
||||||
|
"faunadb": "^4",
|
||||||
|
"next": "13.3.0",
|
||||||
|
"next-auth": "workspace:*",
|
||||||
|
"nodemailer": "^6",
|
||||||
|
"react": "^18",
|
||||||
|
"react-dom": "^18"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@playwright/test": "1.29.2",
|
||||||
|
"@types/jsonwebtoken": "^8.5.5",
|
||||||
|
"@types/react": "18.0.37",
|
||||||
|
"@types/react-dom": "^18.0.6",
|
||||||
|
"dotenv": "^16.0.3",
|
||||||
|
"fake-smtp-server": "^0.8.0",
|
||||||
|
"pg": "^8.7.3",
|
||||||
|
"prisma": "^3",
|
||||||
|
"sqlite3": "^5.0.8",
|
||||||
|
"typeorm": "0.3.7"
|
||||||
|
}
|
||||||
|
}
|
||||||
10
apps/dev/nextjs/pages/_app.js
Normal file
10
apps/dev/nextjs/pages/_app.js
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
import { SessionProvider } from "next-auth/react"
|
||||||
|
import "./styles.css"
|
||||||
|
|
||||||
|
export default function App({ Component, pageProps }) {
|
||||||
|
return (
|
||||||
|
<SessionProvider session={pageProps.session}>
|
||||||
|
<Component {...pageProps} />
|
||||||
|
</SessionProvider>
|
||||||
|
)
|
||||||
|
}
|
||||||
19
apps/dev/nextjs/pages/api-example.js
Normal file
19
apps/dev/nextjs/pages/api-example.js
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import Layout from "../components/layout"
|
||||||
|
|
||||||
|
export default function Page() {
|
||||||
|
return (
|
||||||
|
<Layout>
|
||||||
|
<h1>API Example</h1>
|
||||||
|
<p>The examples below show responses from the example API endpoints.</p>
|
||||||
|
<p>
|
||||||
|
<em>You must be signed in to see responses.</em>
|
||||||
|
</p>
|
||||||
|
<h2>Session</h2>
|
||||||
|
<p>/api/examples/session</p>
|
||||||
|
<iframe src="/api/examples/session" />
|
||||||
|
<h2>JSON Web Token</h2>
|
||||||
|
<p>/api/examples/jwt</p>
|
||||||
|
<iframe src="/api/examples/jwt" />
|
||||||
|
</Layout>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -1,10 +1,12 @@
|
|||||||
import { AuthHandler, type AuthOptions } from "@auth/core"
|
import { Auth, type AuthConfig } from "@auth/core"
|
||||||
|
|
||||||
// Providers
|
// Providers
|
||||||
import Apple from "@auth/core/providers/apple"
|
import Apple from "@auth/core/providers/apple"
|
||||||
|
import Asgardeo from "@auth/core/providers/asgardeo"
|
||||||
import Auth0 from "@auth/core/providers/auth0"
|
import Auth0 from "@auth/core/providers/auth0"
|
||||||
import AzureAD from "@auth/core/providers/azure-ad"
|
import AzureAD from "@auth/core/providers/azure-ad"
|
||||||
import AzureB2C from "@auth/core/providers/azure-ad-b2c"
|
import AzureB2C from "@auth/core/providers/azure-ad-b2c"
|
||||||
|
import BeyondIdentity from "@auth/core/providers/beyondidentity"
|
||||||
import BoxyHQSAML from "@auth/core/providers/boxyhq-saml"
|
import BoxyHQSAML from "@auth/core/providers/boxyhq-saml"
|
||||||
// import Cognito from "@auth/core/providers/cognito"
|
// import Cognito from "@auth/core/providers/cognito"
|
||||||
import Credentials from "@auth/core/providers/credentials"
|
import Credentials from "@auth/core/providers/credentials"
|
||||||
@@ -23,6 +25,7 @@ import Instagram from "@auth/core/providers/instagram"
|
|||||||
import Line from "@auth/core/providers/line"
|
import Line from "@auth/core/providers/line"
|
||||||
import LinkedIn from "@auth/core/providers/linkedin"
|
import LinkedIn from "@auth/core/providers/linkedin"
|
||||||
import Mailchimp from "@auth/core/providers/mailchimp"
|
import Mailchimp from "@auth/core/providers/mailchimp"
|
||||||
|
import Notion from "@auth/core/providers/notion"
|
||||||
// import Okta from "@auth/core/providers/okta"
|
// import Okta from "@auth/core/providers/okta"
|
||||||
import Osu from "@auth/core/providers/osu"
|
import Osu from "@auth/core/providers/osu"
|
||||||
import Patreon from "@auth/core/providers/patreon"
|
import Patreon from "@auth/core/providers/patreon"
|
||||||
@@ -31,13 +34,14 @@ import Spotify from "@auth/core/providers/spotify"
|
|||||||
import Trakt from "@auth/core/providers/trakt"
|
import Trakt from "@auth/core/providers/trakt"
|
||||||
import Twitch from "@auth/core/providers/twitch"
|
import Twitch from "@auth/core/providers/twitch"
|
||||||
import Twitter from "@auth/core/providers/twitter"
|
import Twitter from "@auth/core/providers/twitter"
|
||||||
|
import Yandex from "@auth/core/providers/yandex"
|
||||||
import Vk from "@auth/core/providers/vk"
|
import Vk from "@auth/core/providers/vk"
|
||||||
import Wikimedia from "@auth/core/providers/wikimedia"
|
import Wikimedia from "@auth/core/providers/wikimedia"
|
||||||
import WorkOS from "@auth/core/providers/workos"
|
import WorkOS from "@auth/core/providers/workos"
|
||||||
|
|
||||||
// // Prisma
|
// // Prisma
|
||||||
// import { PrismaClient } from "@prisma/client"
|
// import { PrismaClient } from "@prisma/client"
|
||||||
// import { PrismaAdapter } from "@next-auth/prisma-adapter"
|
// import { PrismaAdapter } from "@auth/prisma-adapter"
|
||||||
// const client = globalThis.prisma || new PrismaClient()
|
// const client = globalThis.prisma || new PrismaClient()
|
||||||
// if (process.env.NODE_ENV !== "production") globalThis.prisma = client
|
// if (process.env.NODE_ENV !== "production") globalThis.prisma = client
|
||||||
// const adapter = PrismaAdapter(client)
|
// const adapter = PrismaAdapter(client)
|
||||||
@@ -51,8 +55,8 @@ import WorkOS from "@auth/core/providers/workos"
|
|||||||
// const adapter = FaunaAdapter(client)
|
// const adapter = FaunaAdapter(client)
|
||||||
|
|
||||||
// // TypeORM
|
// // TypeORM
|
||||||
// import { TypeORMLegacyAdapter } from "@next-auth/typeorm-legacy-adapter"
|
// import { TypeORMAdapter } from "@auth/typeorm-adapter"
|
||||||
// const adapter = TypeORMLegacyAdapter({
|
// const adapter = TypeORMAdapter({
|
||||||
// type: "sqlite",
|
// type: "sqlite",
|
||||||
// name: "next-auth-test-memory",
|
// name: "next-auth-test-memory",
|
||||||
// database: "./typeorm/dev.db",
|
// database: "./typeorm/dev.db",
|
||||||
@@ -66,9 +70,9 @@ import WorkOS from "@auth/core/providers/workos"
|
|||||||
// secret: process.env.SUPABASE_SERVICE_ROLE_KEY,
|
// secret: process.env.SUPABASE_SERVICE_ROLE_KEY,
|
||||||
// })
|
// })
|
||||||
|
|
||||||
export const authOptions: AuthOptions = {
|
export const authConfig: AuthConfig = {
|
||||||
// adapter,
|
// adapter,
|
||||||
// debug: process.env.NODE_ENV !== "production",
|
debug: process.env.NODE_ENV !== "production",
|
||||||
theme: {
|
theme: {
|
||||||
logo: "https://next-auth.js.org/img/logo/logo-sm.png",
|
logo: "https://next-auth.js.org/img/logo/logo-sm.png",
|
||||||
brandColor: "#1786fb",
|
brandColor: "#1786fb",
|
||||||
@@ -82,6 +86,7 @@ export const authOptions: AuthOptions = {
|
|||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
Apple({ clientId: process.env.APPLE_ID, clientSecret: process.env.APPLE_SECRET }),
|
Apple({ clientId: process.env.APPLE_ID, clientSecret: process.env.APPLE_SECRET }),
|
||||||
|
Asgardeo({ clientId: process.env.ASGARDEO_CLIENT_ID, clientSecret: process.env.ASGARDEO_CLIENT_SECRET, issuer: process.env.ASGARDEO_ISSUER }),
|
||||||
Auth0({ clientId: process.env.AUTH0_ID, clientSecret: process.env.AUTH0_SECRET, issuer: process.env.AUTH0_ISSUER }),
|
Auth0({ clientId: process.env.AUTH0_ID, clientSecret: process.env.AUTH0_SECRET, issuer: process.env.AUTH0_ISSUER }),
|
||||||
AzureAD({
|
AzureAD({
|
||||||
clientId: process.env.AZURE_AD_CLIENT_ID,
|
clientId: process.env.AZURE_AD_CLIENT_ID,
|
||||||
@@ -89,6 +94,7 @@ export const authOptions: AuthOptions = {
|
|||||||
tenantId: process.env.AZURE_AD_TENANT_ID,
|
tenantId: process.env.AZURE_AD_TENANT_ID,
|
||||||
}),
|
}),
|
||||||
AzureB2C({ clientId: process.env.AZURE_B2C_ID, clientSecret: process.env.AZURE_B2C_SECRET, issuer: process.env.AZURE_B2C_ISSUER }),
|
AzureB2C({ clientId: process.env.AZURE_B2C_ID, clientSecret: process.env.AZURE_B2C_SECRET, issuer: process.env.AZURE_B2C_ISSUER }),
|
||||||
|
BeyondIdentity({ clientId: process.env.BEYOND_IDENTITY_CLIENT_ID, clientSecret: process.env.BEYOND_IDENTITY_CLIENT_SECRET, issuer: process.env.BEYOND_IDENTITY_ISSUER }),
|
||||||
BoxyHQSAML({ issuer: "https://jackson-demo.boxyhq.com", clientId: "tenant=boxyhq.com&product=saml-demo.boxyhq.com", clientSecret: "dummy" }),
|
BoxyHQSAML({ issuer: "https://jackson-demo.boxyhq.com", clientId: "tenant=boxyhq.com&product=saml-demo.boxyhq.com", clientSecret: "dummy" }),
|
||||||
// Cognito({ clientId: process.env.COGNITO_ID, clientSecret: process.env.COGNITO_SECRET, issuer: process.env.COGNITO_ISSUER }),
|
// Cognito({ clientId: process.env.COGNITO_ID, clientSecret: process.env.COGNITO_SECRET, issuer: process.env.COGNITO_ISSUER }),
|
||||||
Discord({ clientId: process.env.DISCORD_ID, clientSecret: process.env.DISCORD_SECRET }),
|
Discord({ clientId: process.env.DISCORD_ID, clientSecret: process.env.DISCORD_SECRET }),
|
||||||
@@ -96,7 +102,7 @@ export const authOptions: AuthOptions = {
|
|||||||
Facebook({ clientId: process.env.FACEBOOK_ID, clientSecret: process.env.FACEBOOK_SECRET }),
|
Facebook({ clientId: process.env.FACEBOOK_ID, clientSecret: process.env.FACEBOOK_SECRET }),
|
||||||
Foursquare({ clientId: process.env.FOURSQUARE_ID, clientSecret: process.env.FOURSQUARE_SECRET }),
|
Foursquare({ clientId: process.env.FOURSQUARE_ID, clientSecret: process.env.FOURSQUARE_SECRET }),
|
||||||
Freshbooks({ clientId: process.env.FRESHBOOKS_ID, clientSecret: process.env.FRESHBOOKS_SECRET }),
|
Freshbooks({ clientId: process.env.FRESHBOOKS_ID, clientSecret: process.env.FRESHBOOKS_SECRET }),
|
||||||
GitHub({ clientId: process.env.GITHUB_ID, clientSecret: process.env.GITHUB_SECRET }),
|
GitHub({ clientId: process.env.GITHUB_ID, clientSecret: process.env.GITHUB_SECRET, redirectProxy: process.env.AUTH_REDIRECT_PROXY_URL }),
|
||||||
Gitlab({ clientId: process.env.GITLAB_ID, clientSecret: process.env.GITLAB_SECRET }),
|
Gitlab({ clientId: process.env.GITLAB_ID, clientSecret: process.env.GITLAB_SECRET }),
|
||||||
Google({ clientId: process.env.GOOGLE_ID, clientSecret: process.env.GOOGLE_SECRET }),
|
Google({ clientId: process.env.GOOGLE_ID, clientSecret: process.env.GOOGLE_SECRET }),
|
||||||
// IDS4({ clientId: process.env.IDS4_ID, clientSecret: process.env.IDS4_SECRET, issuer: process.env.IDS4_ISSUER }),
|
// IDS4({ clientId: process.env.IDS4_ID, clientSecret: process.env.IDS4_SECRET, issuer: process.env.IDS4_ISSUER }),
|
||||||
@@ -105,6 +111,7 @@ export const authOptions: AuthOptions = {
|
|||||||
Line({ clientId: process.env.LINE_ID, clientSecret: process.env.LINE_SECRET }),
|
Line({ clientId: process.env.LINE_ID, clientSecret: process.env.LINE_SECRET }),
|
||||||
LinkedIn({ clientId: process.env.LINKEDIN_ID, clientSecret: process.env.LINKEDIN_SECRET }),
|
LinkedIn({ clientId: process.env.LINKEDIN_ID, clientSecret: process.env.LINKEDIN_SECRET }),
|
||||||
Mailchimp({ clientId: process.env.MAILCHIMP_ID, clientSecret: process.env.MAILCHIMP_SECRET }),
|
Mailchimp({ clientId: process.env.MAILCHIMP_ID, clientSecret: process.env.MAILCHIMP_SECRET }),
|
||||||
|
Notion({ clientId: process.env.NOTION_ID, clientSecret: process.env.NOTION_SECRET, redirectUri: process.env.NOTION_REDIRECT_URI }),
|
||||||
// Okta({ clientId: process.env.OKTA_ID, clientSecret: process.env.OKTA_SECRET, issuer: process.env.OKTA_ISSUER }),
|
// Okta({ clientId: process.env.OKTA_ID, clientSecret: process.env.OKTA_SECRET, issuer: process.env.OKTA_ISSUER }),
|
||||||
Osu({ clientId: process.env.OSU_CLIENT_ID, clientSecret: process.env.OSU_CLIENT_SECRET }),
|
Osu({ clientId: process.env.OSU_CLIENT_ID, clientSecret: process.env.OSU_CLIENT_SECRET }),
|
||||||
Patreon({ clientId: process.env.PATREON_ID, clientSecret: process.env.PATREON_SECRET }),
|
Patreon({ clientId: process.env.PATREON_ID, clientSecret: process.env.PATREON_SECRET }),
|
||||||
@@ -114,13 +121,15 @@ export const authOptions: AuthOptions = {
|
|||||||
Twitch({ clientId: process.env.TWITCH_ID, clientSecret: process.env.TWITCH_SECRET }),
|
Twitch({ clientId: process.env.TWITCH_ID, clientSecret: process.env.TWITCH_SECRET }),
|
||||||
Twitter({ clientId: process.env.TWITTER_ID, clientSecret: process.env.TWITTER_SECRET }),
|
Twitter({ clientId: process.env.TWITTER_ID, clientSecret: process.env.TWITTER_SECRET }),
|
||||||
// TwitterLegacy({ clientId: process.env.TWITTER_LEGACY_ID, clientSecret: process.env.TWITTER_LEGACY_SECRET }),
|
// TwitterLegacy({ clientId: process.env.TWITTER_LEGACY_ID, clientSecret: process.env.TWITTER_LEGACY_SECRET }),
|
||||||
|
Yandex({ clientId: process.env.YANDEX_ID, clientSecret: process.env.YANDEX_SECRET }),
|
||||||
Vk({ clientId: process.env.VK_ID, clientSecret: process.env.VK_SECRET }),
|
Vk({ clientId: process.env.VK_ID, clientSecret: process.env.VK_SECRET }),
|
||||||
Wikimedia({ clientId: process.env.WIKIMEDIA_ID, clientSecret: process.env.WIKIMEDIA_SECRET }),
|
Wikimedia({ clientId: process.env.WIKIMEDIA_ID, clientSecret: process.env.WIKIMEDIA_SECRET }),
|
||||||
WorkOS({ clientId: process.env.WORKOS_ID, clientSecret: process.env.WORKOS_SECRET }),
|
WorkOS({ clientId: process.env.WORKOS_ID, clientSecret: process.env.WORKOS_SECRET }),
|
||||||
],
|
],
|
||||||
|
// debug: process.env.NODE_ENV !== "production",
|
||||||
}
|
}
|
||||||
|
|
||||||
if (authOptions.adapter) {
|
if (authConfig.adapter) {
|
||||||
// TODO:
|
// TODO:
|
||||||
// authOptions.providers.unshift(
|
// authOptions.providers.unshift(
|
||||||
// // NOTE: You can start a fake e-mail server with `pnpm email`
|
// // NOTE: You can start a fake e-mail server with `pnpm email`
|
||||||
@@ -130,25 +139,21 @@ if (authOptions.adapter) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO: move to next-auth/edge
|
// TODO: move to next-auth/edge
|
||||||
function Auth(...args: any[]) {
|
function AuthHandler(...args: any[]) {
|
||||||
const envSecret = process.env.AUTH_SECRET ?? process.env.NEXTAUTH_SECRET
|
const envSecret = process.env.AUTH_SECRET ?? process.env.NEXTAUTH_SECRET
|
||||||
const envTrustHost = !!(process.env.NEXTAUTH_URL ?? process.env.AUTH_TRUST_HOST ?? process.env.VERCEL ?? process.env.NODE_ENV !== "production")
|
const envTrustHost = !!(process.env.NEXTAUTH_URL ?? process.env.AUTH_TRUST_HOST ?? process.env.VERCEL ?? process.env.NODE_ENV !== "production")
|
||||||
if (args.length === 1) {
|
if (args.length === 1) {
|
||||||
return async (req: Request) => {
|
return async (req: Request) => {
|
||||||
args[0].secret ??= envSecret
|
args[0].secret ??= envSecret
|
||||||
args[0].trustHost ??= envTrustHost
|
args[0].trustHost ??= envTrustHost
|
||||||
return await AuthHandler(req, args[0])
|
return Auth(req, args[0])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
args[1].secret ??= envSecret
|
args[1].secret ??= envSecret
|
||||||
args[1].trustHost ??= envTrustHost
|
args[1].trustHost ??= envTrustHost
|
||||||
return AuthHandler(args[0], args[1])
|
return Auth(args[0], args[1])
|
||||||
}
|
}
|
||||||
|
|
||||||
// export default Auth(authOptions)
|
export default AuthHandler(authConfig)
|
||||||
|
|
||||||
export default function handle(request: Request) {
|
|
||||||
return Auth(request, authOptions)
|
|
||||||
}
|
|
||||||
|
|
||||||
export const config = { runtime: "experimental-edge" }
|
export const config = { runtime: "experimental-edge" }
|
||||||
7
apps/dev/nextjs/pages/api/examples/jwt.js
Normal file
7
apps/dev/nextjs/pages/api/examples/jwt.js
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
// This is an example of how to read a JSON Web Token from an API route
|
||||||
|
import { getToken } from "next-auth/jwt"
|
||||||
|
|
||||||
|
export default async (req, res) => {
|
||||||
|
const token = await getToken({ req })
|
||||||
|
res.send(JSON.stringify(token, null, 2))
|
||||||
|
}
|
||||||
27
apps/dev/nextjs/pages/client.js
Normal file
27
apps/dev/nextjs/pages/client.js
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
import Layout from "../components/layout"
|
||||||
|
|
||||||
|
export default function Page() {
|
||||||
|
return (
|
||||||
|
<Layout>
|
||||||
|
<h1>Client Side Rendering</h1>
|
||||||
|
<p>
|
||||||
|
This page uses the <strong>useSession()</strong> React Hook in the{" "}
|
||||||
|
<strong></Header></strong> component.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
The <strong>useSession()</strong> React Hook easy to use and allows
|
||||||
|
pages to render very quickly.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
The advantage of this approach is that session state is shared between
|
||||||
|
pages by using the <strong>Provider</strong> in <strong>_app.js</strong>{" "}
|
||||||
|
so that navigation between pages using <strong>useSession()</strong> is
|
||||||
|
very fast.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
The disadvantage of <strong>useSession()</strong> is that it requires
|
||||||
|
client side JavaScript.
|
||||||
|
</p>
|
||||||
|
</Layout>
|
||||||
|
)
|
||||||
|
}
|
||||||
67
apps/dev/nextjs/pages/credentials.js
Normal file
67
apps/dev/nextjs/pages/credentials.js
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
// eslint-disable-next-line no-use-before-define
|
||||||
|
import * as React from "react"
|
||||||
|
import { signIn, signOut, useSession } from "next-auth/react"
|
||||||
|
import Layout from "components/layout"
|
||||||
|
|
||||||
|
export default function Page() {
|
||||||
|
const [response, setResponse] = React.useState(null)
|
||||||
|
const handleLogin = (options) => async () => {
|
||||||
|
if (options.redirect) {
|
||||||
|
return signIn("credentials", options)
|
||||||
|
}
|
||||||
|
const response = await signIn("credentials", options)
|
||||||
|
setResponse(response)
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleLogout = (options) => async () => {
|
||||||
|
if (options.redirect) {
|
||||||
|
return signOut(options)
|
||||||
|
}
|
||||||
|
const response = await signOut(options)
|
||||||
|
setResponse(response)
|
||||||
|
}
|
||||||
|
|
||||||
|
const { data: session } = useSession()
|
||||||
|
|
||||||
|
if (session) {
|
||||||
|
return (
|
||||||
|
<Layout>
|
||||||
|
<h1>Test different flows for Credentials logout</h1>
|
||||||
|
<span className="spacing">Default:</span>
|
||||||
|
<button onClick={handleLogout({ redirect: true })}>Logout</button>
|
||||||
|
<br />
|
||||||
|
<span className="spacing">No redirect:</span>
|
||||||
|
<button onClick={handleLogout({ redirect: false })}>Logout</button>
|
||||||
|
<br />
|
||||||
|
<p>Response:</p>
|
||||||
|
<pre style={{ background: "#eee", padding: 16 }}>
|
||||||
|
{JSON.stringify(response, null, 2)}
|
||||||
|
</pre>
|
||||||
|
</Layout>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Layout>
|
||||||
|
<h1>Test different flows for Credentials login</h1>
|
||||||
|
<span className="spacing">Default:</span>
|
||||||
|
<button onClick={handleLogin({ redirect: true, password: "password" })}>
|
||||||
|
Login
|
||||||
|
</button>
|
||||||
|
<br />
|
||||||
|
<span className="spacing">No redirect:</span>
|
||||||
|
<button onClick={handleLogin({ redirect: false, password: "password" })}>
|
||||||
|
Login
|
||||||
|
</button>
|
||||||
|
<br />
|
||||||
|
<span className="spacing">No redirect, wrong password:</span>
|
||||||
|
<button onClick={handleLogin({ redirect: false, password: "" })}>
|
||||||
|
Login
|
||||||
|
</button>
|
||||||
|
<p>Response:</p>
|
||||||
|
<pre style={{ background: "#eee", padding: 16 }}>
|
||||||
|
{JSON.stringify(response, null, 2)}
|
||||||
|
</pre>
|
||||||
|
</Layout>
|
||||||
|
)
|
||||||
|
}
|
||||||
80
apps/dev/nextjs/pages/email.js
Normal file
80
apps/dev/nextjs/pages/email.js
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
// eslint-disable-next-line no-use-before-define
|
||||||
|
import * as React from "react"
|
||||||
|
import { signIn, signOut, useSession } from "next-auth/react"
|
||||||
|
import Layout from "components/layout"
|
||||||
|
|
||||||
|
export default function Page() {
|
||||||
|
const [response, setResponse] = React.useState(null)
|
||||||
|
const [email, setEmail] = React.useState("")
|
||||||
|
|
||||||
|
const handleChange = (event) => {
|
||||||
|
setEmail(event.target.value)
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleLogin = (options) => async (event) => {
|
||||||
|
event.preventDefault()
|
||||||
|
|
||||||
|
if (options.redirect) {
|
||||||
|
return signIn("email", options)
|
||||||
|
}
|
||||||
|
const response = await signIn("email", options)
|
||||||
|
setResponse(response)
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleLogout = (options) => async (event) => {
|
||||||
|
if (options.redirect) {
|
||||||
|
return signOut(options)
|
||||||
|
}
|
||||||
|
const response = await signOut(options)
|
||||||
|
setResponse(response)
|
||||||
|
}
|
||||||
|
|
||||||
|
const { data: session } = useSession()
|
||||||
|
|
||||||
|
if (session) {
|
||||||
|
return (
|
||||||
|
<Layout>
|
||||||
|
<h1>Test different flows for Email logout</h1>
|
||||||
|
<span className="spacing">Default:</span>
|
||||||
|
<button onClick={handleLogout({ redirect: true })}>Logout</button>
|
||||||
|
<br />
|
||||||
|
<span className="spacing">No redirect:</span>
|
||||||
|
<button onClick={handleLogout({ redirect: false })}>Logout</button>
|
||||||
|
<br />
|
||||||
|
<p>Response:</p>
|
||||||
|
<pre style={{ background: "#eee", padding: 16 }}>
|
||||||
|
{JSON.stringify(response, null, 2)}
|
||||||
|
</pre>
|
||||||
|
</Layout>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Layout>
|
||||||
|
<h1>Test different flows for Email login</h1>
|
||||||
|
<label className="spacing">
|
||||||
|
Email address:{" "}
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
id="email"
|
||||||
|
name="email"
|
||||||
|
value={email}
|
||||||
|
onChange={handleChange}
|
||||||
|
/>
|
||||||
|
</label>
|
||||||
|
<br />
|
||||||
|
<form onSubmit={handleLogin({ redirect: true, email })}>
|
||||||
|
<span className="spacing">Default:</span>
|
||||||
|
<button type="submit">Sign in with Email</button>
|
||||||
|
</form>
|
||||||
|
<form onSubmit={handleLogin({ redirect: false, email })}>
|
||||||
|
<span className="spacing">No redirect:</span>
|
||||||
|
<button type="submit">Sign in with Email</button>
|
||||||
|
</form>
|
||||||
|
<p>Response:</p>
|
||||||
|
<pre style={{ background: "#eee", padding: 16 }}>
|
||||||
|
{JSON.stringify(response, null, 2)}
|
||||||
|
</pre>
|
||||||
|
</Layout>
|
||||||
|
)
|
||||||
|
}
|
||||||
13
apps/dev/nextjs/pages/index.js
Normal file
13
apps/dev/nextjs/pages/index.js
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import Layout from "components/layout"
|
||||||
|
|
||||||
|
export default function Page() {
|
||||||
|
return (
|
||||||
|
<Layout>
|
||||||
|
<h1>NextAuth.js Example</h1>
|
||||||
|
<p>
|
||||||
|
This is an example site to demonstrate how to use{" "}
|
||||||
|
<a href="https://authjs.dev">NextAuth.js</a> for authentication.
|
||||||
|
</p>
|
||||||
|
</Layout>
|
||||||
|
)
|
||||||
|
}
|
||||||
9
apps/dev/nextjs/pages/middleware-protected/index.js
Normal file
9
apps/dev/nextjs/pages/middleware-protected/index.js
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
import Layout from "components/layout"
|
||||||
|
|
||||||
|
export default function Page() {
|
||||||
|
return (
|
||||||
|
<Layout>
|
||||||
|
<h1>Page protected by Middleware</h1>
|
||||||
|
</Layout>
|
||||||
|
)
|
||||||
|
}
|
||||||
32
apps/dev/nextjs/pages/policy.js
Normal file
32
apps/dev/nextjs/pages/policy.js
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
import Layout from "../components/layout"
|
||||||
|
|
||||||
|
export default function Page() {
|
||||||
|
return (
|
||||||
|
<Layout>
|
||||||
|
<p>
|
||||||
|
This is an example site to demonstrate how to use{" "}
|
||||||
|
<a href="https://authjs.dev">Auth.js</a> for authentication.
|
||||||
|
</p>
|
||||||
|
<h2>Terms of Service</h2>
|
||||||
|
<p>
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||||
|
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||||
|
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||||
|
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
</p>
|
||||||
|
<h2>Privacy Policy</h2>
|
||||||
|
<p>
|
||||||
|
This site uses JSON Web Tokens and an in-memory database which resets
|
||||||
|
every ~2 hours.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Data provided to this site is exclusively used to support signing in and
|
||||||
|
is not passed to any third party services, other than via SMTP or OAuth
|
||||||
|
for the purposes of authentication.
|
||||||
|
</p>
|
||||||
|
</Layout>
|
||||||
|
)
|
||||||
|
}
|
||||||
35
apps/dev/nextjs/pages/protected.js
Normal file
35
apps/dev/nextjs/pages/protected.js
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
import { useState, useEffect } from "react"
|
||||||
|
import { useSession } from "next-auth/react"
|
||||||
|
import Layout from "../components/layout"
|
||||||
|
|
||||||
|
export default function Page() {
|
||||||
|
const { status } = useSession({
|
||||||
|
required: true,
|
||||||
|
})
|
||||||
|
const [content, setContent] = useState()
|
||||||
|
|
||||||
|
// Fetch content from protected route
|
||||||
|
useEffect(() => {
|
||||||
|
if (status === "loading") return
|
||||||
|
const fetchData = async () => {
|
||||||
|
const res = await fetch("/api/examples/protected")
|
||||||
|
const json = await res.json()
|
||||||
|
if (json.content) {
|
||||||
|
setContent(json.content)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fetchData()
|
||||||
|
}, [status])
|
||||||
|
|
||||||
|
if (status === "loading") return <Layout>Loading...</Layout>
|
||||||
|
|
||||||
|
// If session exists, display content
|
||||||
|
return (
|
||||||
|
<Layout>
|
||||||
|
<h1>Protected Page</h1>
|
||||||
|
<p>
|
||||||
|
<strong>{content}</strong>
|
||||||
|
</p>
|
||||||
|
</Layout>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import { unstable_getServerSession } from "next-auth/next"
|
import { unstable_getServerSession } from "next-auth/next"
|
||||||
import Layout from "../components/layout"
|
import Layout from "../components/layout"
|
||||||
import { authOptions } from './api/auth/[...nextauth]';
|
import { authOptions } from "./api/auth/[...nextauth]"
|
||||||
|
|
||||||
export default function Page() {
|
export default function Page() {
|
||||||
// As this page uses Server Side Rendering, the `session` will be already
|
// As this page uses Server Side Rendering, the `session` will be already
|
||||||
32
apps/dev/nextjs/pages/styles.css
Normal file
32
apps/dev/nextjs/pages/styles.css
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
body {
|
||||||
|
font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont,
|
||||||
|
"Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif,
|
||||||
|
"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
|
||||||
|
padding: 0 1rem 1rem 1rem;
|
||||||
|
max-width: 680px;
|
||||||
|
margin: 0 auto;
|
||||||
|
background: #fff;
|
||||||
|
color: var(--color-text);
|
||||||
|
}
|
||||||
|
|
||||||
|
li,
|
||||||
|
p {
|
||||||
|
line-height: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr {
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
}
|
||||||
|
|
||||||
|
iframe {
|
||||||
|
background: #ccc;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
height: 10rem;
|
||||||
|
width: 100%;
|
||||||
|
border-radius: 0.5rem;
|
||||||
|
filter: invert(1);
|
||||||
|
}
|
||||||
48
apps/dev/nextjs/pages/supabase-client-rls.js
Normal file
48
apps/dev/nextjs/pages/supabase-client-rls.js
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
import Layout from "../components/layout"
|
||||||
|
import { useState, useEffect } from "react"
|
||||||
|
import { useSession } from "next-auth/react"
|
||||||
|
import { createClient } from "@supabase/supabase-js"
|
||||||
|
|
||||||
|
export default function Page() {
|
||||||
|
const { data: session } = useSession()
|
||||||
|
const [data, setData] = useState(null)
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (session) {
|
||||||
|
// User is logged in, let's fetch their data.
|
||||||
|
const { supabaseAccessToken } = session
|
||||||
|
const supabase = createClient(
|
||||||
|
process.env.NEXT_PUBLIC_SUPABASE_URL,
|
||||||
|
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY,
|
||||||
|
{
|
||||||
|
global: {
|
||||||
|
headers: { Authorization: `Bearer ${supabaseAccessToken}` },
|
||||||
|
},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
// Fetch data with RLS enabled.
|
||||||
|
supabase
|
||||||
|
.from("users")
|
||||||
|
.select("*")
|
||||||
|
.then(({ data }) => setData(data))
|
||||||
|
}
|
||||||
|
}, [session])
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Layout>
|
||||||
|
<h1>Fetch Data from Supabase with RLS</h1>
|
||||||
|
<h2>Client-side data fetching with RLS:</h2>
|
||||||
|
<pre>{JSON.stringify(data, null, 2)}</pre>
|
||||||
|
<h2>API Example</h2>
|
||||||
|
<p>
|
||||||
|
You can also use Supabase in API routes. See the code in the
|
||||||
|
`/pages/api/examples/supabase-rls.js` file.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<em>You must be signed in to see responses.</em>
|
||||||
|
</p>
|
||||||
|
<p>/api/examples/supabase-rls</p>
|
||||||
|
<iframe src="/api/examples/supabase-rls" />
|
||||||
|
</Layout>
|
||||||
|
)
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user