> ## 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.

# उपयोगकर्ता माइग्रेट करें: पासवर्ड और MFA इंपोर्ट करें

> Didit में CSV, JSON फ़ाइल या बैच से पासवर्ड, सत्यापित ईमेल, सोशल लिंक, ऑथेंटिकेटर ऐप और संगठन भूमिकाओं सहित उपयोगकर्ता इंपोर्ट करें।

> [!WARNING]
>
> प्रमाणीकरण नया है। हर इंपोर्ट को पहले सैंडबॉक्स एप्लिकेशन में चलाएँ, फिर अपने लाइव एप्लिकेशन में इंपोर्ट करें।

इंपोर्ट से लोग किसी दूसरे आइडेंटिटी प्लेटफ़ॉर्म से Didit Authentication में आते हैं। उनका पासवर्ड, सत्यापित ईमेल, सोशल साइन-इन लिंक, ऑथेंटिकेटर ऐप और संगठन भूमिकाएँ उनके साथ आते हैं। जब तक आपका एप्लिकेशन उन्हें Didit से साइन इन नहीं कराता, उनके लिए कुछ नहीं बदलता।

इंपोर्ट आपके एप्लिकेशन के Authentication प्रबंधन API का उपयोग करते हैं, जिसके लिए `write:authentication` वाला कंसोल सत्र चाहिए (या सूची देखने के लिए `read:authentication`)। ये कभी एंड-यूज़र टोकन या सत्यापन API कुंजी का उपयोग नहीं करते। उदाहरणों में `MANAGEMENT_BASE` यह है:

```text theme={null}
https://apx.didit.me/auth/v2/organizations/{org_id}/applications/{application_id}/authentication/
```

## दो तरीकों से इंपोर्ट करें

| | फ़ाइल जॉब | बैच अनुरोध |
| - | - | - |
| Endpoint | `POST import-jobs/` (multipart) | `POST imports/` (JSON) |
| आकार | एक CSV या JSON फ़ाइल, 25 MB तक और 100,000 लोग | प्रति अनुरोध 1 से 1,000 `rows` |
| ड्राई रन | हमेशा पहले बैकग्राउंड में चलता है | डिफ़ॉल्ट रूप से `dry_run: true` |
| कमिट | `POST import-jobs/{id}/start/` | वही अनुरोध `dry_run: false` के साथ |
| आंशिक विफलता | 1,000 का हर बैच अलग से कमिट होता है; रुका हुआ इंपोर्ट फिर से शुरू होता है | सब कुछ या कुछ नहीं |

## फ़ाइल इंपोर्ट करें

### 1. अपलोड करें

```bash theme={null}
curl --fail-with-body "${MANAGEMENT_BASE}import-jobs/" \
  -H "Authorization: Bearer $CONSOLE_ACCESS_TOKEN" \
  -F file=@users.csv \
  -F passwords=import \
  -F keep_social=true \
  -F keep_verified=true \
  -F keep_mfa=true \
  -F keep_ids=true
```

| फ़ील्ड | अर्थ |
| - | - |
| `file` | CSV या JSON, UTF-8 में (byte order mark की अनुमति है), 25 MB तक। |
| `passwords` | `import` (डिफ़ॉल्ट) पासवर्ड हैश रखता है। `reset` उन्हें अनदेखा करता है, ताकि सभी लोग नया पासवर्ड सेट करें। |
| `keep_social` | सोशल साइन-इन लिंक रखें। |
| `keep_verified` | `email_verified` रखें। `false` होने पर हर ईमेल असत्यापित होगा। |
| `keep_mfa` | ऑथेंटिकेटर ऐप के सीक्रेट रखें। |
| `keep_ids` | `external_id` रखें। `false` होने पर `vendor_data` Didit पहचान ID बन जाता है। |
| `firebase_signer_key`, `firebase_salt_separator`, `firebase_rounds`, `firebase_mem_cost` | आपके Firebase प्रोजेक्ट के हैश पैरामीटर। चारों भेजें या कोई नहीं। |

