{ "info": { "name": "AuthHex Client API Collection", "description": "Web client authentication flow - Email OTP registration and password login", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", "_postman_id": "auth-hex-client-api-collection", "version": "1.0.0" }, "variable": [ { "key": "baseUrl", "value": "https://localhost:7001/api", "description": "Base URL for AuthHex API" }, { "key": "accessToken", "value": "", "description": "JWT Access Token - set automatically after login" }, { "key": "refreshToken", "value": "", "description": "JWT Refresh Token - set automatically after login" }, { "key": "email", "value": "user@example.com", "description": "Email for testing" }, { "key": "referenceNumber", "value": "", "description": "OTP Reference Number - set automatically" } ], "item": [ { "name": "Health Check", "item": [ { "name": "API Status", "request": { "method": "GET", "header": [], "url": { "raw": "{{baseUrl}}/status", "host": ["{{baseUrl}}"], "path": ["status"] }, "description": "Check if API is running" }, "response": [] } ] }, { "name": "Client Registration Flow", "item": [ { "name": "Step 1: Check Email Availability", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" } ], "body": { "mode": "raw", "raw": "{\n \"functionName\": \"isAvailable\",\n \"payload\": {\n \"Identifier\": \"{{email}}\"\n }\n}" }, "url": { "raw": "{{baseUrl}}/alt", "host": ["{{baseUrl}}"], "path": ["alt"] }, "description": "Check if email is available for registration" }, "response": [], "event": [ { "listen": "test", "script": { "exec": [ "var jsonData = pm.response.json();", "if (jsonData.data && jsonData.data.IsAvailable) {", " pm.environment.set('emailAvailable', true);", " console.log('Email is available');", "} else {", " console.log('Email already exists');", "}" ], "type": "text/javascript" } } ] }, { "name": "Step 2: Send Email OTP (New User)", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" } ], "body": { "mode": "raw", "raw": "{\n \"functionName\": \"sendOtp\",\n \"payload\": {\n \"identifier\": \"{{email}}\",\n \"numberOfDigits\": 6,\n \"newUser\": true\n }\n}" }, "url": { "raw": "{{baseUrl}}/alt", "host": ["{{baseUrl}}"], "path": ["alt"] }, "description": "Send OTP to email for new user registration" }, "response": [], "event": [ { "listen": "test", "script": { "exec": [ "var jsonData = pm.response.json();", "if (jsonData.data && jsonData.data.Data && jsonData.data.Data.ReferenceNumber) {", " pm.environment.set('referenceNumber', jsonData.data.Data.ReferenceNumber);", " console.log('Email OTP Reference: ' + jsonData.data.Data.ReferenceNumber);", "}" ], "type": "text/javascript" } } ] }, { "name": "Step 3: Verify Email OTP (New User)", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" } ], "body": { "mode": "raw", "raw": "{\n \"functionName\": \"VerifyOTP\",\n \"payload\": {\n \"referenceNumber\": \"{{referenceNumber}}\",\n \"otpCode\": \"123456\",\n \"newUser\": true,\n \"identifier\": \"{{email}}\",\n \"deviceName\": \"Chrome Desktop\"\n }\n}" }, "url": { "raw": "{{baseUrl}}/alt", "host": ["{{baseUrl}}"], "path": ["alt"] }, "description": "Verify email OTP for new user registration. Returns verification token." }, "response": [], "event": [ { "listen": "test", "script": { "exec": [ "var jsonData = pm.response.json();", "if (jsonData.data && jsonData.data.verificationToken) {", " pm.environment.set('verificationToken', jsonData.data.verificationToken);", " console.log('Email OTP Verified - Registration can proceed');", "}" ], "type": "text/javascript" } } ] }, { "name": "Step 4: Complete Registration", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" } ], "body": { "mode": "raw", "raw": "{\n \"functionName\": \"registerUser\",\n \"payload\": {\n \"fullName\": \"Alice Johnson\",\n \"userName\": \"alicejohnson\",\n \"email\": \"{{email}}\",\n \"nic\": \"199612345679\",\n \"password\": \"SecureClientPass123!\",\n \"roleId\": \"00000000-0000-0000-0000-000000000001\",\n \"userTypeId\": \"00000000-0000-0000-0000-000000000001\",\n \"chkUser\": false\n }\n}" }, "url": { "raw": "{{baseUrl}}/user", "host": ["{{baseUrl}}"], "path": ["user"] }, "description": "Complete user registration with verified email" }, "response": [], "event": [ { "listen": "test", "script": { "exec": [ "var jsonData = pm.response.json();", "if (jsonData.statusCode === 200) {", " console.log('Client user registered successfully');", "}" ], "type": "text/javascript" } } ] }, { "name": "Alternative: Direct Registration", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" } ], "body": { "mode": "raw", "raw": "{\n \"fullName\": \"Bob Williams\",\n \"userName\": \"bobwilliams\",\n \"email\": \"bob.williams@example.com\",\n \"nic\": \"199712345678\",\n \"password\": \"SecureClientPass123!\",\n \"roleId\": \"00000000-0000-0000-0000-000000000001\",\n \"userTypeId\": \"00000000-0000-0000-0000-000000000001\",\n \"chkUser\": true\n}" }, "url": { "raw": "{{baseUrl}}/registerUser", "host": ["{{baseUrl}}"], "path": ["registerUser"] }, "description": "Direct registration endpoint - bypasses OTP verification" }, "response": [] } ] }, { "name": "Client Login Flow", "item": [ { "name": "Login with Email/Username & Password", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" } ], "body": { "mode": "raw", "raw": "{\n \"identifier\": \"{{email}}\",\n \"password\": \"SecureClientPass123!\",\n \"deviceName\": \"Chrome Desktop\"\n}" }, "url": { "raw": "{{baseUrl}}/loginUser", "host": ["{{baseUrl}}"], "path": ["loginUser"] }, "description": "Login with email/username and password - returns JWT tokens" }, "response": [], "event": [ { "listen": "test", "script": { "exec": [ "var jsonData = pm.response.json();", "if (jsonData.data && jsonData.data.AccessToken) {", " pm.environment.set('accessToken', jsonData.data.AccessToken);", " pm.environment.set('refreshToken', jsonData.data.RefreshToken);", " console.log('Login successful - Tokens saved');", "} else if (jsonData.data && jsonData.data.RequiresTwoFA) {", " console.log('2FA Required - Use Verify 2FA endpoint');", "}" ], "type": "text/javascript" } } ] }, { "name": "Alternative: Login via /user endpoint", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" } ], "body": { "mode": "raw", "raw": "{\n \"functionName\": \"loginUser\",\n \"payload\": {\n \"identifier\": \"{{email}}\",\n \"password\": \"SecureClientPass123!\",\n \"deviceName\": \"Chrome Desktop\"\n }\n}" }, "url": { "raw": "{{baseUrl}}/user", "host": ["{{baseUrl}}"], "path": ["user"] }, "description": "Alternative login using the generic /user endpoint" }, "response": [], "event": [ { "listen": "test", "script": { "exec": [ "var jsonData = pm.response.json();", "if (jsonData.data && jsonData.data.AccessToken) {", " pm.environment.set('accessToken', jsonData.data.AccessToken);", " pm.environment.set('refreshToken', jsonData.data.RefreshToken);", " console.log('Login successful - Tokens saved');", "}" ], "type": "text/javascript" } } ] } ] }, { "name": "Authenticated Client Operations", "item": [ { "name": "Get User Details", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "body": { "mode": "raw", "raw": "{\n \"functionName\": \"getUserDetails\",\n \"payload\": {}\n}" }, "url": { "raw": "{{baseUrl}}/user", "host": ["{{baseUrl}}"], "path": ["user"] }, "description": "Get authenticated user details" }, "response": [] }, { "name": "Get User Sessions", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "body": { "mode": "raw", "raw": "{\n \"functionName\": \"getUserSessions\",\n \"payload\": {}\n}" }, "url": { "raw": "{{baseUrl}}/user", "host": ["{{baseUrl}}"], "path": ["user"] }, "description": "Get all active sessions for the user" }, "response": [] }, { "name": "Change Password", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "body": { "mode": "raw", "raw": "{\n \"functionName\": \"ChangeUserPassword\",\n \"payload\": {\n \"currentPassword\": \"SecureClientPass123!\",\n \"newPassword\": \"NewSecureClientPass456!\"\n }\n}" }, "url": { "raw": "{{baseUrl}}/user", "host": ["{{baseUrl}}"], "path": ["user"] }, "description": "Change user password" }, "response": [] }, { "name": "Change User Status", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "body": { "mode": "raw", "raw": "{\n \"functionName\": \"ChangeUserStatus\",\n \"payload\": {\n \"isActive\": true\n }\n}" }, "url": { "raw": "{{baseUrl}}/user", "host": ["{{baseUrl}}"], "path": ["user"] }, "description": "Enable or disable user account" }, "response": [] }, { "name": "Logout", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "body": { "mode": "raw", "raw": "{\n \"functionName\": \"LogoutUser\",\n \"payload\": {}\n}" }, "url": { "raw": "{{baseUrl}}/user", "host": ["{{baseUrl}}"], "path": ["user"] }, "description": "Logout user and invalidate current session" }, "response": [], "event": [ { "listen": "test", "script": { "exec": [ "pm.environment.unset('accessToken');", "pm.environment.unset('refreshToken');", "console.log('Logged out - Tokens cleared');" ], "type": "text/javascript" } } ] } ] }, { "name": "Password Recovery", "item": [ { "name": "Step 1: Request Password Reset (Forgot Password)", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" } ], "body": { "mode": "raw", "raw": "{\n \"identifier\": \"{{email}}\"\n}" }, "url": { "raw": "{{baseUrl}}/forgotPassword", "host": ["{{baseUrl}}"], "path": ["forgotPassword"] }, "description": "Request password reset - sends OTP to registered email/mobile" }, "response": [], "event": [ { "listen": "test", "script": { "exec": [ "var jsonData = pm.response.json();", "if (jsonData.data && jsonData.data.ReferenceNumber) {", " pm.environment.set('referenceNumber', jsonData.data.ReferenceNumber);", " console.log('Reset OTP Reference: ' + jsonData.data.ReferenceNumber);", "}" ], "type": "text/javascript" } } ] }, { "name": "Step 2: Verify Reset OTP", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" } ], "body": { "mode": "raw", "raw": "{\n \"functionName\": \"VerifyForgotPasswordOTP\",\n \"payload\": {\n \"referenceNumber\": \"{{referenceNumber}}\",\n \"otpCode\": \"123456\"\n }\n}" }, "url": { "raw": "{{baseUrl}}/recovery", "host": ["{{baseUrl}}"], "path": ["recovery"] }, "description": "Verify OTP for password reset" }, "response": [] }, { "name": "Step 3: Reset Password", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" } ], "body": { "mode": "raw", "raw": "{\n \"functionName\": \"ResetPassword\",\n \"payload\": {\n \"referenceNumber\": \"{{referenceNumber}}\",\n \"newPassword\": \"MyNewPassword123!\"\n }\n}" }, "url": { "raw": "{{baseUrl}}/recovery", "host": ["{{baseUrl}}"], "path": ["recovery"] }, "description": "Set new password using verified OTP reference" }, "response": [] } ] }, { "name": "Two-Factor Authentication (Client)", "item": [ { "name": "Initiate 2FA Setup", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "body": { "mode": "raw", "raw": "{\n \"functionName\": \"initiateTwoFASetup\",\n \"payload\": {}\n}" }, "url": { "raw": "{{baseUrl}}/user", "host": ["{{baseUrl}}"], "path": ["user"] }, "description": "Get QR code and secret for Google Authenticator setup" }, "response": [] }, { "name": "Complete 2FA Setup", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "body": { "mode": "raw", "raw": "{\n \"functionName\": \"completeTwoFASetup\",\n \"payload\": {\n \"verificationCode\": \"123456\"\n }\n}" }, "url": { "raw": "{{baseUrl}}/user", "host": ["{{baseUrl}}"], "path": ["user"] }, "description": "Verify and complete 2FA setup" }, "response": [] }, { "name": "Verify 2FA Code (During Login)", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "body": { "mode": "raw", "raw": "{\n \"functionName\": \"verifyTwoFA\",\n \"payload\": {\n \"code\": \"123456\"\n }\n}" }, "url": { "raw": "{{baseUrl}}/user", "host": ["{{baseUrl}}"], "path": ["user"] }, "description": "Verify 2FA code during login for accounts with 2FA enabled" }, "response": [] }, { "name": "Get 2FA Status", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "body": { "mode": "raw", "raw": "{\n \"functionName\": \"getTwoFAStatus\",\n \"payload\": {}\n}" }, "url": { "raw": "{{baseUrl}}/user", "host": ["{{baseUrl}}"], "path": ["user"] }, "description": "Check if 2FA is enabled for user" }, "response": [] }, { "name": "Disable 2FA", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" }, { "key": "Authorization", "value": "Bearer {{accessToken}}" } ], "body": { "mode": "raw", "raw": "{\n \"functionName\": \"disableTwoFA\",\n \"payload\": {\n \"password\": \"SecureClientPass123!\"\n }\n}" }, "url": { "raw": "{{baseUrl}}/user", "host": ["{{baseUrl}}"], "path": ["user"] }, "description": "Disable 2FA for user account (requires password confirmation)" }, "response": [] } ] }, { "name": "Utility Functions", "item": [ { "name": "Check Identifier Availability", "request": { "method": "POST", "header": [ { "key": "Content-Type", "value": "application/json" } ], "body": { "mode": "raw", "raw": "{\n \"functionName\": \"isAvailable\",\n \"payload\": {\n \"Identifier\": \"testuser@example.com\"\n }\n}" }, "url": { "raw": "{{baseUrl}}/alt", "host": ["{{baseUrl}}"], "path": ["alt"] }, "description": "Check if email, username, NIC, or mobile number is already registered" }, "response": [] } ] } ], "auth": { "type": "bearer", "bearer": [ { "key": "token", "value": "{{accessToken}}", "type": "string" } ] } }