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, expiresAt | ISO 8601 समय। पास लगभग एक मिनट चलना चाहिए और 15 मिनट से ज़्यादा नहीं, ताकि उसकी फ़ोटो जल्दी बेकार हो जाए। |
| firstName, lastName | उनका नाम। |
| company | वे किसके लिए काम करते हैं, अगर साझा करना चुना। |
| phone | मोबाइल नंबर, बेहतर हो तो अंतरराष्ट्रीय रूप में। |
| ईमेल पता। | |
| vehicleRegistration | जिस वाहन से आए उसकी नंबर प्लेट। |
| documents | कार्ड और प्रमाणपत्र: हर एक में type (नीचे की सूची से) और वैकल्पिक रूप से number, issuer और expiresOn (YYYY-MM-DD) है। |
ज़रूरी: version, issuer, keyId, holderId, issuedAt, expiresAt, firstName। बाकी सब वैकल्पिक है और धारक हर बार चुनता है।
दस्तावेज़ प्रकार
site-safe-passport | Site 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-card | CSCS 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. कियोस्क के नियम
- जारीकर्ता की कुंजी से हस्ताक्षर जाँचें, और कि पास समाप्त नहीं हुआ। घड़ी के अंतर के लिए दोनों ओर 2 मिनट तक की छूट दें।
- कुंजियाँ सिर्फ़ जारीकर्ता के अपने HTTPS ओरिजिन से लें, और कैश करें ताकि पास ऑफ़लाइन जाँचा जा सके।
- जानकारी और जारीकर्ता का डोमेन दिखाएँ, और कुछ भी सहेजने से पहले विज़िटर को पुष्टि करने दें।
- दस्तावेज़ की जानकारी को धारक की दर्ज की हुई मानें, जाँची हुई नहीं। अगर साइट को जाँच चाहिए, तो कोई व्यक्ति असली कार्ड देखे।
- आप सिर्फ़ भरोसेमंद जारीकर्ताओं के पास स्वीकार कर सकते हैं, या किसी भी HTTPS जारीकर्ता को स्वीकार करके "Verified by <domain>" दिखा सकते हैं।
- धारक के ऐप से पास में मौजूद जानकारी से ज़्यादा कभी न माँगें। क्या साझा करना है, धारक चुनता है।
5. ऐप के नियम
- जब तक पास स्क्रीन पर है, कम से कम हर मिनट नया पास बनाएँ।
- धारक को चुनने दें कि कौन सी वैकल्पिक जानकारी जाए, हर बार या सहेजे गए विकल्प के रूप में जिसे वे बदल सकें।
- धारक के न चुने कुछ भी न डालें, जिसमें उनका नियोक्ता, स्थान या आंतरिक आईडी शामिल हैं।
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 साइट साइन इन कियोस्क उन्हें पढ़ता है, इस प्रारूप वाले दूसरे ऐप के पास भी।