Integrar Next.js com Sentinel Identity
Adicione autenticação SSO ao seu app Next.js em minutos usando next-auth v4 e o fluxo Authorization Code com client secret.
next-auth v4Instalar next-auth
Adicione o next-auth ao seu projeto Next.js. A versão 4 é compatível tanto com o Pages Router quanto com o App Router.
npm install next-authCriar o handler de autenticação
Crie o arquivo de rota do next-auth com um provider OIDC customizado apontando para o Sentinel. Use /pages/api/auth/[...nextauth].ts para o Pages Router ou /app/api/auth/[...nextauth]/route.ts para o App Router.
import NextAuth from 'next-auth';
import type { NextAuthOptions } from 'next-auth';
export const authOptions: NextAuthOptions = {
providers: [
{
id: 'sentinel',
name: 'Sentinel Identity',
type: 'oauth',
wellKnown: `${process.env.OIDC_ISSUER}/.well-known/openid-configuration`,
clientId: process.env.OIDC_CLIENT_ID,
clientSecret: process.env.OIDC_CLIENT_SECRET,
authorization: {
params: { scope: 'openid profile email' },
},
idToken: true,
profile(profile) {
return {
id: profile.sub,
name: profile.name,
email: profile.email,
image: profile.picture ?? null,
};
},
},
],
session: { strategy: 'jwt' },
};
export default NextAuth(authOptions);App Router: exporte GET e POST usando handlers = NextAuth(authOptions) em /app/api/auth/[...nextauth]/route.ts.
Configurar variáveis de ambiente
Crie o arquivo .env.local na raiz do projeto com as credenciais do cliente registrado no sentinel-admin. NEXTAUTH_SECRET deve ser um valor aleatório seguro gerado com openssl.
NEXTAUTH_URL=http://localhost:3000
NEXTAUTH_SECRET=<gerado-com-openssl-rand-base64-32>
OIDC_ISSUER=https://auth.sentinel-identity.com
OIDC_CLIENT_ID=<SEU_CLIENT_ID>
OIDC_CLIENT_SECRET=<SEU_CLIENT_SECRET>Nunca versione o .env.local. Adicione-o ao .gitignore e use variáveis de ambiente do seu provedor de deploy em produção.
Adicionar o SessionProvider
Envolva o layout raiz com o SessionProvider para que os componentes cliente possam acessar a sessão via useSession(). No App Router, crie um componente Providers separado marcado com "use client".
'use client';
import { SessionProvider } from 'next-auth/react';
export function Providers({ children }: { children: React.ReactNode }) {
return <SessionProvider>{children}</SessionProvider>;
}No layout.tsx importe Providers e envolva {children} com ele. O SessionProvider não pode ser usado diretamente em Server Components.
Usar a sessão na aplicação
Em componentes cliente use o hook useSession(). Em Server Components (App Router) use getServerSession() para acessar a sessão sem chamadas adicionais ao servidor.
'use client';
import { useSession, signIn, signOut } from 'next-auth/react';
export function UserButton() {
const { data: session, status } = useSession();
if (status === 'loading') return <span>Carregando...</span>;
if (!session) {
return (
<button onClick={() => signIn('sentinel')}>
Entrar com Sentinel
</button>
);
}
return (
<div>
<p>Olá, {session.user?.name}</p>
<button onClick={() => signOut()}>Sair</button>
</div>
);
}Proteger rotas no middleware
Crie o arquivo middleware.ts na raiz do projeto. O withAuth do next-auth intercepta as rotas listadas no matcher e redireciona usuários não autenticados para a página de login.
import { withAuth } from 'next-auth/middleware';
export default withAuth({
callbacks: {
authorized: ({ token }) => !!token,
},
});
export const config = {
matcher: [
'/dashboard/:path*',
'/profile/:path*',
'/admin/:path*',
],
};Rotas fora do matcher permanecem públicas. Ajuste os padrões conforme a estrutura do seu projeto.