हर `keep_*` स्विच डिफ़ॉल्ट रूप से `true` होता है, जब तक आप `false` न भेजें। कॉल `202` और एक जॉब लौटाती है। एक एप्लिकेशन एक समय में अधिकतम 5 अपलोड की गई फ़ाइलें रख सकता है।

### 2. ड्राई रन की जाँच करें

हर अपलोड एक ड्राई रन से शुरू होता है। यह हर व्यक्ति की जाँच करता है और कुछ नहीं लिखता। `GET import-jobs/{id}/` को पोल करें:

| फ़ील्ड | अर्थ |
| - | - |
| `kind` | `dry_run`, और इंपोर्ट शुरू करने के बाद `import`। |
| `status` | `queued`, `running`, फिर ड्राई रन के लिए `passed` या `failed`, और इंपोर्ट के लिए `done` या `error`। |
| `processed`, `total` | प्रगति, लोगों की संख्या में। |
| `result` | फ़ाइल में क्या है (देखें [परिणाम](#परिणाम))। |
| `startable` | `true` तब जब ड्राई रन पास हुआ हो और फ़ाइल की समय-सीमा समाप्त न हुई हो। |
| `expires_at` | जिस ड्राई रन का इंपोर्ट नहीं हुआ, उसके 24 घंटे बाद फ़ाइल हटा दी जाती है। |

विफल ड्राई रन अपनी त्रुटियाँ सूचीबद्ध करता है। फ़ाइल ठीक करें और उसे फिर से अपलोड करें।

### 3. इंपोर्ट शुरू करें

`POST import-jobs/{id}/start/` उस इंपोर्ट को करता है जिसे ड्राई रन ने जाँचा था, और `202` लौटाता है।

* लोगों को 1,000 के बैच में इंपोर्ट किया जाता है। हर बैच अलग से कमिट होता है।
* एक एप्लिकेशन पर एक समय में एक ही इंपोर्ट चलता है (अन्यथा `import_running`)।
* रुका हुआ इंपोर्ट अपने आखिरी कमिट किए गए बैच के बाद फिर से शुरू होता है।
* जो लोग पहले से इंपोर्ट हो चुके हैं, उन्हें छोड़ दिया जाता है, इसलिए आप वही फ़ाइल दोबारा चला सकते हैं।
* इंपोर्ट शुरू करने वाले व्यक्ति को इंपोर्ट पूरा होने या रुकने पर ईमेल मिलता है।

अपलोड की गई फ़ाइल एन्क्रिप्टेड रूप में संग्रहीत होती है। इसे इंपोर्ट समाप्त होने पर, ड्राई रन विफल होने पर, या उस ड्राई रन के 24 घंटे बाद हटा दिया जाता है जिसका इंपोर्ट नहीं हुआ।

## बैच में इंपोर्ट करें

हर अनुरोध में अधिकतम 1,000 लोग 100 अक्षरों तक के `idempotency_key` के साथ भेजें।

```json theme={null}
{
  "rows": [
    {
      "email": "user@example.com",
      "external_id": "user-1234",
      "email_verified": true,
      "display_name": "Example User",
      "password_hash": "$2b$12$...",
      "social": [{ "provider": "google", "subject": "1234567890" }],
      "organizations": [{ "slug": "acme", "name": "Acme", "role": "admin" }]
    }
  ],
  "dry_run": true,
  "idempotency_key": "migration-batch-0001"
}
```

* ड्राई रन `200` लौटाता है, परिणाम के साथ, और कुछ नहीं लिखता।
* `dry_run: false` के साथ सफल इंपोर्ट `201` लौटाता है। जिस बैच में कोई भी त्रुटि हो, वह `400` लौटाता है और किसी को इंपोर्ट नहीं करता।
* उसी कुंजी के साथ कमिट किया गया अनुरोध दोबारा भेजने पर उसका दर्ज परिणाम लौटता है। उसी कुंजी के साथ अलग सामग्री भेजने पर `400 {"idempotency_key": "different_payload"}` लौटता है।
* Firebase पैरामीटर `firebase` ऑब्जेक्ट में जाते हैं: `{signer_key, salt_separator, rounds, mem_cost}`।
* `GET imports/` कमिट किए गए बैच की सूची देता है।

## फ़ाइल प्रारूप

### JSON

लोगों का एक ऐरे, या ऐसा ऑब्जेक्ट जिसके `users` में वह ऐरे हो।

| फ़ील्ड | नियम |
| - | - |
| `email` | अनिवार्य। |
| `external_id` | 255 अक्षरों तक। व्यक्ति का [`vendor_data`](https://docs.didit.me/hi/entities/vendor-data-linking) बन जाता है। |
| `email_verified` | `true` या `false` (`1`/`0`, `yes`/`no` भी)। |
| `display_name` | 200 अक्षरों तक। |
| `password_hash`, `password_salt`, `password_algorithm` | देखें [पासवर्ड](#पासवर्ड)। |
| `totp_secret` | Base32 ऑथेंटिकेटर सीक्रेट। |
| `created_at`, `last_signed_in_at` | ISO 8601। बिना ज़ोन वाला समय UTC माना जाता है। |
| `social` | अधिकतम 8 `{provider, subject, tenant_id}`। `provider` `google`, `apple`, `github` या `microsoft` है। `tenant_id` केवल Microsoft के लिए आवश्यक है। |
| `organizations` | अधिकतम 20 `{slug, name, role}`। `role` `admin`, `member` (डिफ़ॉल्ट) या `billing` है। |

### CSV

वही एकल-मान वाले कॉलम, साथ में `google_id`, `apple_id`, `github_id`, `microsoft_id`, `microsoft_tenant_id`, `organization_slug`, `organization_name` और `organization_role`। जो व्यक्ति कई संगठनों में है, उसके लिए हर संगठन की अलग पंक्ति होती है।

```csv theme={null}
email,external_id,email_verified,password_hash,google_id,organization_slug,organization_role
user@example.com,user-1234,true,$2b$12$...,1234567890,acme,admin
```

अज्ञात फ़ील्ड या कॉलम त्रुटियाँ हैं, इन्हें कभी अनदेखा नहीं किया जाता।

### डुप्लीकेट और मौजूदा खाते

* एक ही ईमेल वाली पंक्तियाँ एक व्यक्ति बन जाती हैं। एक जैसी पंक्ति को डुप्लीकेट गिना जाता है। जिस पंक्ति में अधिक लिंक, संगठन या ऑथेंटिकेटर हों, उसे मर्ज किया जाता है।
* एक व्यक्ति के लिए दो अलग पासवर्ड हैश, ऑथेंटिकेटर सीक्रेट या संगठन भूमिकाएँ त्रुटियाँ हैं। किसी `external_id` या provider subject पर दो लोगों का दावा होना भी त्रुटि है।
* यदि उस ईमेल वाला खाता पहले से मौजूद है और किसी पिछले इंपोर्ट ने उसे बनाया था, तो व्यक्ति छोड़ दिया जाता है (`already_imported`)। यदि व्यक्ति ने खुद साइन अप किया था, तो यह `identity_conflict` त्रुटि है। इंपोर्ट कभी मौजूदा खाते को नहीं बदलता।

## पासवर्ड

| प्रारूप | स्वीकृत |
| - | - |
| bcrypt | `$2a$`, `$2b$` या `$2y$`, कॉस्ट 4 से 13 तक। |
| Argon2id | `$argon2id$v=19$...`। अधिकतम 64 MiB मेमोरी, मेमोरी गुणा पास अधिकतम 256 MiB, अधिकतम 8 लेन। |
| Django PBKDF2-SHA256 | `pbkdf2_sha256$...`, 10,000 से 2,000,000 इटरेशन तक। |
| Django scrypt | `scrypt$...`, वर्क फ़ैक्टर अधिकतम 32,768, ब्लॉक साइज़ 1 से 8 तक, पैरेललिज़्म 1 से 5 तक। |
| Firebase scrypt | `password_algorithm: "firebase_scrypt"`, हर व्यक्ति के लिए base64 `password_hash` और `password_salt`, साथ ही आपके प्रोजेक्ट के `signer_key`, `salt_separator`, `rounds` (1 से 8) और `mem_cost` (1 से 14) हर इंपोर्ट में एक बार। |

Firebase पैरामीटर उस एप्लिकेशन के लिए ही एन्क्रिप्ट करके संग्रहीत किए जाते हैं। कोई दूसरा प्रारूप, या इन सीमाओं से ऊपर की कॉस्ट, का अर्थ है कि उस व्यक्ति को नया पासवर्ड चाहिए। किसी व्यक्ति के पहले सफल साइन-इन के बाद, Didit उसका पासवर्ड अपने प्रारूप में फिर से संग्रहीत करता है।

### ऐसे लोग जिनके पास उपयोग योग्य पासवर्ड नहीं है

जब किसी व्यक्ति के पास हैश नहीं होता या उसका हैश समर्थित नहीं होता, तब पासवर्ड से प्रयास करने पर सामान्य 'गलत पासवर्ड' उत्तर मिलता है। Didit उन्हें नया पासवर्ड सेट करने के लिए एक लिंक ईमेल भी करता है (30 मिनट के लिए वैध, दिन में अधिकतम एक बार)। यह तभी होता है जब उनका ईमेल सत्यापित हो, खाता ब्लॉक न हो और पासवर्ड साइन-इन चालू हो।

परिणाम में, `reset_required` उन लोगों की गिनती करता है जिनके पास उपयोग योग्य पासवर्ड नहीं है। `reset_emails` उनमें से उन लोगों की गिनती करता है जिनका ईमेल सत्यापित है: केवल उन्हीं तक इस तरीके से पहुँचा जा सकता है। जिन लोगों का ईमेल सत्यापित नहीं है, वे पासवर्ड से साइन इन नहीं कर सकते। अगर आप वह तरीका चालू करते हैं, तो वे ईमेल कोड से अब भी साइन इन कर सकते हैं।

## सोशल लिंक, ऑथेंटिकेटर और संगठन

* **सोशल लिंक** उन प्रदाताओं के लिए रखे जाते हैं जिन्हें आपका एप्लिकेशन पहले से कॉन्फ़िगर कर चुका है, उसके मौजूदा क्लाइंट ID के अंतर्गत। इसके बाद किए जाने वाले साइन-इन में ईमेल प्रमाण की ज़रूरत नहीं होती। Google और GitHub सब्जेक्ट वैश्विक हैं। Apple सब्जेक्ट हर डेवलपर टीम के लिए अलग होते हैं और Microsoft सब्जेक्ट हर ऐप रजिस्ट्रेशन के लिए अलग, इसलिए ये लिंक तभी मेल खाते हैं जब आपके पुराने प्लेटफ़ॉर्म में वही टीम या रजिस्ट्रेशन इस्तेमाल हुआ हो। जिन प्रदाताओं को आपने कॉन्फ़िगर नहीं किया है, उनके लिंक `social_unavailable` के रूप में गिने जाते हैं और इंपोर्ट नहीं होते।
* **ऑथेंटिकेटर ऐप** (TOTP सीक्रेट: SHA-1, 6 अंक, 30 सेकंड) एन्क्रिप्टेड रूप में संग्रहीत होते हैं। इंपोर्ट किए गए लोगों को इन्हें अपने दूसरे कारक के रूप में इस्तेमाल करना होगा। उन्हें कोई रिकवरी कोड नहीं मिलते।
* **संगठन** जो अभी मौजूद नहीं हैं, उनके स्लग से बनाए जाते हैं।
* **पासकीज़** इंपोर्ट नहीं की जा सकतीं। वे आपके पुराने साइन-इन डोमेन से जुड़ी होती हैं, इसलिए लोग Didit से साइन इन करने के बाद नई पासकी जोड़ते हैं।

## परिणाम

हर ड्राई रन, बैच और जॉब एक ही `result` लौटाता है:

| फ़ील्ड | अर्थ |
| - | - |
| `rows`, `people_total` | पढ़ी गई पंक्तियाँ और अलग-अलग व्यक्ति। |
| `ready`, `already_imported`, `duplicates`, `merged`, `skipped` | हर व्यक्ति के साथ क्या होता है। |
| `passwords` | प्रारूप के अनुसार गिनती: `bcrypt`, `argon2id`, `firebase_scrypt`, `pbkdf2_sha256`, `scrypt`. |
| `reset_required`, `reset_emails`, `unsupported_hashes` | वे लोग जिन्हें नया पासवर्ड चाहिए। |
| `verified_emails` | वे व्यक्ति जो सत्यापित ईमेल के साथ इंपोर्ट हुए। |
| `social_links`, `social_unavailable` | प्रदाता के अनुसार रखे गए लिंक, और छोड़े गए लिंक। |
| `authenticator_apps` | वे व्यक्ति जिनका ऑथेंटिकेटर इंपोर्ट हुआ। |
| `organizations` | `count`, `members` और अधिकतम पाँच `names`। |
| `error_count`, `errors` | अधिकतम 100 त्रुटियाँ, हर एक के साथ शून्य-आधारित `row` (CSV पंक्ति `row + 2`), एक `field` और एक `error` कोड। |

प्रतिक्रियाओं में कभी पासवर्ड हैश, सॉल्ट, ऑथेंटिकेटर सीक्रेट या फ़ील्ड मान शामिल नहीं होते।

| त्रुटि | अर्थ |
| - | - |
| `file_too_large`, `too_many_rows`, `empty_file` | 25 MB से बड़ी, 100,000 व्यक्तियों से अधिक, या खाली। |
| `invalid_encoding`, `invalid_json`, `invalid_csv` | फ़ाइल पढ़ी नहीं जा सकती। |
| `unknown_column`, `missing_column`, `duplicate_column`, `unknown_field` | फ़ाइल प्रारूप से मेल नहीं खाती। |
| `required`, `invalid_field`, `invalid_row` | कोई मान गायब है या अमान्य है। |
| `identity_conflict` | उस ईमेल वाला खाता अपने आप साइन अप कर चुका है। |
| `social_link_conflict`, `password_conflict`, `authenticator_conflict`, `role_conflict` | एक ही व्यक्ति की दो पंक्तियाँ आपस में मेल नहीं खातीं। |
| `too_many_uploads`, `import_running`, `not_startable`, `file_expired` | जॉब अभी शुरू नहीं हो सकता। |

## स्विच करने से पहले

अपने सैंडबॉक्स एप्लिकेशन में परीक्षण करें:

* इंपोर्ट किए जाने वाले प्रत्येक पासवर्ड प्रारूप से साइन इन,
* उस व्यक्ति के लिए नया पासवर्ड सेट करने वाला ईमेल जिसके पास उपयोग योग्य हैश नहीं है,
* इंपोर्ट किए गए लोगों के लिए सोशल साइन-इन और ऑथेंटिकेटर कोड,
* एक ही फ़ाइल को दो बार चलाना।

फिर जाँच करें कि हर व्यक्ति का `vendor_data` उस मान से मेल खाता है जिसे आप उनके [सत्यापन और लेन-देन](https://docs.didit.me/hi/authentication/overview.md#उत्पादों-में-एक-ही-व्यक्ति-को-बनाए-रखें) के लिए उपयोग करते हैं।


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