Open Site Pass

कार्यस्थलों पर साइन इन के लिए खुला QR कोड मानक। कोई भी ऐप पास दिखा सकता है, और कोई भी कियोस्क उसे पढ़ सकता है।

संस्करण 1, नवंबर 2026। CC BY 4.0 के तहत मुफ़्त उपयोग।

ठेकेदार हर हफ़्ते अलग साइट पर साइन इन करते हैं, और हर साइट वही जानकारी माँगती है: नाम, कंपनी, मोबाइल, वाहन, Site Safe कार्ड। Open Site Pass से वे यह जानकारी ऐप में रख सकते हैं और QR कोड दिखाकर दे सकते हैं। किसी ने भी बनाया हो, कोई भी ऐप पास दिखा सकता है और कोई भी साइन इन कियोस्क उसे पढ़ सकता है।

इसे लिखने से पहले हमने मौजूदा मानक खोजा। QR पास वाले विज़िटर साइन इन उत्पादों का अपना-अपना प्रारूप है जो सिर्फ़ उसी उत्पाद में चलता है। सामान्य पहचान मानकों (W3C Verifiable Credentials, OpenID for Verifiable Presentations, ISO 18013-5 मोबाइल ड्राइविंग लाइसेंस) को वॉलेट ऐप और कई चरणों का आदान-प्रदान चाहिए, जो साइट गेट के टैबलेट की ज़रूरत से ज़्यादा है। इसलिए यह छोटा प्रारूप है जिसे कोई भी भाषा अपनी अंतर्निहित क्रिप्टो से पढ़ और जाँच सकती है।

1. QR कोड में क्या है

QR कोड में बिंदुओं से जुड़े तीन हिस्सों में सादा टेक्स्ट होता है:

OSP1.<pass>.<signature>
  • OSP1 बताता है कि यह Open Site Pass, संस्करण 1 है।
  • <pass> JSON के रूप में पास है, UTF-8, फिर बिना पैडिंग का base64url।
  • <signature>, <pass> के ASCII टेक्स्ट (ठीक जैसा QR कोड में है) पर SHA-256 के साथ ECDSA P-256 हस्ताक्षर है, 64-बाइट r ‖ s रूप में, फिर बिना पैडिंग का base64url। Web Crypto का crypto.subtle.sign यही रूप बनाता है।

2. पास

{
  "version": 1,
  "issuer": "https://timeclock.kiwi",
  "keyId": "2026-11-3fa9c1",
  "holderId": "b7f3c2e1a94d0c55e1f3b2a8",
  "issuedAt": "2026-11-01T09:42:00.000Z",
  "expiresAt": "2026-11-01T09:43:00.000Z",
  "firstName": "Sam",
  "lastName": "Taylor",
  "company": "Harbour Electrical Ltd",
  "phone": "+64215550142",
  "vehicleRegistration": "QKT482",
  "documents": [
    { "type": "site-safe-passport", "number": "SS-482913", "expiresOn": "2027-03-31" }
  ]
}
versionइस संस्करण के लिए हमेशा 1।
issuerपास पर हस्ताक्षर करने वाले का HTTPS ओरिजिन, जैसे https://timeclock.kiwi। इसी से उसकी कुंजियाँ मिलती हैं।
keyIdजारीकर्ता की किस कुंजी ने हस्ताक्षर किया।
holderIdएक जारीकर्ता के साथ एक व्यक्ति के लिए समान, और हर दूसरे जारीकर्ता के साथ अलग। इससे साइट लौटने वाले विज़िटर को पहचान पाती है। यह कर्मचारी संख्या, ईमेल या कुछ भी ऐसा नहीं होना चाहिए जो उन्हें कहीं और पहचाने।
issuedAt, expiresAtISO 8601 समय। पास लगभग एक मिनट चलना चाहिए और 15 मिनट से ज़्यादा नहीं, ताकि उसकी फ़ोटो जल्दी बेकार हो जाए।
firstName, lastNameउनका नाम।
companyवे किसके लिए काम करते हैं, अगर साझा करना चुना।
phoneमोबाइल नंबर, बेहतर हो तो अंतरराष्ट्रीय रूप में।
emailईमेल पता।
vehicleRegistrationजिस वाहन से आए उसकी नंबर प्लेट।
documentsकार्ड और प्रमाणपत्र: हर एक में type (नीचे की सूची से) और वैकल्पिक रूप से number, issuer और expiresOn (YYYY-MM-DD) है।

ज़रूरी: version, issuer, keyId, holderId, issuedAt, expiresAt, firstName। बाकी सब वैकल्पिक है और धारक हर बार चुनता है।

दस्तावेज़ प्रकार

