Login with Inji (WLA) — Real IDA vs Mock IDA Requirements

Problem Summary

We’ve successfully implemented the credential download pipeline (eSignet 1.8.0 → Certify → Inji wallet), but “Login with Inji” (WLA) QR-code authentication is blocked by infrastructure we don’t have deployed. Before investing in a full IDA deployment, we need to clarify whether a mock IDA would suffice or if a real production IDA is required.


What’s Working :white_check_mark:

  • eSignet v1.8.0 deployed (OAuth/OpenID provider)
  • Keycloak configured with eSignet as identity provider
  • Inji wallet successfully downloads mock mDL credentials from Certify
  • Wallet ↔ Server authentication (token validation, credential issuance)

What’s Broken :cross_mark:

“Login with Inji” (QR-based authentication) fails at activation step.

Flow We’re Trying to Achieve

1. eSignet generates QR code
2. Inji wallet scans QR
3. Wallet activates credential for online login
   ↓ THIS STEP FAILS
4. Credential bound to device
5. User can use credential to login via Keycloak

Root Cause: Missing IDA Service

Per official docs:

  1. Inji Docs

    • Credentials must be “activated for online login” before QR login works
    • Activation is user-initiated in the wallet
  2. eSignet Docs ( Wallet Authenticator | Signet )

  3. Reality Check

    • eSignet’s actual API surface does NOT include /kyc-exchange/* endpoints
    • These must be delegated to an external IDA service

What We’ve Tried :wrench:

Attempt 1: Mock Identity System (Failed)

  • Used MOSIP’s mock identity system from certify-service-with-plugins
  • Issue: Built for eSignet’s mock credential flow, not IDA KYC-exchange protocol
  • Result: Incompatible protocols — can’t stand in for IDA

Attempt 2: Certify’s Built-in IDA Plugin (Blocked)

  • Found unused MOSIP IDA identity-issuance plugin in Certify image
  • Requires: Real IDA service backend
  • Missing: KYC API implementation, identity data store
  • Result: Dead end without IDA

Current Architecture

┌─────────────┐
│  Keycloak   │
└──────┬──────┘
       │ (SSO via eSignet)
       ↓
┌──────────────────┐
│    eSignet       │ ← Credential holder integration
│  (v1.8.0)        │   (needs IDA to call KYC APIs)
└──────┬───────────┘
       │
       ├─→ Certify (credential issuance) ✅
       │
       ├─→ Mock Identity System ✅
       │
       └─→ IDA (KYC-exchange APIs) ❌ NOT DEPLOYED


The Question: Real vs Mock IDA

Option 1: Deploy Real MOSIP IDA

What it is: Full Identity Data Authority component from MOSIP stack

  • Standalone service with proper identity data store
  • Implements KYC-exchange protocol
  • Handles identity verification, data masking, compliance
  • Production-grade with audit logs

Scope:

  • Requires separate Docker deployment (~2-3 services: IDA, DB, KYC processor)
  • Needs real identity data seeding
  • Configuration for credential scoping & data release policies
  • Integration testing with eSignet

Questions:

  • Is this overkill for a proof-of-concept?
  • Do we need production IDA compliance for demo purposes?

Option 2: Mock IDA (If One Exists)

What it would need:

  • Implement /kyc-exchange/request and /kyc-exchange/response endpoints
  • Accept wallet’s KYC request with:
    • Credential ID
    • Identity attributes to release
    • Proof of possession
  • Return verified identity data
  • No real identity database — just mock responses

Advantages:

  • Minimal footprint (single container)
  • Can bootstrap it quickly
  • Sufficient for WLA demo/testing

Questions for Community:

  1. Does MOSIP provide a mock IDA anywhere?
  2. Has anyone built a minimal mock IDA for eSignet testing?
  3. Are there example KYC-exchange request/response payloads in the docs?

Option 3: Bypass IDA (Partial Workaround)

Idea: Can we use a credential format that doesn’t require IDA activation?

  • Current attempt: mDL (vc+sd-jwt) — requires IDA
  • Possible alternative: ldp_vc format — per eSignet docs, “supported for credential holder”
  • Question: Does ldp_vc skip the IDA-binding step, or just use a different serialization?

What We Need to Know

For the Community:

  1. Has anyone implemented “Login with Inji” without a real IDA?

    • If yes, how did you mock it?
    • What credential format did you use?
  2. KYC-Exchange Protocol:

    • Official spec/examples?
    • Request/response payload format?
    • Authentication mechanism between eSignet ↔ IDA?
  3. eSignet Credential Holder Integration:

    • Why is only ldp_vc supported?
    • Does ldp_vc avoid the IDA binding step?
    • Can mDL be used with a different activation flow?
  4. MOSIP Component Status:

    • Is there a standalone mock IDA in MOSIP examples?
    • Any reference implementations for minimal KYC services?
  5. Real-World Deployments:

    • For production eSignet+Inji, is a real IDA always required?
    • What’s the typical deployment (cloud, on-prem)?

Before we commit: We want community input on whether a mock IDA is viable for our use case or if we should jump to real IDA deployment.

Hi @Rutvik,

Thank you for your time and patience in trying eSignet and the Inji stack.

If eSignet is integrated as an IdP in Keycloak, is eSignet integrated with the mock-identity-system using the mock authenticator plugin?

After the VC is downloaded, it is activated. This activation process is nothing but keybinding, as explained here:

This KeyBinder interface implementation is available in the mock-plugin. Once the key binding is successful, the same key should be used for WLA auth. This should work as expected with the mock plugin.

Can you please share logs, screenshots, and the version of the mock-identity-system used?

Note: mock-identity-system is meant to be used only for POCs.

Thanks & Regards,
MOSIP

Thanks @anusha for your time I am able to fix issue and able to login with inji but I need to bypass few things below are details. I am using below version

mosipid/esignet-with-plugins:1.8.0
mosipid/oidc-ui:1.8.0
mosipid/mock-identity-system:0.13.0

Face verification (selfie check) — was failing and blocking the flow. Bypassed just for this demo build so it auto-passes; the real face-matching code still runs, we just don’t require it to succeed.

User ID lookup — the driving-license-style credential we’re using doesn’t carry a real user ID in the format eSignet expects, so it was getting rejected. Plugged in a known test ID for the demo.

Login signature mismatch — the wallet was signing the login request with the wrong cryptographic method for this particular step, so eSignet was rejecting it outright. Fixed by forcing the correct method for just this step.

These are only for demo so for now bypassed above will try to fix it later.

Thanks