Acapadev

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-jwt ou jsonwebtoken) verifica a assinatura utilizando o algoritmo HS256 e a sua Client Secret exata.
  • Contas Bloqueadas ou Inativas: O motor One-Tap possui salvaguardas nativas. Se a conta do utilizador tiver o status definido 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 erro 403 Forbidden, garantindo segurança total em todas as aplicações satélites.
Enter para selecionar ESC para sair