site-safe-passportSite Safe passport
public-liability-insuranceसार्वजनिक देयता बीमा
electrical-registrationइलेक्ट्रिकल पंजीकरण
plumbing-gasfitting-registrationप्लंबिंग, गैसफ़िटिंग या ड्रेनलेइंग पंजीकरण
forklift-licenceफ़ोर्कलिफ़्ट लाइसेंस (F endorsement)
first-aid-certificateप्राथमिक चिकित्सा प्रमाणपत्र
working-at-heightsऊँचाई पर काम
confined-spacesसीमित स्थान
construction-induction-cardनिर्माण इंडक्शन कार्ड (White Card)
cscs-cardCSCS card

दूसरा प्रकार सुझाने के लिए नीचे संपर्क करें। कियोस्क अनजान प्रकार के दस्तावेज़ रखते हैं, पर उन्हें किसी से मिलाते नहीं।

3. जारीकर्ता की कुंजियाँ

जारीकर्ता अपनी सार्वजनिक कुंजियाँ <issuer>/.well-known/open-site-pass/keys.json पर प्रकाशित करते हैं:

{
  "keys": [
    {
      "keyId": "2026-11-3fa9c1",
      "publicKey": { "kty": "EC", "crv": "P-256", "x": "…", "y": "…" }
    }
  ]
}

हर publicKey एक JWK है, जिसे Web Crypto सीधे लोड कर सकता है। किसी कुंजी से हस्ताक्षर बंद करने के बाद उसे कम से कम एक दिन प्रकाशित रखें। Timeclock.Kiwi की कुंजियाँ https://timeclock.kiwi/.well-known/open-site-pass/keys.json पर हैं।

4. कियोस्क के नियम

  1. जारीकर्ता की कुंजी से हस्ताक्षर जाँचें, और कि पास समाप्त नहीं हुआ। घड़ी के अंतर के लिए दोनों ओर 2 मिनट तक की छूट दें।
  2. कुंजियाँ सिर्फ़ जारीकर्ता के अपने HTTPS ओरिजिन से लें, और कैश करें ताकि पास ऑफ़लाइन जाँचा जा सके।
  3. जानकारी और जारीकर्ता का डोमेन दिखाएँ, और कुछ भी सहेजने से पहले विज़िटर को पुष्टि करने दें।
  4. दस्तावेज़ की जानकारी को धारक की दर्ज की हुई मानें, जाँची हुई नहीं। अगर साइट को जाँच चाहिए, तो कोई व्यक्ति असली कार्ड देखे।
  5. आप सिर्फ़ भरोसेमंद जारीकर्ताओं के पास स्वीकार कर सकते हैं, या किसी भी HTTPS जारीकर्ता को स्वीकार करके "Verified by <domain>" दिखा सकते हैं।
  6. धारक के ऐप से पास में मौजूद जानकारी से ज़्यादा कभी न माँगें। क्या साझा करना है, धारक चुनता है।

5. ऐप के नियम

  1. जब तक पास स्क्रीन पर है, कम से कम हर मिनट नया पास बनाएँ।
  2. धारक को चुनने दें कि कौन सी वैकल्पिक जानकारी जाए, हर बार या सहेजे गए विकल्प के रूप में जिसे वे बदल सकें।
  3. धारक के न चुने कुछ भी न डालें, जिसमें उनका नियोक्ता, स्थान या आंतरिक आईडी शामिल हैं।

6. JavaScript में पास जाँचना

कियोस्क को बस इतना चाहिए, सिर्फ़ ब्राउज़र की अंतर्निहित क्रिप्टो से:

async function readPass(text, fetchKeys) {
  const [prefix, body, signature] = text.split('.');
  if (prefix !== 'OSP1') throw new Error('Not a site pass');

  const pass = JSON.parse(atob(body.replace(/-/g, '+').replace(/_/g, '/')));
  const keys = await fetchKeys(pass.issuer); // GET <issuer>/.well-known/open-site-pass/keys.json
  const jwk = keys.find(k => k.keyId === pass.keyId)?.publicKey;

  const key = await crypto.subtle.importKey('jwk', jwk, { name: 'ECDSA', namedCurve: 'P-256' }, false, ['verify']);
  const fromB64 = s => Uint8Array.from(atob(s.replace(/-/g, '+').replace(/_/g, '/')), c => c.charCodeAt(0));
  const ok = await crypto.subtle.verify({ name: 'ECDSA', hash: 'SHA-256' }, key, fromB64(signature), new TextEncoder().encode(body));

  const now = Date.now(), slack = 2 * 60 * 1000;
  if (!ok || Date.parse(pass.expiresAt) + slack < now) throw new Error('Not valid');
  return pass;
}

Timeclock.Kiwi के साथ उपयोग

Timeclock.Kiwi ऐप में साइन इन कोई भी My Site Pass से पास दिखा सकता है, और हर Timeclock.Kiwi साइट साइन इन कियोस्क उन्हें पढ़ता है, इस प्रारूप वाले दूसरे ऐप के पास भी।

हम हमेशा मदद के लिए तैयार हैं।
हमसे संपर्क करें, हम पूरी कोशिश करेंगे कि हमारा कर्मचारी उपस्थिति सिस्टम आपके लिए काम करे।