Guia de autenticação do Next.Js com Github e Typescript
Pablo Ferrari
Posted on October 5, 2022
O Next.js é um framework para React incrível com foco em eficiência, totalmente pré-configurado, que reúne diversas funcionalidades.
Nesse artigo irei abordar uma das funcionalidades no Next.Js, que é a autenticação de usuários com o provedor do Github. Ao final desse artigo você será capaz de criar um sistema de autenticação de usuário completo.
Criação do projeto
A primeira coisa que precisamos fazer é criar uma pasta em nossa máquina para o projeto.
Para criar nosso projeto precisamos primeiro acessar o diretório da pasta pelo terminal ou pelo editor de texto, como o exemplo abaixo:
Agora basta que rodemos o comando abaixo para criar um novo projeto Next:
yarn create next-app --typescript
No campo em que aparece em seu terminal informe o nome do projeto:
Precisamos agora acessar a pasta do projeto em nosso terminal:
cd .\next-auth-with-github\
Insira o comando abaixo no terminal para acessar nosso projeto no navegador:
yarn dev
Agora basta que acessemos a URL abaixo no navegador de preferência:
http://localhost:3000
Criação do OAuth
Agora que já estamos com o projeto criado precisamos criar um aplicativo OAuth em nosso Github para podermos consumi-lo posteriormente.
Clicando aqui seremos redirecionados para o painel de aplicativos OAuth do nosso Github. Agora clique no botão "New OAuth App" para criarmos um novo aplicativo OAuth.
A primeira coisa que precisamos fazer é informar o nome:
Com o nome informado agora iremos informar a URL do projeto:
E por último, informar a rota de callback do projet:
A rota deve ter exatamente essa URL!
Agora que os dados necessários já estão devidamente preenchidos clique no botão "Register application".
Veja que agora obtivemos dois dados importantes:
- Client ID
- Client secrets
Mão na massa
Agora que já criamos nosso projeto e também criamos um aplicativo OAuth podemos de fato "colocar a mão na massa".
Criando variável ambiente
Na raiz de seu projeto, crie o arquivo .env.local
. Esse arquivo será responsável por conter todas as chaves de configurações com serviços externos ao nosso projeto.
Com o arquivo criado, vamos criar as variáveis e atribuí-las os seus devidos valores.
Declare essas duas variáveis em seu arquivo .env.local
:
CLIENT_ID=
CLIENT_SECRET=
Agora basta que atribuímos a essas variáveis seus valores de acordo com o Github OAuth:
Tendo como resultado final:
Estruturando página index e aplicando-a estilos
Acesse o arquivo index.tsx
dentro da pasta pages
e vamos estruturar nossa página:
import type { NextPage } from 'next'
import styles from '../styles/Home.module.css'
const Home: NextPage = () => {
return (
<div className={styles.container}>
<div className={styles.box}>
<button className={`${styles.button}`}>
Fazer login
</button>
</div>
</div>
)
}
export default Home
No arquivo global.css
dentro da pasta styles
adicione os seguintes estilos globais:
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
:root {
--white: #fff;
--gray-100: #e1e1e6;
--gray-300: #a8a8b3;
--gray-800: #29292e;
--gray-850: #212529;
--gray-900: #121214;
--green-900: #3e8914;
--yellow-500: #eba417;
}
@media (max-width: 1080px) {
html {
font-size: 93.75%;
}
}
@media (max-width: 720px) {
html {
font-size: 87.5%;
}
}
body {
background: var(--gray-900);
color: var(--white);
overflow-x: hidden;
}
body,
input,
textarea,
select,
button {
font: 400 1rem sans-serif;
}
button {
cursor: pointer;
}
a {
color: inherit;
text-decoration: none;
}
ul{
list-style-type: none;
}
No arquivo Home.module.css
dentro da pasta styles
adicione os seguintes estilos:
.container {
width: 100%;
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}
.box {
padding: 2rem 4rem;
border-radius: 0.25rem;
background-color: var(--gray-800);
}
.button {
padding: 0.5rem 2rem;
border-radius: 0.25rem;
background-color: var(--yellow-500);
border: 0;
color: var(--gray-800);
font-size: 1rem;
transition: 0.2s;
}
.button:hover {
filter: brightness(0.8);
}
.button.active {
background-color: var(--green-900);
}
Configurando provedor do Github
Em nosso projeto existe uma pasta chamada api
, essa pasta é responsável por interpretar arquivos do lado do servidor, nela crie uma pasta chamada auth
e dentro dessa pasta, crie o arquivo [...nextauth].ts
. Esse arquivo será responsável pelas configurações de provedores.
Agora que o arquivo [...nextauth].ts
iremos instalar o pacote de autenticação do Next:
yarn add next-auth
Agora iremos configurar o provedor do Github em nosso arquivivo [...nextauth].ts
:
import NextAuth from 'next-auth'
import GithubProvider from 'next-auth/providers/github'
export const authOptions = {
providers: [
GithubProvider({
clientId: process.env.CLIENT_ID!,
clientSecret: process.env.CLIENT_SECRET!
})
]
}
export default NextAuth(authOptions)
Criando contexto de sessão
Em nosso arquivo _app.tsx
dentro da pasta pages
, iremos criar um contexto com a sessão de usuário:
import '../styles/globals.css'
import type { AppProps } from 'next/app'
import { SessionProvider } from 'next-auth/react'
import { Session } from 'next-auth'
function MyApp({
Component,
pageProps: { session, ...pageProps }
}: AppProps<{
session: Session
}>) {
return (
<SessionProvider session={session} basePath="/api/auth/callback">
<Component {...pageProps} />
</SessionProvider>
)
}
export default MyApp
Consumindo contxto
Agora iremos verificar se nossa sessão está ativa ou não. No arquivo index.tsx
dentro da pasta pages
insira o seguinte código:
import type { NextPage } from 'next'
import { useSession, signIn, signOut } from 'next-auth/react'
import styles from '../styles/Home.module.css'
const Home: NextPage = () => {
const { data: session } = useSession()
return (
<div className={styles.container}>
<div className={styles.box}>
{!session ? (
<button className={styles.button} onClick={() => signIn('github')}>
Fazer login
</button>
) : (
<button
className={`${styles.button} ${styles.active}`}
onClick={() => signOut()}
>
{session.user?.name}
</button>
)}
</div>
</div>
)
}
export default Home
Finalizando...
Agora que já configuramos tudo iremos testar. O Next recomenda que quando utilizamos variáveis ambiente é sempre importante que reiniciemos o servidor após configura-las, então, vá até o seu terminal, pare o servidor e o suba novamente utilizando o comando abaixo:
yarn dev
Então, se você fez tudo corretamente, agora é só clicar no botão de login e realizar o seu login com o Github!
Feito com ❤ por Pablo Ferrari
Posted on October 5, 2022
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.