Kata sandi adalah mata rantai terlemah dalam keamanan akun. Kata sandi bisa di-phishing, bocor, digunakan ulang, atau dilupakan. Itulah mengapa kami menambahkan dukungan untuk WebAuthn Passkeys - metode autentikasi tanpa kata sandi yang tahan phishing, lebih aman dan lebih nyaman.

Apa itu Passkeys?

Passkeys adalah kredensial kriptografi yang disimpan di perangkat Anda (ponsel, laptop, kunci keamanan) yang menggantikan kata sandi untuk autentikasi. Mereka menggunakan standar WebAuthn (bagian dari FIDO2) dan memberikan beberapa keuntungan:

  • Tahan phishing - Passkeys terikat pada domain situs web, sehingga tidak dapat digunakan di situs palsu
  • Tidak ada rahasia yang bocor - Hanya kunci publik yang disimpan di server
  • Terikat perangkat - Kunci privat tidak pernah meninggalkan perangkat Anda
  • Dilindungi biometrik - Biasanya diamankan oleh Face ID, Touch ID, atau Windows Hello
  • Sinkronisasi lintas perangkat - Platform modern menyinkronkan Passkeys antar perangkat melalui akun iCloud, Google, atau Microsoft

Implementasi Kami

Kami mengintegrasikan dukungan WebAuthn Passkeys ke dalam stack autentikasi django-allauth yang sudah ada, menyediakan endpoint API untuk web dan mobile.

Alur Pendaftaran

Ketika pengguna mendaftarkan Passkey baru, alurnya bekerja seperti ini:

  1. Klien meminta opsi pendaftaran dari server
  2. Server menghasilkan tantangan dengan informasi pengguna dan relying party
  3. API WebAuthn browser meminta pengguna (biometrik atau kunci keamanan)
  4. Klien mengirim kredensial kembali ke server
  5. Server memverifikasi dan menyimpan kunci publik
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# API endpoint to begin registration
class WebAuthnRegistrationOptionsView(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request):
        from allauth.mfa.webauthn.internal import auth as webauthn_auth

        # Generate credential creation options
        creation_options = webauthn_auth.begin_registration(
            request.user,
            passwordless=False  # Use as 2FA, not passwordless
        )

        return Response({
            "success": True,
            "creation_options": creation_options,
        })

Alur Autentikasi

Untuk autentikasi dua faktor menggunakan Passkey:

  1. Pengguna menyelesaikan autentikasi primer (username/password atau login sosial)
  2. Server mengembalikan tantangan untuk verifikasi WebAuthn
  3. Browser meminta Passkey (sentuhan biometrik)
  4. Kredensial diverifikasi terhadap kunci publik yang tersimpan
  5. Pengguna sepenuhnya terautentikasi
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
class WebAuthnVerifyView(APIView):
    def post(self, request):
        credential = request.data.get("credential")

        # Complete authentication and verify credential
        authenticator = webauthn_auth.complete_authentication(
            request.user,
            credential
        )

        # Record usage for security monitoring
        authenticator.last_used_at = timezone.now()
        authenticator.save()

        return Response({"success": True})

Manajemen Passkey

Pengguna dapat mengelola Passkeys yang terdaftar:

  • Daftar semua Passkeys dengan tanggal pendaftaran dan penggunaan terakhir
  • Ganti nama Passkeys untuk identifikasi lebih mudah (misalnya, “iPhone”, “MacBook”)
  • Hapus Passkeys (dengan perlindungan terhadap penghapusan autentikator terakhir)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
class WebAuthnListView(APIView):
    def get(self, request):
        authenticators = Authenticator.objects.filter(
            user=request.user,
            type=Authenticator.Type.WEBAUTHN
        ).order_by("-created_at")

        return Response({
            "passkeys": [
                {
                    "id": auth.pk,
                    "name": auth.wrap().name,
                    "created_at": auth.created_at.isoformat(),
                    "last_used_at": auth.last_used_at.isoformat() if auth.last_used_at else None,
                }
                for auth in authenticators
            ]
        })

Endpoint API

REST API kami menyediakan dukungan WebAuthn penuh untuk aplikasi mobile:

EndpointMetodeDeskripsi
/api/webauthn/register/options/GETDapatkan tantangan pendaftaran
/api/webauthn/register/complete/POSTSelesaikan pendaftaran
/api/webauthn/authenticate/options/GETDapatkan tantangan autentikasi
/api/webauthn/verify/POSTVerifikasi kredensial untuk 2FA
/api/webauthn/GETDaftar Passkeys yang terdaftar
/api/webauthn/<id>/PATCHGanti nama Passkey
/api/webauthn/<id>/DELETEHapus Passkey

Pertimbangan Keamanan

Kode Pemulihan

Ketika pengguna mendaftarkan autentikator pertama mereka (Passkey atau TOTP), kami secara otomatis menghasilkan kode pemulihan. Kode sekali pakai ini dapat digunakan jika semua metode autentikasi lainnya tidak tersedia:

1
2
if Authenticator.objects.filter(user=request.user).count() == 1:
    auto_generate_recovery_codes(request._request)

Pencegahan Penguncian

Pengguna tidak dapat menghapus Passkey terakhir mereka jika itu akan membuat mereka tanpa metode autentikasi dua faktor:

1
2
3
4
if not adapter.can_delete_authenticator(authenticator):
    return Response({
        "message": "Cannot delete - you must have at least one authentication method"
    }, status=400)

Pemantauan

Kami melacak penggunaan Passkey melalui metrik Datadog untuk pemantauan keamanan:

1
2
3
increment("webauthn.registration.success")
increment("webauthn.verify.success")
increment("webauthn.verify.failed")

Dukungan Browser

WebAuthn didukung di semua browser modern:

  • Chrome 67+
  • Firefox 60+
  • Safari 13+
  • Edge 79+
  • Chrome Mobile, Safari, Firefox

Untuk browser lama, pengguna masih dapat menggunakan TOTP (aplikasi autentikator) atau kode pemulihan.

Pengalaman Pengguna

Menambahkan Passkey hanya membutuhkan beberapa detik:

  1. Buka Pengaturan → Keamanan → Autentikasi Dua Faktor
  2. Klik Tambah Passkey
  3. Beri nama perangkat Anda (misalnya, “iPhone 15”)
  4. Autentikasi dengan Face ID / Touch ID / Windows Hello
  5. Selesai! Passkey Anda terdaftar

Login selanjutnya hanya memerlukan konfirmasi biometrik - tidak perlu mengetik kata sandi atau menyalin kode dari aplikasi autentikator.

Mengapa Kami Memilih Passkeys

MetodeRisiko PhishingPengalaman PenggunaPemulihan
Kata SandiTinggiBuruk (lupa, lemah)Reset email
SMS 2FASedang (SIM swap)CukupNomor telepon
Aplikasi TOTPRendahInput kode manualKunci cadangan
PasskeysSangat RendahSangat BaikKode pemulihan

Passkeys mewakili masa depan autentikasi. Mereka sudah didukung oleh platform Apple, Google, dan Microsoft, membuatnya dapat diakses oleh hampir semua pengguna kami.


Siap bebas kata sandi? Aktifkan Passkeys di pengaturan keamanan Anda!