În contextul creșterii preocupărilor legate de securitatea parolelor și autentificarea mai rapidă și mai sigură, Apple a introdus Passkeys ca o metodă de autentificare fără parole, care utilizează tehnologia bazată pe criptografie și biometrică. Passkeys sunt stocate într-un portofel digital (iCloud Keychain) și pot fi utilizate pentru autentificarea pe diferite platforme și site-uri, oferind o experiență de utilizator mai rapidă și mai sigură.

În acest tutorial, vom învăța cum să integrezi Apple Passkeys într-un site construit cu Next.js, o platformă modernă pentru dezvoltarea aplicațiilor React. Vom explora pașii necesari pentru a permite utilizatorilor să se autentifice folosind Passkeys pe site-ul tău Next.js, aducând un plus de securitate și confort.

  1. Ce sunt Apple Passkeys?

Apple Passkeys sunt o nouă metodă de autentificare introdusă de Apple, bazată pe criptografie publică/privată, care elimină necesitatea parolelor tradiționale. Passkeys sunt stocate local pe dispozitivul utilizatorului (iPhone, iPad sau Mac) și sunt sincronizate între dispozitive prin iCloud Keychain. Acestea sunt legate de un cont de utilizator și nu pot fi furate în mod simplu, deoarece nu există o parolă scrisă sau o cheie stocată pe servere externe.

Principalele avantaje ale Passkeys sunt:

  • Securitate ridicată: Autentificarea se face folosind criptografie publică/privată și biometrie.
  • Comoditate: Utilizatorii nu trebuie să memoreze sau să introducă parole.
  • Compatibilitate cross-platform: Passkeys pot fi utilizate pe diverse dispozitive Apple și în browserele care le suportă.
  1. Cum funcționează Apple Passkeys?

Apple Passkeys sunt bazate pe standardele FIDO2 și WebAuthn, două tehnologii care permit autentificarea securizată fără parole, folosind un cheie publică și o cheie privată.

  • Cheia publică este stocată pe serverul site-ului, iar cheia privată rămâne pe dispozitivul utilizatorului (în cazul Apple, aceasta este stocată în iCloud Keychain).
  • Când utilizatorul dorește să se autentifice, dispozitivul său trimite un semnătura criptografică pe care serverul o poate verifica utilizând cheia publică.
  1. Ce ai nevoie pentru a integra Apple Passkeys într-un site Next.js?

Pentru a implementa Apple Passkeys într-un site Next.js, vei avea nevoie de:

  • Un cont Apple Developer: Necesitar pentru a accesa API-urile și documentația Apple privind Passkeys și WebAuthn.
  • FIDO2/WebAuthn support pe serverul tău: Aceste tehnologii sunt utilizate pentru a autentifica utilizatorii.
  • Next.js: O aplicație Next.js configurată pentru a gestiona autentificarea și stocarea cheilor publice.
  • Certificat SSL: Pentru a asigura o conexiune securizată între client și server.
  1. Pași pentru integrarea Apple Passkeys într-un site Next.js
  2. Crearea unui cont Apple Developer

În primul rând, trebuie să ai un cont de dezvoltator Apple, pentru a putea accesa API-urile necesare implementării Passkeys.

  1. Vizitează Apple Developer și creează un cont sau autentifică-te în contul existent.
  2. Accesează secțiunea Certificates, Identifiers & Profiles și configurează aplicația ta pentru a accepta autentificarea cu Passkeys.
  1. Configurarea WebAuthn în Next.js

Next.js va trebui să se integreze cu standardele WebAuthn și FIDO2 pentru a permite înregistrarea și autentificarea utilizatorilor cu Passkeys. Vom folosi un server Node.js în backend pentru a manipula cheile publice și private, precum și pentru a valida semnăturile criptografice.

  1. Instalarea pachetelor necesare: Pentru a lucra cu WebAuthn, vom folosi pachete precum @simplewebauthn/server pentru backend-ul Node.js. Instalează-l folosind npm:

bash

Copy code

npm install @simplewebauthn/server

  1. Configurarea serverului pentru WebAuthn: Crează o funcție pentru înregistrarea și autentificarea utilizatorilor folosind WebAuthn. Aceste funcționalități vor manipula cheile publice și private ale utilizatorilor.

javascript

Copy code

import { generateRegistrationOptions, verifyRegistrationResponse } from ‘@simplewebauthn/server’;

 

// Endpoint pentru inițierea înregistrării

app.post(‘/webauthn/register’, async (req, res) => {

const user = req.body.user; // Detalii utilizator

const options = generateRegistrationOptions({

rpName: ‘My Website’,

userId: user.id,

userName: user.username,

});

 

// Salvează challenge-ul și opțiunile de înregistrare pentru validare

await saveRegistrationOptions(user.id, options);

 

res.json(options);

});

 

