> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# Metode Login: Passkey, Kode, Sosial, SSO

> Atur metode login Didit: kata sandi, kode email, magic link, kode telepon, passkey, login sosial, SSO organisasi, Didit ID Wallet, MFA, reset sandi.

> [!WARNING]
>
> Autentikasi adalah fitur baru. Halaman masuk yang di-hosting menjalankan semua metode di halaman ini. Endpoint JSON yang tercantum di sini diperuntukkan bagi tim yang membangun layar masuk sendiri (`sign_in_ui: "own"`).

Aktifkan metode dengan `PUT methods/{name}/` dan `{"enabled": true}` pada API Manajemen Autentikasi aplikasi Anda, atau dari konsol. Halaman masuk yang di-hosting hanya menampilkan metode yang Anda aktifkan.

| Metode | Nama | Konfigurasi |
| - | - | - |
| Kata sandi | `password` | Juga diperlukan untuk pendaftaran email dengan kata sandi. |
| Kode email | `code` | Tidak ada. |
| Tautan ajaib | `magic` | Tidak ada. Hanya halaman yang di-hosting. |
| Kode telepon | `phone` | Kirim `workflow_id` dari alur kerja verifikasi telepon. |
| Passkey | `passkey` | Tidak ada. |
| Masuk dengan media sosial | `google`, `microsoft`, `apple`, `github` | `client_id` dan `client_secret` Anda sendiri. Aplikasi sandbox dapat menggunakan aplikasi uji Didit sebagai gantinya (`credential_source: "didit_test"`). |
| SSO organisasi | `sso` | Koneksi SAML atau OIDC untuk setiap organisasi pelanggan. |
| Didit ID Wallet | `wallet` | Selalu aktif. Tidak dapat dinonaktifkan. |

