Skip to content

Instantly share code, notes, and snippets.

@IgorDePaula
Last active July 2, 2021 22:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save IgorDePaula/f3db1e5c4e7c94603f356dd76881d7f5 to your computer and use it in GitHub Desktop.
Save IgorDePaula/f3db1e5c4e7c94603f356dd76881d7f5 to your computer and use it in GitHub Desktop.
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)
}
},
}),
],
})
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>
)
}
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">
Email
</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">
Email
</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