From 9f5958976717c1930cd82e81e12923b60fd9e0c4 Mon Sep 17 00:00:00 2001 From: Arthur DANJOU Date: Fri, 9 Jul 2021 21:42:18 +0200 Subject: [PATCH] Working Signed-off-by: Arthur DANJOU --- .adonisrc.json | 3 +- .env.example | 9 ++ app/Controllers/Http/AuthController.ts | 127 +++++++++++++++++++++++++ env.ts | 11 ++- package.json | 1 + start/routes/auth.ts | 20 ++++ yarn.lock | 8 +- 7 files changed, 173 insertions(+), 6 deletions(-) diff --git a/.adonisrc.json b/.adonisrc.json index 6085ebb..18d531a 100755 --- a/.adonisrc.json +++ b/.adonisrc.json @@ -29,7 +29,8 @@ "@adonisjs/lucid", "@adonisjs/mail", "@adonisjs/view", - "@adonisjs/bouncer" + "@adonisjs/bouncer", + "@adonisjs/ally" ], "aceProviders": [ "@adonisjs/repl" diff --git a/.env.example b/.env.example index 14e695b..bbaf584 100755 --- a/.env.example +++ b/.env.example @@ -32,3 +32,12 @@ SMTP_HOST= SMTP_PORT= SMTP_USERNAME= SMTP_PASSWORD= + +GITHUB_CLIENT_ID=5d7e09bd7929fca2238b +GITHUB_CLIENT_SECRET=4f0276c920f40d68fda18c2da5e46fb2484d054b +GOOGLE_CLIENT_ID=566561222621-rel6katd1hec90a8fb16m0e3c6jag9pk.apps.googleusercontent.com +GOOGLE_CLIENT_SECRET=hQvN6QSK2fzICyVkdoHpa45L +TWITTER_CLIENT_ID=CZbgo8uXXcp35aBRy0fCwemjl +TWITTER_CLIENT_SECRET=yvWqlsmgr3ImxH32xUewAm1nhzl7O5JVf5vcWoixmFmGncqlsg +DISCORD_CLIENT_ID=610128476283863060 +DISCORD_CLIENT_SECRET=9pE76kBr76kIDDK80ScxFe0cC0J-giGI diff --git a/app/Controllers/Http/AuthController.ts b/app/Controllers/Http/AuthController.ts index 0211a9c..6c8736e 100755 --- a/app/Controllers/Http/AuthController.ts +++ b/app/Controllers/Http/AuthController.ts @@ -1,5 +1,6 @@ import {HttpContextContract} from '@ioc:Adonis/Core/HttpContext' import User from "App/Models/User"; +import {AllyUserContract} from "@ioc:Adonis/Addons/Ally"; export default class AuthController { @@ -42,4 +43,130 @@ export default class AuthController { }) } + public async twitter ({ ally, auth, response }: HttpContextContract) { + const twitter = ally.use('twitter') + + if (twitter.accessDenied()) { + return response.status(403).send({ + message: 'Access Denied!' + }) + } + + if (twitter.stateMisMatch()) { + return response.status(405).send({ + message: 'Request expired. Retry again!' + }) + } + + if (twitter.hasError()) { + return response.status(500).send({ + message: twitter.getError() + }) + } + + const twitterUser = await twitter.user() + const user = await this.createUser(twitterUser) + await auth.use('web').login(user, true) + return response.status(200).send({ + user: user + }) + } + + public async discord ({ ally, auth, response }: HttpContextContract) { + const discord = ally.use('discord') + + if (discord.accessDenied()) { + return response.status(403).send({ + message: 'Access Denied!' + }) + } + + if (discord.stateMisMatch()) { + return response.status(405).send({ + message: 'Request expired. Retry again!' + }) + } + + if (discord.hasError()) { + return response.status(500).send({ + message: discord.getError() + }) + } + + const discordUser = await discord.user() + const user = await this.createUser(discordUser) + await auth.use('web').login(user, true) + return response.status(200).send({ + user: user + }) + } + + public async github ({ ally, auth, response }: HttpContextContract) { + const github = ally.use('github') + + if (github.accessDenied()) { + return response.status(403).send({ + message: 'Access Denied!' + }) + } + + if (github.stateMisMatch()) { + return response.status(405).send({ + message: 'Request expired. Retry again!' + }) + } + + if (github.hasError()) { + return response.status(500).send({ + message: github.getError() + }) + } + + const githubUser = await github.user() + const user = await this.createUser(githubUser) + await auth.use('web').login(user, true) + return response.status(200).send({ + user: user + }) + } + + public async google ({ ally, auth, response, }: HttpContextContract) { + const google = ally.use('google') + + if (google.accessDenied()) { + return response.status(403).send({ + message: 'Access Denied!' + }) + } + + if (google.stateMisMatch()) { + return response.status(405).send({ + message: 'Request expired. Retry again!' + }) + } + + if (google.hasError()) { + return response.status(500).send({ + message: google.getError() + }) + } + + const googleUser = await google.user() + const user = await this.createUser(googleUser) + await auth.use('web').login(user, true) + return response.status(200).send({ + user: user + }) + } + + public async createUser (allyUser: AllyUserContract): Promise { + return await User.firstOrCreate({ + email: allyUser.email!, + }, { + email: allyUser.email!, + username: allyUser.name, + isConfirmed: allyUser.emailVerificationState === 'verified' + }) + } + } diff --git a/env.ts b/env.ts index f95779c..3bd8c5c 100755 --- a/env.ts +++ b/env.ts @@ -15,7 +15,6 @@ import Env from '@ioc:Adonis/Core/Env' export default Env.rules({ - //App HOST: Env.schema.string(), PORT: Env.schema.number(), @@ -56,4 +55,14 @@ export default Env.rules({ SMTP_PORT: Env.schema.number(), SMTP_USERNAME: Env.schema.string(), SMTP_PASSWORD: Env.schema.string(), + + //Socials Authentication + GOOGLE_CLIENT_ID: Env.schema.string(), + GOOGLE_CLIENT_SECRET: Env.schema.string(), + TWITTER_CLIENT_ID: Env.schema.string(), + TWITTER_CLIENT_SECRET: Env.schema.string(), + GITHUB_CLIENT_ID: Env.schema.string(), + GITHUB_CLIENT_SECRET: Env.schema.string(), + DISCORD_CLIENT_ID: Env.schema.string(), + DISCORD_CLIENT_SECRET: Env.schema.string(), }) diff --git a/package.json b/package.json index 65844b0..44cf9fb 100755 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "youch-terminal": "^1.1.1" }, "dependencies": { + "@adonisjs/ally": "^4.1.0", "@adonisjs/auth": "^8.0.6", "@adonisjs/bouncer": "^2.2.4", "@adonisjs/core": "~5.1.8", diff --git a/start/routes/auth.ts b/start/routes/auth.ts index 078fddd..deb99a1 100644 --- a/start/routes/auth.ts +++ b/start/routes/auth.ts @@ -3,6 +3,26 @@ import Route from "@ioc:Adonis/Core/Route"; Route.group(() => { Route.get('/me', 'AuthController.user').middleware('auth') Route.post('/token', 'AuthController.createInfiniteToken') + Route.post('/login', 'AuthController.login') Route.post('/logout', 'AuthController.logout') + + Route.get('/twitter/callback', 'AuthController.twitter') + Route.get('/github/callback', 'AuthController.github') + Route.get('/google/callback', 'AuthController.google') + Route.get('/discord/callback', 'AuthController.discord') + + Route.get('/twitter', async ({ally}) => { + return ally.use('twitter').redirect() + }) + Route.get('/github', async ({ally}) => { + return ally.use('github').redirect() + }) + Route.get('/google', async ({ally}) => { + return ally.use('google').redirect() + }) + Route.get('/discord', async ({ally}) => { + return ally.use('discord').redirect() + }) }).prefix('/auth') + diff --git a/yarn.lock b/yarn.lock index ba4b044..0b300cd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17,10 +17,10 @@ slash "^3.0.0" term-size "^2.2.1" -"@adonisjs/ally@^4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@adonisjs/ally/-/ally-4.0.2.tgz#9a9c16de810fa96b726d2cfc772343740d486405" - integrity sha512-p8dUK//l+isTGLiiO9IPaxfAftuCYSt9t2oY4Wz2Dj2mfEtcvZY5OcdCKFYcHeN1Ax47HbLXIooq+en7rqq5PQ== +"@adonisjs/ally@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@adonisjs/ally/-/ally-4.1.0.tgz#6811c77c7862f78279d11f6be52792b0837c1829" + integrity sha512-IgyUoV9U/a8iTuRBnR0US8/qV5w+d087dqDdDVbgevGVAPyzwci2KeBGBteNzbZDuF1lhfMAz76rL9rSSbWR9A== dependencies: "@poppinss/oauth-client" "^2.0.4" "@poppinss/utils" "^3.1.3"