Capítulo 3
Lógica do Backend
O passo final é a sua aplicação receber o Token gerado pelo SDK no Frontend e iniciar a sessão do utilizador do lado do servidor.
A Acapadev assina o JWT usando o algoritmo HS256 (num futuro próximo RS256 com Chave Pública/Privada). A chave usada na assinatura é a Client Secret da sua App. Pode descodificar o JWT e confiar nos seus dados (verificando a assinatura) ou enviar para o nosso endpoint de introspeção.
1. Enviar do Frontend (via AJAX)
function enviarParaOBackend(token) {
fetch('/api/auth/one-tap-login', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content
},
body: JSON.stringify({ token: token })
})
.then(res => res.json())
.then(data => {
if(data.success) {
// Sucesso! Redireciona para área reservada
window.location.href = '/dashboard';
}
});
}
2. Validação no Backend
Aqui estão exemplos robustos de como interpretar e autenticar o Token recebido, demonstrando que o Acapadev ID é agnóstico à linguagem de programação.
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
use App\Models\User;
Route::post('/api/auth/one-tap-login', function (Request $request) {
$jwt = $request->token;
$clientSecret = env('ACAPADEV_CLIENT_SECRET'); // A sua Client Secret
try {
// Descodifica o JWT verificando a integridade da assinatura
$payload = JWT::decode($jwt, new Key($clientSecret, 'HS256'));
// Obter os dados mapeados no Payload
$emailDoToken = $payload->email;
$nomeDoToken = $payload->name;
$idAcapadev = $payload->sub;
// Encontrar ou criar o utilizador local
$user = User::firstOrCreate(
['email' => $emailDoToken],
['name' => $nomeDoToken]
);
// Fazer login local
Auth::login($user);
return response()->json(['success' => true]);
} catch (\Exception $e) {
// O JWT é inválido ou expirou
return response()->json(['success' => false, 'error' => $e->getMessage()], 401);
}
});
const express = require('express');
const jwt = require('jsonwebtoken');
const User = require('./models/User'); // O seu modelo de base de dados
const app = express();
app.use(express.json());
app.post('/api/auth/one-tap-login', async (req, res) => {
const token = req.body.token;
const clientSecret = process.env.ACAPADEV_CLIENT_SECRET;
try {
// Descodifica e verifica a assinatura do JWT
const payload = jwt.verify(token, clientSecret, { algorithms: ['HS256'] });
// Obter os dados mapeados no Payload
const { email, name, sub: idAcapadev } = payload;
// Encontrar ou criar o utilizador local
let user = await User.findOne({ email });
if (!user) {
user = await User.create({ email, name });
}
// Criar sessão ou JWT local (depende da sua arquitetura)
req.session.userId = user.id;
return res.json({ success: true });
} catch (error) {
// O JWT é inválido ou expirou
return res.status(401).json({ success: false, error: error.message });
}
});
Dicas de Segurança e Boas Práticas
- Verificação de Assinatura: Certifique-se sempre de que a biblioteca JWT que utiliza no seu backend (ex:
firebase/php-jwtoujsonwebtoken) verifica a assinatura utilizando o algoritmoHS256e a sua Client Secret exata. - Contas Bloqueadas ou Inativas: O motor One-Tap possui salvaguardas nativas. Se a conta do utilizador tiver o
statusdefinido como "bloqueado" ou "inativo" no ecossistema central, o One-Tap não será exibido na interface para esse utilizador. Adicionalmente, qualquer tentativa forçada de emissão de token via API devolverá imediatamente um erro403 Forbidden, garantindo segurança total em todas as aplicações satélites.