Setiap panggilan JSON di bawah dimulai dengan `transaction` dari `POST authorize/`. Transaksi tersebut berlaku selama 10 menit. Masuk yang berhasil mengembalikan `{code, redirect_uri, state}`. Tukarkan kode di `POST token/` dalam waktu 60 detik (lihat [token dan JWKS](https://docs.didit.me/id/authentication/tokens-and-jwks.md)).

Alih-alih kode, panggilan masuk dapat mengembalikan salah satu langkah berikut. Selesaikan langkah tersebut, lalu Anda akan menerima kode.

| Respons | Langkah berikutnya |
| - | - |
| `mfa_required` dengan `challenge` dan `factors` | Kirim kode TOTP atau kode pemulihan, atau gunakan passkey (lihat [MFA](#mfa)). |
| `mfa_enrollment_required` dengan `challenge` dan `uri` | Kebijakan MFA mewajibkan autentikator. Daftarkan dengan `POST mfa/setup/`. |
| `protection_required` dengan `challenge` dan `methods` | Kebijakan [perlindungan bot](https://docs.didit.me/id/authentication/bot-protection.md) meminta bukti tambahan. |
| `verification_required` dengan `verification_url` | Pengaturan verifikasi Anda mewajibkan pemeriksaan liveness atau identitas saat pendaftaran atau masuk. Arahkan orang tersebut ke `verification_url` (berlaku 30 menit); kode akan diberikan setelah pemeriksaan disetujui. |

## Kata sandi

`POST password/` menerima `transaction`, `email` dan `password`.

* Kata sandi harus memenuhi `password_min_length` Anda (8, 10, 12 atau 14 karakter; default 10). Kata sandi yang umum dan yang hanya berisi angka ditolak dengan `password_policy`. Ketika [pemeriksaan kata sandi yang bocor](https://docs.didit.me/id/authentication/bot-protection.md#kata-sandi-yang-bocor) aktif, kata sandi yang diketahui pernah bocor ditolak dengan `password_breached`.
* Hanya orang dengan email terverifikasi yang dapat masuk dengan kata sandi.
* Kata sandi yang salah, email yang tidak dikenal, email yang belum diverifikasi, akun yang terkunci, dan akun yang diblokir semuanya menghasilkan jawaban yang sama: `400 {"error": "invalid_credentials"}`. UI Anda tidak dapat membedakan penyebabnya, begitu pula penyerang.

### Pendaftaran

Pendaftaran memverifikasi email terlebih dahulu. Panggil `POST email/start/` dengan `purpose: "signup"`, `email` dan `password`, lalu `POST email/complete/` dengan kodenya. Akun dibuat dengan email yang sudah terverifikasi.

* `signup_policy` menentukan siapa yang dapat mendaftar: `anyone`, `invited` (hanya dengan tautan undangan) atau `allowed_domains`.
* Dengan `allow_subaddresses: false` (default), alamat yang mengandung `+` pada bagian lokal akan ditolak.
* Ketika branding Anda menetapkan tautan ke syarat dan ketentuan atau privasi, formulir pendaftaran di halaman yang di-hosting meminta orang tersebut untuk menyetujuinya.

## Kode email

`POST email/start/` menerima `transaction`, `purpose` (`login` atau `signup`) dan `email`, lalu mengembalikan `202 {challenge, expires_in: 600}`. Orang tersebut menerima kode 6 digit yang berlaku selama 10 menit.

`POST email/complete/` menerima `transaction`, `purpose`, `challenge` dan `code`. Anda mendapat 5 percobaan, setelah itu orang tersebut harus meminta kode baru. Halaman yang di-hosting menawarkan kode baru setelah 30 detik.

Kode masuk untuk alamat yang belum memiliki akun akan membuat akun jika `signup_policy` Anda mengizinkannya. Inilah pendaftaran tanpa kata sandi.

## Tautan ajaib

Halaman yang di-hosting mengirim tautan masuk yang berlaku selama 15 menit. Tautan ini tetap terikat pada transaksi PKCE asli, sehingga tautan hanya berfungsi dalam alur yang memulainya. Orang tersebut mengonfirmasi masuk di halaman yang dibuka oleh tautan. Tidak ada endpoint JSON untuk tautan ajaib.

## Kode telepon

`POST phone/start/` menerima `transaction`, `phone` dan `channel` opsional (`sms`, default, atau `whatsapp`). Nomor dinormalisasi ke format E.164. Endpoint ini mengembalikan `202 {challenge, expires_in: 600}`.

`POST phone/complete/` menerima `transaction`, `challenge` dan `code` 6 digit. Anda mendapat 5 percobaan.

* Kode telepon dikirim melalui verifikasi telepon Didit. Aktifkan metode ini dengan `workflow_id` dari alur kerja yang berisi verifikasi telepon.
* Masuk dengan telepon untuk pertama kalinya hanya membuat akun jika `signup_policy` bernilai `anyone`.
* Jika pengiriman gagal, panggilan mengembalikan `503 {"error": "delivery_unavailable"}`.

## Passkey

Passkey menggunakan WebAuthn. Pihak pengandalnya adalah origin masuk aplikasi Anda. Didit meminta kredensial yang dapat ditemukan (resident key) dan selalu mewajibkan verifikasi pengguna, misalnya sidik jari, wajah, atau PIN perangkat. Didit tidak meminta atestasi.

| Panggilan | Isi | Hasil |
| - | - | - |
| `POST passkeys/begin/` | `{transaction}` | `{challenge, options}` untuk `navigator.credentials.get()`. Tidak ada daftar kredensial yang dikirim, sehingga browser menampilkan semua passkey untuk origin Anda. |
| `POST passkeys/complete/` | `{challenge, credential}` | Kode masuk, atau langkah berikutnya. |
| `POST passkeys/register/` | Kosong, dengan `Authorization: Bearer <access_token>` | Opsi untuk `navigator.credentials.create()`. |
| `POST passkeys/confirm/` | `{challenge, credential}`, dengan token yang sama | `{id}` dari passkey baru. |

* Tantangan passkey berlaku selama 5 menit.
* Menambahkan passkey memerlukan sesi yang dibuat dalam 5 menit terakhir. Jika tidak, panggilan mengembalikan `403 {"error": "reauthentication_required"}`. Masuk kembali sebagai orang tersebut terlebih dahulu.
* Masuk dengan passkey dihitung sebagai multi-faktor.
* Setelah pendaftaran, halaman yang di-hosting menawarkan untuk menambahkan passkey (`passkeys/setup/begin/` dan `passkeys/setup/complete/`).
* Aplikasi Android yang terdaftar di aplikasi dapat menggunakan passkey yang sama.

## Masuk sosial

Masuk dengan Google, Microsoft, Apple, dan GitHub menggunakan kredensial aplikasi OAuth Anda sendiri, yang diatur dengan `PUT methods/{provider}/` dan `credentials: {client_id, client_secret}`. Callback penyedia berada di origin yang digunakan untuk masuk.

Saat pertama kali seseorang masuk dengan penyedia, mereka juga membuktikan kepemilikan alamat email dengan kode (`POST social/email/start/` dan `POST social/email/verify/`). Masuk berikutnya dengan penyedia tersebut melewati langkah ini.

GitHub tidak dapat membuktikan bahwa pengguna baru saja masuk, sehingga tidak ditawarkan saat Anda mengirim `prompt=login` atau `max_age`.

## SSO Organisasi

SSO Organisasi memungkinkan perusahaan pelanggan masuk melalui penyedia identitas SAML atau OIDC miliknya sendiri. Konfigurasikan untuk setiap organisasi pelanggan di `organizations/{id}/sso/` dengan `protocol` (`saml` atau `oidc`), `enabled`, dan `config`.

* Anda dapat mengirim tautan pengaturan kepada tim TI pelanggan yang berlaku selama 7 hari.
* Metadata penyedia layanan SAML Anda dipublikasikan di `{origin}/sso/saml/metadata/`.
* Halaman masuk yang di-hosting menemukan koneksi dari domain email yang terverifikasi milik pengguna, atau dari `organization=<slug>` pada URL masuk.

## Didit ID Wallet

Pengguna yang sudah melakukan verifikasi dengan Didit dapat masuk menggunakan Didit ID Wallet mereka. Metode ini selalu aktif. `verified_identity` pada sesi kemudian memuat informasi yang dipilih orang tersebut untuk dibagikan.

## MFA

Faktor kedua adalah aplikasi autentikator (TOTP) dengan kode pemulihan, atau kunci sandi.

* `mfa_policy` menentukan siapa yang wajib menggunakan MFA: `optional`, `everyone`, atau `organization_admins` (bawaan). Siapa pun yang telah mendaftarkan autentikator wajib selalu menggunakannya.
* Untuk mendaftarkan autentikator, panggil `POST mfa/enroll/` dengan sesi yang baru (dibuat dalam 5 menit terakhir). Respons mengembalikan `{challenge, uri}`; tampilkan `uri` sebagai kode QR. Lalu kirim kode pertama ke `POST mfa/confirm/`. Respons berisi 10 kode pemulihan sekali pakai. Tampilkan kode-kode tersebut hanya sekali.
* Saat masuk, kirim kode TOTP atau kode pemulihan ke `POST mfa/complete/` beserta `challenge`. Anda mendapat 5 percobaan. Untuk menggunakan kunci sandi sebagai gantinya, panggil `POST mfa/passkey/begin/` dan `POST mfa/passkey/complete/`.
* Kode menggunakan interval 30 detik. Kode yang sudah diterima tidak dapat digunakan lagi.
* Kode SMS dan email tidak tersedia sebagai faktor kedua.

## Lupa dan atur ulang kata sandi

`POST password-reset/start/` menerima `email` dan mengembalikan `202 {"status": "sent", "expires_in": 1800}`. Jawabannya sama, terlepas dari apakah alamat tersebut memiliki akun atau tidak. Tautan pengaturan ulang berlaku selama 30 menit.

`POST password-reset/complete/` menerima `token` dan `password` dan mengembalikan `{"status": "password_changed"}`. Panggilan ini juga:

* menghapus penguncian,
* mengakhiri setiap sesi ketika `revoke_on_password_change` aktif (bawaan),
* membatalkan kode dan tautan lain yang masih tertunda untuk pengguna tersebut.

## Undangan

Dengan `signup_policy: "invited"`, hanya orang yang diundang yang dapat mendaftar. Tautan undangan berlaku selama 7 hari dan membuka halaman `/invite` yang di-hosting.

Lanjutkan dengan [token dan JWKS](https://docs.didit.me/id/authentication/tokens-and-jwks.md), atau baca [perlindungan bot](https://docs.didit.me/id/authentication/bot-protection.md) untuk penguncian dan tantangan.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.