From 27d2af8f013b3d1ceea443062620c62fb33350ed Mon Sep 17 00:00:00 2001 From: Arthur DANJOU Date: Tue, 20 Jul 2021 23:32:59 +0200 Subject: [PATCH] re import ally Signed-off-by: Arthur DANJOU --- .adonisrc.json | 3 +- .env.example | 17 +++ app/Controllers/Http/AuthController.ts | 127 ++++++++++++++++++++ app/Controllers/Http/GuestBookController.ts | 1 - package.json | 1 + start/routes/auth.ts | 18 +++ tsconfig.json | 1 + yarn.lock | 17 +++ 8 files changed, 183 insertions(+), 2 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..625bd81 100755 --- a/.env.example +++ b/.env.example @@ -32,3 +32,20 @@ SMTP_HOST= SMTP_PORT= SMTP_USERNAME= SMTP_PASSWORD= + +GITHUB_CLIENT_ID= +GITHUB_CLIENT_SECRET= +GOOGLE_CLIENT_ID= +GOOGLE_CLIENT_SECRET= +TWITTER_CLIENT_ID= +TWITTER_CLIENT_SECRET= +DISCORD_CLIENT_ID= +DISCORD_CLIENT_SECRET= +GITHUB_CLIENT_ID=clientId +GITHUB_CLIENT_SECRET=clientSecret +GOOGLE_CLIENT_ID=clientId +GOOGLE_CLIENT_SECRET=clientSecret +TWITTER_CLIENT_ID=clientId +TWITTER_CLIENT_SECRET=clientSecret +DISCORD_CLIENT_ID=clientId +DISCORD_CLIENT_SECRET=clientSecret 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/app/Controllers/Http/GuestBookController.ts b/app/Controllers/Http/GuestBookController.ts index d4ab39b..8548f80 100755 --- a/app/Controllers/Http/GuestBookController.ts +++ b/app/Controllers/Http/GuestBookController.ts @@ -41,5 +41,4 @@ export default class GuestBookController { signed: guestbook_message !== null }) } - } 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 f2f9c50..deb99a1 100644 --- a/start/routes/auth.ts +++ b/start/routes/auth.ts @@ -6,5 +6,23 @@ Route.group(() => { 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/tsconfig.json b/tsconfig.json index 3cffb77..1194e95 100755 --- a/tsconfig.json +++ b/tsconfig.json @@ -34,6 +34,7 @@ "@adonisjs/lucid", "@adonisjs/mail", "@adonisjs/view", + "@adonisjs/ally", "@adonisjs/bouncer" ] } diff --git a/yarn.lock b/yarn.lock index ec4b915..0b300cd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17,6 +17,14 @@ slash "^3.0.0" term-size "^2.2.1" +"@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" + "@adonisjs/application@^5.1.3": version "5.1.3" resolved "https://registry.yarnpkg.com/@adonisjs/application/-/application-5.1.3.tgz#f0afb9a1d6f29afc31a6894c669fc2c67870a601" @@ -441,6 +449,15 @@ safe-buffer "5.2.1" uid-safe "2.1.5" +"@poppinss/oauth-client@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@poppinss/oauth-client/-/oauth-client-2.0.4.tgz#26795088b472d580127074b8ec28d868d7feb352" + integrity sha512-bl8ITdz0FG1ydCAmXVJxrlEtUm42JZK4yj6jA7CVsVhKhzf8OwG3XY8kVETmh/APp8kH8vSM6u5l+lgPKpdlIA== + dependencies: + "@types/luxon" "^1.26.5" + got "^11.8.2" + luxon "^1.27.0" + "@poppinss/prompts@^1.2.2": version "1.2.2" resolved "https://registry.yarnpkg.com/@poppinss/prompts/-/prompts-1.2.2.tgz#e4c0a582f4782d3a804050a00d80ce461de208e3"