> For the complete documentation index, see [llms.txt](https://docs.roboflow.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.roboflow.com/reference/hi/authentication/authentication/sign-in-with-roboflow-developer-reference.md).

# Roboflow के साथ साइन इन करें (Developer Reference)

Roboflow के साथ साइन इन करने के लिए OAuth संदर्भ, दृश्यता, त्रुटियाँ, और example app।

Sign in with Roboflow के लिए इंटीग्रेटर संदर्भ। ऐप पंजीकृत करने, PKCE, और प्राधिकरण प्रवाह के लिए, देखें [Roboflow के साथ साइन इन करें (आरंभ करना)](/reference/hi/authentication/authentication/sign-in-with-roboflow-getting-started.md).

## उदाहरण ऐप

[roboflow/siwr\_example\_app](https://github.com/roboflow/siwr_example_app) एक न्यूनतम Node.js ऐप है जो प्रोडक्शन OAuth को लागू करता है `app.roboflow.com` और `api.roboflow.com`. टोकन Express सत्र में रहते हैं; ब्राउज़र कभी भी क्लाइंट सीक्रेट नहीं देखता।

```bash
git clone https://github.com/roboflow/siwr_example_app.git
cd siwr_example_app
cp .env.example .env
# RF_CLIENT_ID, RF_CLIENT_SECRET, SESSION_SECRET सेट करें
npm install && npm run dev
```

रीडायरेक्ट URI के साथ एक OAuth ऐप पंजीकृत करें `http://localhost:3001/oauth/callback` और ऐप से मेल खाते अनुमत scopes (`openid`, `profile`, `email`, `workspace:read`, `project:read`, `model:infer`).

| रूट                   | उद्देश्य                                 |
| --------------------- | ---------------------------------------- |
| `GET /`               | लैंडिंग या साइन-इन डैशबोर्ड              |
| `GET /oauth/start`    | OAuth शुरू करें (PKCE रीडायरेक्ट)        |
| `GET /oauth/callback` | कोड का आदान-प्रदान करें, डैशबोर्ड दिखाएँ |
| `POST /logout`        | टोकन रद्द करें और सत्र साफ़ करें         |

### PKCE और प्राधिकरण URL

से [`src/oauth.ts`](https://github.com/roboflow/siwr_example_app/blob/main/src/oauth.ts):

```typescript
export function pkcePair(): { verifier: string; challenge: string } {
    const verifier = crypto.randomBytes(48).toString("base64url");
    const challenge = crypto.createHash("sha256").update(verifier).digest("base64url");
    return { verifier, challenge };
}

export function buildAuthorizeUrl(state: string, codeChallenge: string): string {
    const url = new URL(`${config.appHost}/oauth/authorize`);
    url.searchParams.set("response_type", "code");
    url.searchParams.set("client_id", config.clientId);
    url.searchParams.set("redirect_uri", config.redirectUri);
    url.searchParams.set("scope", REQUESTED_SCOPE_STRING);
    url.searchParams.set("state", state);
    url.searchParams.set("code_challenge", codeChallenge);
    url.searchParams.set("code_challenge_method", "S256");
    return url.toString();
}
```

`GET /oauth/start` संग्रहीत करता है `वेरिफ़ायर` और `state` सत्र में, फिर इस URL पर रीडायरेक्ट करता है।

### टोकन विनिमय (सर्वर-साइड)

```typescript
const body = new URLSearchParams({
    grant_type: "authorization_code",
    code,
    redirect_uri: config.redirectUri,
    client_id: config.clientId,
    client_secret: config.clientSecret,
    code_verifier: codeVerifier
});

const response = await fetch(`${config.appHost}/oauth/token`, {
    method: "POST",
    headers: { "Content-Type": "application/x-www-form-urlencoded" },
    body
});
```

### कॉलबैक: सत्यापित करें `state`

से [`src/server.ts`](https://github.com/roboflow/siwr_example_app/blob/main/src/server.ts):

```typescript
const pending = req.session.oauth;
req.session.oauth = undefined;

if (!pending || !code || state !== pending.state) {
    // अमान्य state या कोड अनुपलब्ध होने पर अस्वीकार करें
    return;
}

const data = await exchangeCodeForTokens(code, pending.verifier);
req.session.tokens = tokensFromTokenResponse(data);
```

कोड का आदान-प्रदान करने से पहले हमेशा एक-बार उपयोग होने वाला OAuth सत्र डेटा साफ़ करें।

## टोकन एंडपॉइंट प्रमाणीकरण

टोकन एंडपॉइंट गोपनीय क्लाइंट्स के लिए दो तरीकों का समर्थन करता है (सार्वजनिक क्लाइंट secret को छोड़ते हैं और PKCE पर निर्भर करते हैं):

| विधि                  | यह कैसे काम करता है                                                                                |
| --------------------- | -------------------------------------------------------------------------------------------------- |
| `client_secret_post`  | भेजें `client_secret` अनुरोध बॉडी में एक form parameter के रूप में (डिफ़ॉल्ट)                      |
| `client_secret_basic` | HTTP में क्रेडेंशियल भेजें `Authorization: Basic` हेडर (base64-एन्कोडेड `client_id:client_secret`) |

वह विधि चुनें जो आपके क्लाइंट या गेटवे से मेल खाती हो। OAuth ऐप बनाते या संपादित करते समय इसे सेट करें **Workspace Settings > Developer**.

के साथ टोकन विनिमय का उदाहरण `client_secret_basic`:

```bash
curl -X POST https://app.roboflow.com/oauth/token \
  -u "YOUR_CLIENT_ID:YOUR_CLIENT_SECRET" \\
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=authorization_code" \
  -d "code=AUTHORIZATION_CODE" \
  -d "redirect_uri=https://yourapp.com/callback" \
  -d "code_verifier=YOUR_CODE_VERIFIER"
```

## होस्ट

| सेवा                | आधार URL                   |
| ------------------- | -------------------------- |
| साइन-इन, टोकन, OIDC | `https://app.roboflow.com` |
| REST API            | `https://api.roboflow.com` |

## दृश्यता

यह नियंत्रित करता है कि कौन-से वर्कस्पेस आपके OAuth ऐप से साइन इन कर सकते हैं।

| डैशबोर्ड विकल्प   | कौन साइन इन कर सकता है                                                    |
| ----------------- | ------------------------------------------------------------------------- |
| **आंतरिक**        | केवल उस वर्कस्पेस के सदस्य जिसने ऐप बनाया है                              |
| **सूचीबद्ध नहीं** | कोई भी वर्कस्पेस, यदि उनके पास आपका क्लाइंट ID हो                         |
| **सार्वजनिक**     | असूचीबद्ध, और सक्षम होने पर Sign in with Roboflow निर्देशिका में सूचीबद्ध |

कोई अलग "External" दृश्यता प्रकार नहीं है। क्रॉस-वर्कस्पेस इंटीग्रेशन उपयोग करते हैं **सूचीबद्ध नहीं**.

प्रत्येक ग्राहक वर्कस्पेस एक भी सेट कर सकता है **बाहरी OAuth ऐप नीति** (सभी को अनुमति दें, client IDs की allowlist, या सभी को ब्लॉक करें)। यदि आपके वर्कस्पेस के बाहर साइन-इन विफल होता है, तो ग्राहक से उनके वर्कस्पेस सेटिंग्स में आपका client ID अनुमति देने के लिए कहें।

## साइन-इन और टोकन (app.roboflow\.com)

| उद्देश्य           | विधि | URL                                                         | नोट्स                                              |
| ------------------ | ---- | ----------------------------------------------------------- | -------------------------------------------------- |
| अधिकृत करें        | GET  | `https://app.roboflow.com/oauth/authorize`                  | PKCE + `state` आवश्यक                              |
| टोकन / रीफ़्रेश    | POST | `https://app.roboflow.com/oauth/token`                      | `application/x-www-form-urlencoded`                |
| रद्द करें          | POST | `https://app.roboflow.com/oauth/revoke`                     | बॉडी: `token=...`                                  |
| उपयोगकर्ता जानकारी | GET  | `https://app.roboflow.com/oauth/userinfo`                   | बेयरर; आवश्यक है `openid`                          |
| निरीक्षण करें      | POST | `https://app.roboflow.com/oauth/introspect`                 | फॉर्म `token=...`; client id + secret              |
| सत्यापित करें      | GET  | `https://app.roboflow.com/oauth/validate`                   | बेयरर टोकन; क्लाइंट क्रेडेंशियल्स की आवश्यकता नहीं |
| OIDC खोज           | GET  | `https://app.roboflow.com/.well-known/openid-configuration` |                                                    |
| JWKS               | GET  | `https://app.roboflow.com/.well-known/jwks.json`            | सत्यापित करें `id_token` JWTs                      |

## REST API पर टोकन का उपयोग

भेजें `Authorization: Bearer {access_token}` पर `api.roboflow.com`. देखें [REST API से प्रमाणीकरण करें](/reference/hi/platform/rest-api/authenticate-with-the-rest-api.md).

## सामान्य त्रुटियाँ

| HTTP                     | अर्थ                                                    | क्या करना है                                              |
| ------------------------ | ------------------------------------------------------- | --------------------------------------------------------- |
| 400 `invalid_scope`      | स्कोप ऐप की अनुमत सूची में नहीं है                      | डैशबोर्ड में स्कोप जोड़ें या अनुरोध से हटाएँ              |
| 401 `OAuthException`     | टोकन की अवधि समाप्त हो गई है या उसे रद्द कर दिया गया है | एक बार रीफ़्रेश करें, फिर साइन-इन के लिए फिर से संकेत दें |
| 403 (स्कोप)              | टोकन में स्कोप नहीं है                                  | अधिक व्यापक स्कोप के साथ फिर से सहमति दें                 |
| 403 (अन्य)               | उपयोगकर्ता भूमिका के पास अनुमति नहीं है                 | वर्कस्पेस व्यवस्थापक भूमिका समायोजित करता है              |
| रीडायरेक्ट मेल नहीं खाता | `redirect_uri` पंजीकरण से मेल नहीं खाता                 | डैशबोर्ड प्रविष्टि या अपने authorize URL को ठीक करें      |

## सुरक्षा

* हर authorize अनुरोध पर PKCE का उपयोग करें।
* सत्यापित करें `state` हर कॉलबैक पर।
* कभी भी उजागर न करें `client_secret` या refresh tokens को ब्राउज़र के सामने।
* साइन-आउट पर टोकन रद्द करें।
* न्यूनतम स्कोप का अनुरोध करें; पूरी सूची देखें [शुरू करें](/reference/hi/authentication/authentication/sign-in-with-roboflow-getting-started.md#available-scopes).
