{"id":51482514,"url":"https://github.com/dianait/veriff-demo","last_synced_at":"2026-07-07T03:01:06.025Z","repository":{"id":357813692,"uuid":"1234526810","full_name":"dianait/veriff-demo","owner":"dianait","description":"✅ A demo implementation of the Veriff iOS SDK integration for identity verification flows.","archived":false,"fork":false,"pushed_at":"2026-05-14T10:29:39.000Z","size":782,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-14T12:32:27.360Z","etag":null,"topics":["authentication","identity-verification","security","veriff"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dianait.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-10T09:53:26.000Z","updated_at":"2026-05-14T10:29:43.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/dianait/veriff-demo","commit_stats":null,"previous_names":["dianait/veriff-demo"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/dianait/veriff-demo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dianait%2Fveriff-demo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dianait%2Fveriff-demo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dianait%2Fveriff-demo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dianait%2Fveriff-demo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dianait","download_url":"https://codeload.github.com/dianait/veriff-demo/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dianait%2Fveriff-demo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35212581,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-07T02:00:07.222Z","response_time":90,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["authentication","identity-verification","security","veriff"],"created_at":"2026-07-07T03:01:05.293Z","updated_at":"2026-07-07T03:01:06.017Z","avatar_url":"https://github.com/dianait.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# veriffDemo\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd width=\"65%\"\u003e\n      \u003cp\u003e\n        Demo iOS app showing how to integrate the\n        \u003ca href=\"https://github.com/Veriff/veriff-ios-spm\"\u003eVeriff iOS SDK\u003c/a\u003e\n        with Clean Architecture, SOLID principles, and modern SwiftUI.\n      \u003c/p\u003e\n      \u003cp\u003e\n        A single screen creates a verification session against Veriff's\n        \u003ccode\u003ePOST /v1/sessions\u003c/code\u003e and immediately launches the SDK with the resulting URL.\n        Every tap produces a fresh session — there is no hardcoded URL.\n      \u003c/p\u003e\n      \u003cp\u003e\n        \u003ccode\u003eHTTPSessionRepository\u003c/code\u003e is the only\n        \u003ccode\u003eSessionRepositoryProtocol\u003c/code\u003e implementation. It reads its config\n        API key + base URL from a gitignored \u003ccode\u003eSecrets.plist\u003c/code\u003e.\n        Without that file, the app still launches but every verification attempt\n        surfaces a clear \"missing configuration\" error in the UI, so the failure\n        mode is discoverable instead of crashing.\n      \u003c/p\u003e\n    \u003c/td\u003e\n      \u003ctd width=\"35%\"\u003e\n      \u003cimg src=\"./public/veriff-demo.gif\" alt=\"Veriff iOS demo app screenshot\" width=\"260\"\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## 💠 End-to-end flow\n\n```\nVerificationView (button tap)\n  └─ VerificationViewModel.startVerification()\n       └─ VerificationProviderProtocol.verify()                      # Domain seam\n            └─ VeriffVerificationProvider.verify()                   # Data\n                 ├─ SessionRepositoryProtocol.createSession()\n                 │    └─ HTTPSessionRepository.createSession()\n                 │         POST \u003cbaseURL\u003e/v1/sessions\n                 │         headers:  Content-Type: application/json\n                 │                   X-AUTH-CLIENT: \u003capi key from Secrets.plist\u003e\n                 │         body:     { \"verification\": {} }\n                 │         response  → CreateSessionResponseDTO\n                 │                   → SessionMapper.toDomain\n                 │                   → VerificationSession(id, url)\n                 └─ VeriffSdk.startAuthentication(sessionUrl:)\n                      delegate → VeriffResultMapper → VerificationResult\n       =\u003e VerificationResult.state =\n            .completed | .cancelled | .failed(message)\n```\n\n## ⚙️ Configuration\n\nThe repo includes a `Secrets.example.plist` template at the project root. Setup steps:\n\n1. If `veriffDemo/Secrets.plist` does not exist, copy `Secrets.example.plist` into `veriffDemo/` and rename it to `Secrets.plist`.\n2. In Xcode (or any plist editor), set `VeriffAPIKey` to a real API key from your Veriff Customer Portal → API keys.\n3. Leave `VeriffBaseURL` as `https://stationapi.veriff.com` unless you have a different endpoint.\n4. Re-run the app.\n\nHow the config is loaded:\n\n- `VeriffAPIConfig.loadFromBundle()` reads `Secrets.plist` from the app bundle, validates that both keys are present and `VeriffAPIKey` is non-empty, and returns a `VeriffAPIConfig`.\n- `DependencyContainer.makeSessionRepository()` returns `HTTPSessionRepository(config:)` when the config loads. Otherwise it returns an internal `UnconfiguredSessionRepository` that surfaces a clear error on first use — the app launches either way, so missing setup is obvious instead of fatal.\n\n`veriffDemo/Secrets.plist` is gitignored, so the key never enters version control.\n\n\u003e [!CAUTION]\n\u003e This demo performs `POST /v1/sessions` directly from the device for sandbox and learning purposes only.\n\u003e\n\u003e In a real production environment, session creation should be delegated to a backend service to avoid exposing API credentials in the mobile binary.\n\u003e Why:\n\u003e - The Veriff API key never ships inside the mobile binary, since mobile applications are inherently inspectable.\n\u003e - The verification session remains associated with your authenticated user on your backend.\n\u003e - You can apply rate limiting, fraud detection, telemetry, and analytics centrally.\n\u003e - You can persist the user ↔ Veriff session mapping for webhook handling and auditing.\n\n\u003e [!TIP]\n\u003e Because the only seam Presentation depends on is `VerificationProviderProtocol`, swapping `HTTPSessionRepository` for a `BackendSessionRepository` is a one-line change inside `DependencyContainer`. Nothing in Presentation or Domain changes — that is the practical payoff of the layered architecture.\n\n## 🈸 Requirements\n\n- Xcode 16 or newer (the project uses synchronized folder groups).\n- iOS 17 or newer (uses `@Observable`).\n- Swift 6.2 toolchain (the project enables `-default-isolation=MainActor`).\n- The Veriff SDK is added via Swift Package Manager (`https://github.com/Veriff/veriff-ios-spm`).\n\n## 👟 Running\n\n1. Open `veriffDemo.xcodeproj`.\n2. Configure `Secrets.plist` as described in **Configuration** above.\n3. Select an iOS Simulator destination (Previews and the SDK do not run on physical devices via Previews).\n4. Build and run.\n\nEach tap of \"Start verification\" creates a fresh session via `POST /v1/sessions` and launches the Veriff SDK with the resulting URL.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdianait%2Fveriff-demo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdianait%2Fveriff-demo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdianait%2Fveriff-demo/lists"}