// Endpoint pentru verificarea răspunsului de înregistrare

app.post(‘/webauthn/register/verify’, async (req, res) => {

const { userId, response } = req.body;

const savedOptions = await getSavedRegistrationOptions(userId);

 

const verification = await verifyRegistrationResponse({

credential: response,

expectedChallenge: savedOptions.challenge,

expectedOrigin: ‘https://yourdomain.com’,

expectedRPID: ‘yourdomain.com’,

});

 

if (verification.verified) {

// Salvează cheia publică

await savePublicKey(userId, verification.registrationInfo);

res.json({ success: true });

} else {

res.status(400).json({ error: ‘Verification failed’ });

}

});

În acest exemplu, generăm opțiuni de înregistrare pentru un utilizator folosind generateRegistrationOptions. După ce utilizatorul completează procesul de înregistrare, validăm răspunsul folosind verifyRegistrationResponse.

  1. Înregistrarea unui utilizator cu Passkeys pe client

Pe partea de frontend a aplicației Next.js, vei avea nevoie să capturezi răspunsul de la dispozitivul utilizatorului și să îl trimiți către server pentru validare.

javascript

Copy code

// Funcția pentru înregistrarea unui utilizator folosind Passkeys (WebAuthn)

const registerPasskey = async () => {

const response = await fetch(‘/webauthn/register’);

const options = await response.json();

 

const credential = await navigator.credentials.create({ publicKey: options });

 

const registrationResponse = {

id: credential.id,

rawId: credential.rawId,

response: {

attestationObject: credential.response.attestationObject,

clientDataJSON: credential.response.clientDataJSON,

},

};

 

await fetch(‘/webauthn/register/verify’, {

method: ‘POST’,

body: JSON.stringify({ userId: ‘some-user-id’, response: registrationResponse }),

});

};

Aceasta funcție utilizează WebAuthn API pentru a înregistra un utilizator și trimite datele către server pentru validare.

  1. Autentificarea cu Apple Passkeys

Pentru autentificarea utilizatorilor cu Passkeys, procesul este similar cu cel de înregistrare, dar înlocuim opțiunile de înregistrare cu cele de autentificare.

  1. Crearea unui endpoint de autentificare:

javascript

Copy code

import { generateAuthenticationOptions, verifyAuthenticationResponse } from ‘@simplewebauthn/server’;

 

app.post(‘/webauthn/authenticate’, async (req, res) => {

const user = req.body.user;

const options = generateAuthenticationOptions({ userId: user.id });

 

await saveAuthenticationOptions(user.id, options);

 

res.json(options);

});

 

app.post(‘/webauthn/authenticate/verify’, async (req, res) => {

const { userId, response } = req.body;

const savedOptions = await getSavedAuthenticationOptions(userId);

 

const verification = await verifyAuthenticationResponse({

credential: response,

expectedChallenge: savedOptions.challenge,

expectedOrigin: ‘https://yourdomain.com’,

expectedRPID: ‘yourdomain.com’,

});

 

if (verification.verified) {

res.json({ success: true });

} else {

res.status(400).json({ error: ‘Authentication failed’ });

}

});

  1. Autentificarea pe client:

javascript

Copy code

const authenticateWithPasskey = async () => {

const response = await fetch(‘/webauthn/authenticate’);

const options = await response.json();

 

const credential = await navigator.credentials.get({ publicKey: options });

 

const authenticationResponse = {

id: credential.id,

rawId: credential.rawId,

response: {

clientDataJSON: credential.response.clientDataJSON,

authenticatorData: credential.response.authenticatorData,

signature: credential.response.signature,

},

};

 

await fetch(‘/webauthn/authenticate/verify’, {

method: ‘POST’,

body: JSON.stringify({ userId: ‘some-user-id’, response: authenticationResponse }),

});

};

  1. Testarea integrării

Înainte de a lansa aplicația, este important să testezi integrarea cu Passkeys pe diferite dispozitive Apple. Asigură-te că autentificarea și înregistrarea funcționează corespunzător și că datele sunt transmise corect între client și server.

Concluzie

Integrarea Apple Passkeys într-un site Next.js îți oferă o metodă modernă, rapidă și sigură de a autentifica utilizatorii. Prin utilizarea tehnologiilor WebAuthn și FIDO2, poți construi o experiență de autentificare fără parole, protejând în același timp datele utilizatorilor și îmbunătățind securitatea generală a aplicației tale.

Inspirație: AnunțuriUtile