This commit is contained in:
+36
-10
@@ -12,8 +12,8 @@ MIB uses **two completely separate backends**:
|
||||
|
||||
| Backend | Base URL | Auth | Used for |
|
||||
|---|---|---|---|
|
||||
| Encrypted API | `https://faisamobilex-smvc-v2.mib.com.mv/index/` | Blowfish + DH session key | Login, key exchange |
|
||||
| WebView host | `https://faisamobilex-wv.mib.com.mv` | Session cookies | Accounts, history, transfers, contacts, cards, financing |
|
||||
| Encrypted API | `https://faisamobilex-smvc-v2.mib.com.mv/index/` | Blowfish + DH session key | Login, accounts, history, transfers, contacts, profile images |
|
||||
| WebView host | `https://faisamobilex-wv-v2.mib.com.mv` | Session cookies | Cards, financing, personal details, activity history, keep-alive |
|
||||
|
||||
---
|
||||
|
||||
@@ -22,10 +22,24 @@ MIB uses **two completely separate backends**:
|
||||
All calls to the encrypted API are `POST /` with `Content-Type: application/x-www-form-urlencoded; charset=utf-8` and form body:
|
||||
|
||||
```
|
||||
sfunc=<function_code>&data=<url_encoded_base64_blowfish_ciphertext>
|
||||
xxid=<session_xxid>&sfunc=<function_code>&data=<url_encoded_base64_blowfish_ciphertext>
|
||||
```
|
||||
|
||||
The request JSON is encrypted with Blowfish (ECB, PKCS5) before sending. The response body is also base64-encoded Blowfish ciphertext.
|
||||
`xxid` is omitted on the key exchanges (`sfunc=r` / `sfunc=i`); `sfunc=i` sends `key2` instead. The request JSON is encrypted with Blowfish (ECB, PKCS5) before sending. The response body is also base64-encoded Blowfish ciphertext — on failures too, which come back as HTTP `400` with an encrypted `success: false` body.
|
||||
|
||||
Every `sfunc=n` call is identified by a `routePath` inside the encrypted payload, alongside the standard fields:
|
||||
|
||||
```json
|
||||
{
|
||||
"nonce": "<computed nonce>",
|
||||
"appId": "<appId>",
|
||||
"sodium": "<random int>",
|
||||
"routePath": "<route, e.g. A84>",
|
||||
"xxid": "<session xxid>"
|
||||
}
|
||||
```
|
||||
|
||||
Route-specific fields are added to the same object. See [02-login.md](02-login.md) for the request headers.
|
||||
|
||||
Two keys are used:
|
||||
|
||||
@@ -40,17 +54,17 @@ See [01-encryption.md](01-encryption.md) for full details.
|
||||
|
||||
## WebView Session Auth
|
||||
|
||||
After login, all data endpoints use cookie-based auth on `faisamobilex-wv.mib.com.mv`:
|
||||
After login, the WebView endpoints use cookie-based auth on `faisamobilex-wv-v2.mib.com.mv`:
|
||||
|
||||
```
|
||||
Cookie: mbmodel=IOS-1.0; xxid=<session_xxid>; IBSID=<session_xxid>; mbnonce=<nonceGenerator>; time-tracker=597
|
||||
Cookie: mbmodel=AND-1.0; xxid=<session_xxid>; IBSID=<session_xxid>; mbnonce=<nonceGenerator>; time-tracker=597
|
||||
```
|
||||
|
||||
These values come from the login flow — `xxid` and `nonceGenerator` from the DH key exchange response.
|
||||
|
||||
**Cookie notes:**
|
||||
|
||||
- `time-tracker=597` is a **hardcoded constant** in the client. Every WebView client (transfers, contacts, cards, activity, etc.) sends the literal value `597` — it is not computed or rotated.
|
||||
- `time-tracker=597` is a **hardcoded constant** in the client. Every WebView client (cards, financing, activity, etc.) sends the literal value `597` — it is not computed or rotated.
|
||||
- `mbnonce` is the **unmodified `nonceGenerator` string** from the key-exchange response. It does **not** carry a freshly-computed per-request nonce. The actual per-request nonce (derived via the algorithm in [01-encryption.md](01-encryption.md)) only appears inside the encrypted payloads of `sfunc=n` calls on the encrypted API — WebView endpoints have no nonce field.
|
||||
|
||||
### WebView AJAX Headers
|
||||
@@ -60,7 +74,7 @@ All AJAX `POST` calls also require:
|
||||
```
|
||||
X-Requested-With: XMLHttpRequest
|
||||
Accept: */*
|
||||
Origin: https://faisamobilex-wv.mib.com.mv
|
||||
Origin: https://faisamobilex-wv-v2.mib.com.mv
|
||||
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
|
||||
```
|
||||
|
||||
@@ -79,6 +93,18 @@ A MIB session is considered expired when **either** condition is met (`MibLoginF
|
||||
|
||||
On detection the client auto-recovers by re-running the login flow using stored credentials, refreshes `xxid` + `nonceGenerator` in the in-flight payload, and retries the original request once. Callers receive the retried response transparently. If the recovery itself hits expiry again it surfaces a `SessionExpiredException`.
|
||||
|
||||
### Keep-Alive
|
||||
|
||||
```
|
||||
POST https://faisamobilex-wv-v2.mib.com.mv/aProfile/keepAlive
|
||||
```
|
||||
|
||||
Empty body, session cookies only. Sent periodically to keep the session open. An expired session returns HTTP `419` with:
|
||||
|
||||
```json
|
||||
{ "success": false, "responseCode": "3", "reasonCode": "41", "reasonText": "Session Expired" }
|
||||
```
|
||||
|
||||
### WebView User-Agent
|
||||
|
||||
```
|
||||
@@ -93,11 +119,11 @@ Mozilla/5.0 (Linux; Android {version}; wv) AppleWebKit/537.36 (KHTML, like Gecko
|
||||
|---|---|---|
|
||||
| 1 | [01-encryption.md](01-encryption.md) | Blowfish encryption, DH key exchange, nonce computation |
|
||||
| 2 | [02-login.md](02-login.md) | Device registration and regular login flows |
|
||||
| 3 | [03-accounts.md](03-accounts.md) | Select profile, account balances |
|
||||
| 3 | [03-accounts.md](03-accounts.md) | Select profile, account balances, account refresh |
|
||||
| 4 | [04-history.md](04-history.md) | Transaction history |
|
||||
| 5 | [05-cards.md](05-cards.md) | Debit card list |
|
||||
| 6 | [06-financing.md](06-financing.md) | Financing deals |
|
||||
| 7 | [07-profile.md](07-profile.md) | Personal profile (HTML scrape) |
|
||||
| 7 | [07-profile.md](07-profile.md) | Personal details, profile image |
|
||||
| 8 | [08-transfer.md](08-transfer.md) | Account lookup and fund transfer |
|
||||
| 9 | [09-contacts.md](09-contacts.md) | Beneficiary management |
|
||||
| 10 | [10-activity-history.md](10-activity-history.md) | Activity / audit log |
|
||||
|
||||
Reference in New Issue
Block a user