Last active
July 2, 2021 22:30
-
-
Save IgorDePaula/f3db1e5c4e7c94603f356dd76881d7f5 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import NextAuth from 'next-auth' | |
import Providers from 'next-auth/providers' | |
import {Auth} from 'aws-amplify' | |
export default NextAuth({ | |
pages: { | |
error: "/login", // Changing the error redirect page to our custom login page | |
}, | |
callbacks: { | |
async session(session, token) { | |
return token | |
}, | |
}, | |
providers: [ | |
Providers.Credentials({ | |
name: "Credentials", | |
async authorize(credentials) { | |
try { | |
const user = await Auth.signIn(credentials.email, credentials.password) | |
if (user) { | |
const data = { | |
name: user.attributes.name, email: user.attributes.email, image:'asdasdasd',id:user.attributes.sub, | |
} | |
return data | |
} | |
} catch (e) { | |
const errorMessage = e.message | |
throw new Error(errorMessage + "&email=" + credentials.email) | |
} | |
}, | |
}), | |
], | |
}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import {Auth} from 'aws-amplify'; | |
import {useContext, useEffect} from 'react' | |
import {useState} from 'react'; | |
import {useForm} from "react-hook-form"; | |
import {useRouter} from "next/router"; | |
import {XCircleIcon} from "@heroicons/react/solid"; | |
import { signIn } from 'next-auth/client' | |
export default function Login() { | |
const {register, handleSubmit} = useForm(); | |
const router = useRouter() | |
const [errorMessage, setErrorMessage] = useState(false); | |
const [loading, setLoading] = useState(false); | |
useEffect(async() => { | |
if (router.query.error) { | |
setErrorMessage(router.query.error) | |
} | |
}, [router]) | |
function Auth({email, password}) { | |
setLoading(true) | |
signIn('credentials', | |
{ | |
email, | |
password, | |
callbackUrl: `${window.location.origin}/dashboard` | |
} | |
) | |
} | |
return ( | |
<div className="min-h-screen bg-gray-50 flex flex-col justify-center py-12 sm:px-6 lg:px-8"> | |
<div className="sm:mx-auto sm:w-full sm:max-w-md"> | |
<img | |
className="mx-auto h-12 w-auto" | |
src="https://tailwindui.com/img/logos/workflow-mark-indigo-600.svg" | |
alt="Workflow" | |
/> | |
<h2 className="mt-6 text-center text-3xl font-extrabold text-gray-900">Entre com sua conta</h2> | |
{errorMessage && <div className="rounded-md bg-red-50 p-4 mt-4"> | |
<div className="flex"> | |
<div className="flex-shrink-0"> | |
<XCircleIcon className="h-5 w-5 text-red-400" aria-hidden="true"/> | |
</div> | |
<div className="ml-3"> | |
<h3 className="text-sm font-medium text-red-800">Ocorreram o(s) seguinte(s) erro(s):</h3> | |
<div className="mt-2 text-sm text-red-700"> | |
<ul className="list-disc pl-5 space-y-1"> | |
<li>{errorMessage}</li> | |
</ul> | |
</div> | |
</div> | |
</div> | |
</div>} | |
</div> | |
<div className="mt-8 sm:mx-auto sm:w-full sm:max-w-md"> | |
<div className="bg-white py-8 px-4 shadow sm:rounded-lg sm:px-10"> | |
<form className="space-y-6" onSubmit={handleSubmit(Auth)}> | |
<div> | |
<label htmlFor="email" className="block text-sm font-medium text-gray-700"> | |
Email address | |
</label> | |
<div className="mt-1"> | |
<input | |
id="email" | |
{...register('email')} | |
name="email" | |
type="email" | |
autoComplete="email" | |
required | |
className="appearance-none block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm placeholder-gray-400 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" | |
/> | |
</div> | |
</div> | |
<div> | |
<label htmlFor="password" className="block text-sm font-medium text-gray-700"> | |
Password | |
</label> | |
<div className="mt-1"> | |
<input | |
{...register('password')} | |
id="password" | |
name="password" | |
type="password" | |
autoComplete="current-password" | |
required | |
className="appearance-none block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm placeholder-gray-400 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" | |
/> | |
</div> | |
</div> | |
<div className="flex items-center justify-between"> | |
<div className="flex items-center"> | |
<input | |
id="remember_me" | |
name="remember_me" | |
type="checkbox" | |
className="h-4 w-4 text-indigo-600 focus:ring-indigo-500 border-gray-300 rounded" | |
/> | |
<label htmlFor="remember_me" className="ml-2 block text-sm text-gray-900"> | |
Lembrar de mim | |
</label> | |
</div> | |
<div className="text-sm"> | |
<a href="#" className="font-medium text-indigo-600 hover:text-indigo-500"> | |
Esqueceu sua senha? | |
</a> | |
</div> | |
</div> | |
<div> | |
<button | |
type="submit" | |
className="w-full flex justify-center py-2 px-4 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500" | |
> | |
{loading && | |
<svg className="animate-spin -ml-1 mr-3 h-5 w-5 text-white" | |
xmlns="http://www.w3.org/2000/svg" | |
fill="none" viewBox="0 0 24 24"> | |
<circle className="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" | |
strokeWidth="4"></circle> | |
<path className="opacity-75" fill="currentColor" | |
d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path> | |
</svg>} | |
Acessar | |
</button> | |
<a href="/register" className={'mt-4 flex items-center justify-center block text-sm font-medium text-gray-700'}>Não tem conta? Vamos criar uma!</a> | |
</div> | |
</form> | |
</div> | |
</div> | |
</div> | |
) | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import {Auth} from 'aws-amplify'; | |
import {XCircleIcon} from "@heroicons/react/solid"; | |
import {useState} from 'react'; | |
import {useForm} from "react-hook-form"; | |
import {CheckCircleIcon} from '@heroicons/react/solid' | |
import {useRouter} from "next/router"; | |
export default function Register({setStatus}) { | |
const router = useRouter(); | |
const {register, handleSubmit} = useForm(); | |
const [errorMessage, setErrorMessage] = useState(); | |
const [sucessMessage, setSuccessMessage] = useState(false); | |
const [user, setUser] = useState(); | |
const [code, setCode] = useState(); | |
const [loading, setLoading] = useState(false); | |
async function resendConfirmationCode() { | |
setLoading(true) | |
try { | |
await Auth.resendSignUp(user.userSub); | |
setLoading(false) | |
setCode(true) | |
} catch (err) { | |
console.log('error resending code: ', err); | |
} | |
} | |
function signUp({email, password, name}) { | |
setLoading(true) | |
Auth.signUp({ | |
username: email, | |
email, | |
password, | |
attributes: { | |
email, // optional but not in this case as MFA/Verification code wil be emailed | |
name | |
} | |
}).then(result => { | |
setUser(result) | |
setSuccessMessage(true) | |
/* setStatus('confirm') | |
setUser({ | |
email: email, | |
password: password, | |
})*/ | |
setLoading(false) | |
}).catch(error => { | |
setLoading(false) | |
console.log(error) | |
if (error.code == 'UsernameExistsException') { | |
setErrorMessage("Este email já existe! Por favor escolha outro.") | |
} | |
if (error.code == 'InvalidPasswordException') { | |
setErrorMessage("Senha muito curta! O mínimo exigido é de 8 caracteres.") | |
} | |
}) | |
} | |
function confirmSignUp({username, code}) { | |
setLoading(true) | |
Auth.confirmSignUp(username, code).then(result => { | |
setLoading(false); | |
if (result == 'SUCCESS') { | |
router.push('/login') | |
} | |
}).catch(error => { | |
setLoading(false); | |
setErrorMessage("Erro na verificação: usuário já está confirmado!") | |
}); | |
} | |
return ( | |
<div className="min-h-screen bg-gray-50 flex flex-col justify-center py-12 sm:px-6 lg:px-8"> | |
<div className="sm:mx-auto sm:w-full sm:max-w-md"> | |
<img | |
className="mx-auto h-12 w-auto" | |
src="https://tailwindui.com/img/logos/workflow-mark-indigo-600.svg" | |
alt="Workflow" | |
/> | |
<h2 className="mt-6 text-center text-3xl font-extrabold text-gray-900">Crie sua conta</h2> | |
{/* <p className="mt-2 text-center text-sm text-gray-600"> | |
Or{' '} | |
<a href="#" className="font-medium text-indigo-600 hover:text-indigo-500"> | |
start your 14-day free trial | |
</a> | |
</p>*/} | |
{errorMessage && <div className="rounded-md bg-red-50 p-4 mt-4"> | |
<div className="flex"> | |
<div className="flex-shrink-0"> | |
<XCircleIcon className="h-5 w-5 text-red-400" aria-hidden="true"/> | |
</div> | |
<div className="ml-3"> | |
<h3 className="text-sm font-medium text-red-800">Ocorreram o(s) seguinte(s) erro(s):</h3> | |
<div className="mt-2 text-sm text-red-700"> | |
<ul className="list-disc pl-5 space-y-1"> | |
<li>{errorMessage}</li> | |
</ul> | |
</div> | |
</div> | |
</div> | |
</div>} | |
</div> | |
{!sucessMessage && <div className="mt-8 sm:mx-auto sm:w-full sm:max-w-md"> | |
<div className="bg-white py-8 px-4 shadow sm:rounded-lg sm:px-10"> | |
<form className="space-y-6" onSubmit={handleSubmit(signUp)}> | |
<div> | |
<label htmlFor="email" className="block text-sm font-medium text-gray-700"> | |
Nome | |
</label> | |
<div className="mt-1"> | |
<input | |
id="email" | |
name="email" | |
autoComplete="email" | |
required | |
{...register('name')} | |
className="appearance-none block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm placeholder-gray-400 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" | |
/> | |
</div> | |
</div> | |
<div> | |
<label htmlFor="email" className="block text-sm font-medium text-gray-700"> | |
</label> | |
<div className="mt-1"> | |
<input | |
id="email" | |
name="email" | |
type="email" | |
autoComplete="email" | |
required | |
{...register('email')} | |
className="appearance-none block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm placeholder-gray-400 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" | |
/> | |
</div> | |
</div> | |
<div> | |
<label htmlFor="password" className="block text-sm font-medium text-gray-700"> | |
Password | |
</label> | |
<div className="mt-1"> | |
<input | |
id="password" | |
name="password" | |
type="password" | |
autoComplete="current-password" | |
required | |
{...register('password')} | |
className="appearance-none block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm placeholder-gray-400 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" | |
/> | |
</div> | |
</div> | |
<div> | |
<button | |
type="submit" | |
className="w-full flex justify-center py-2 px-4 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500" | |
> | |
{loading && | |
<svg className="animate-spin -ml-1 mr-3 h-5 w-5 text-white" | |
xmlns="http://www.w3.org/2000/svg" | |
fill="none" viewBox="0 0 24 24"> | |
<circle className="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" | |
strokeWidth="4"></circle> | |
<path className="opacity-75" fill="currentColor" | |
d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path> | |
</svg>} | |
Registrar | |
</button> | |
</div> | |
</form> | |
{/* <div className="mt-6"> | |
<div className="relative"> | |
<div className="absolute inset-0 flex items-center"> | |
<div className="w-full border-t border-gray-300" /> | |
</div> | |
<div className="relative flex justify-center text-sm"> | |
<span className="px-2 bg-white text-gray-500">Or continue with</span> | |
</div> | |
</div> | |
<div className="mt-6 grid grid-cols-3 gap-3"> | |
<div> | |
<a | |
href="#" | |
className="w-full inline-flex justify-center py-2 px-4 border border-gray-300 rounded-md shadow-sm bg-white text-sm font-medium text-gray-500 hover:bg-gray-50" | |
> | |
<span className="sr-only">Sign in with Facebook</span> | |
<svg className="w-5 h-5" aria-hidden="true" fill="currentColor" viewBox="0 0 20 20"> | |
<path | |
fillRule="evenodd" | |
d="M20 10c0-5.523-4.477-10-10-10S0 4.477 0 10c0 4.991 3.657 9.128 8.438 9.878v-6.987h-2.54V10h2.54V7.797c0-2.506 1.492-3.89 3.777-3.89 1.094 0 2.238.195 2.238.195v2.46h-1.26c-1.243 0-1.63.771-1.63 1.562V10h2.773l-.443 2.89h-2.33v6.988C16.343 19.128 20 14.991 20 10z" | |
clipRule="evenodd" | |
/> | |
</svg> | |
</a> | |
</div> | |
<div> | |
<a | |
href="#" | |
className="w-full inline-flex justify-center py-2 px-4 border border-gray-300 rounded-md shadow-sm bg-white text-sm font-medium text-gray-500 hover:bg-gray-50" | |
> | |
<span className="sr-only">Sign in with Twitter</span> | |
<svg className="w-5 h-5" aria-hidden="true" fill="currentColor" viewBox="0 0 20 20"> | |
<path d="M6.29 18.251c7.547 0 11.675-6.253 11.675-11.675 0-.178 0-.355-.012-.53A8.348 8.348 0 0020 3.92a8.19 8.19 0 01-2.357.646 4.118 4.118 0 001.804-2.27 8.224 8.224 0 01-2.605.996 4.107 4.107 0 00-6.993 3.743 11.65 11.65 0 01-8.457-4.287 4.106 4.106 0 001.27 5.477A4.073 4.073 0 01.8 7.713v.052a4.105 4.105 0 003.292 4.022 4.095 4.095 0 01-1.853.07 4.108 4.108 0 003.834 2.85A8.233 8.233 0 010 16.407a11.616 11.616 0 006.29 1.84" /> | |
</svg> | |
</a> | |
</div> | |
<div> | |
<a | |
href="#" | |
className="w-full inline-flex justify-center py-2 px-4 border border-gray-300 rounded-md shadow-sm bg-white text-sm font-medium text-gray-500 hover:bg-gray-50" | |
> | |
<span className="sr-only">Sign in with GitHub</span> | |
<svg className="w-5 h-5" aria-hidden="true" fill="currentColor" viewBox="0 0 20 20"> | |
<path | |
fillRule="evenodd" | |
d="M10 0C4.477 0 0 4.484 0 10.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0110 4.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.203 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.942.359.31.678.921.678 1.856 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0020 10.017C20 4.484 15.522 0 10 0z" | |
clipRule="evenodd" | |
/> | |
</svg> | |
</a> | |
</div> | |
</div> | |
</div>*/} | |
</div> | |
</div>} | |
{sucessMessage && <div className="mt-8 sm:mx-auto sm:w-full sm:max-w-md"> | |
<div className="rounded-md bg-green-50 p-4"> | |
<div className="flex"> | |
<div className="flex-shrink-0"> | |
<CheckCircleIcon className="h-5 w-5 text-green-400" aria-hidden="true"/> | |
</div> | |
<div className="ml-3"> | |
<h3 className="text-sm font-medium text-green-800">Registrado com sucesso!</h3> | |
<div className="mt-2 text-sm text-green-700"> | |
<p>Precisamos agora que confirme o registro usando o código enviado para seu email.</p> | |
</div> | |
<div className="mt-4"> | |
<div className="-mx-2 -my-1.5 flex"> | |
</div> | |
</div> | |
</div> | |
</div> | |
</div> | |
<div className="bg-white py-8 px-4 shadow sm:rounded-lg sm:px-10"> | |
<form className="space-y-6" onSubmit={handleSubmit(confirmSignUp)}> | |
<div> | |
<label htmlFor="email" className="block text-sm font-medium text-gray-700"> | |
</label> | |
<div className="mt-1"> | |
<input | |
id="email" | |
name="email" | |
type="email" | |
autoComplete="email" | |
required | |
{...register('username')} | |
className="appearance-none block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm placeholder-gray-400 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" | |
defaultValue={user.user.username} | |
/> | |
</div> | |
</div> | |
<div> | |
<label htmlFor="password" className="block text-sm font-medium text-gray-700"> | |
Código de verificação | |
</label> | |
<div className="mt-1"> | |
<input | |
id="password" | |
name="password" | |
autoComplete="current-password" | |
required | |
{...register('code')} | |
className="appearance-none block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm placeholder-gray-400 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" | |
/> | |
</div> | |
</div> | |
<div> | |
<button | |
type="submit" | |
className="w-full flex justify-center py-2 px-4 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500" | |
> | |
{loading && | |
<svg className="animate-spin -ml-1 mr-3 h-5 w-5 text-white" | |
xmlns="http://www.w3.org/2000/svg" | |
fill="none" viewBox="0 0 24 24"> | |
<circle className="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" | |
strokeWidth="4"></circle> | |
<path className="opacity-75" fill="currentColor" | |
d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path> | |
</svg>} | |
Verificar | |
</button> | |
<a href="#" onClick={()=>resendConfirmationCode() } className={'mt-4 flex items-center justify-center block text-sm font-medium text-gray-700'}>{!code && 'Não recebi o código de verificação'}{code && 'Novo código enviado para você'}</a> | |
</div> | |
</form> | |
</div> | |
</div>} | |
</div> | |
) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment