fix: login response parsing a00.r.r (v0.1.5)
This commit is contained in:
@@ -27,9 +27,12 @@ Content-Type: application/x-www-form-urlencoded
|
|||||||
**Response (Erfolg):**
|
**Response (Erfolg):**
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{ "r": { "r": <SessionObject> } }
|
{ "a00": { "r": { "r": <SessionObject> }, "cn": "log2in" } }
|
||||||
```
|
```
|
||||||
|
|
||||||
|
`SessionObject` enthält u.a. `tokenCsrf` und `webApiUrl`.
|
||||||
|
`tokenCsrf` ist die Session-ID – identisch zur `JSESSIONID` im Cookie.
|
||||||
|
|
||||||
**Response (Fehler):**
|
**Response (Fehler):**
|
||||||
|
|
||||||
```json
|
```json
|
||||||
@@ -38,7 +41,7 @@ Content-Type: application/x-www-form-urlencoded
|
|||||||
```
|
```
|
||||||
|
|
||||||
Der Server setzt nach erfolgreichem Login ein Session-Cookie:
|
Der Server setzt nach erfolgreichem Login ein Session-Cookie:
|
||||||
Set-Cookie: JSESSIONID=<session-id>
|
Set-Cookie: JSESSIONID=<session-id> (= tokenCsrf)
|
||||||
|
|
||||||
### Folgecalls (nach Login)
|
### Folgecalls (nach Login)
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|||||||
|
|
||||||
[project]
|
[project]
|
||||||
name = "mcp-familywall"
|
name = "mcp-familywall"
|
||||||
version = "0.1.4"
|
version = "0.1.5"
|
||||||
description = "MCP server for Family Wall — read your family's lists and tasks via Claude"
|
description = "MCP server for Family Wall — read your family's lists and tasks via Claude"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
requires-python = ">=3.12"
|
requires-python = ">=3.12"
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
__version__ = "0.1.4"
|
__version__ = "0.1.5"
|
||||||
|
|||||||
@@ -100,24 +100,21 @@ class FamilyWallClient:
|
|||||||
|
|
||||||
if "ex" in body or "un" in body:
|
if "ex" in body or "un" in body:
|
||||||
error_data = body.get("ex", body.get("un"))
|
error_data = body.get("ex", body.get("un"))
|
||||||
print(
|
_debug_log("LOGIN ERROR", f"status={response.status_code} body={body}")
|
||||||
f"[LOGIN ERROR] status={response.status_code} body={body}",
|
|
||||||
file=sys.stderr,
|
|
||||||
)
|
|
||||||
msg = f"Login failed: {error_data}"
|
msg = f"Login failed: {error_data}"
|
||||||
raise FamilyWallError(msg, response_data=body)
|
raise FamilyWallError(msg, response_data=body)
|
||||||
|
|
||||||
if "r" not in body:
|
# Response structure: {"a00": {"r": {"r": {"tokenCsrf": "...", ...}}}}
|
||||||
print(
|
try:
|
||||||
f"[LOGIN ERROR] status={response.status_code} body={body}",
|
session_id: str = body["a00"]["r"]["r"]["tokenCsrf"]
|
||||||
file=sys.stderr,
|
except (KeyError, TypeError) as exc:
|
||||||
)
|
_debug_log("LOGIN ERROR", f"status={response.status_code} body={body}")
|
||||||
raise FamilyWallError("Login failed: unexpected response format", response_data=body)
|
raise FamilyWallError(
|
||||||
|
"Login failed: unexpected response format", response_data=body
|
||||||
|
) from exc
|
||||||
|
|
||||||
# Extract JSESSIONID from the Set-Cookie header
|
|
||||||
session_id = response.cookies.get("JSESSIONID")
|
|
||||||
if not session_id:
|
if not session_id:
|
||||||
raise FamilyWallError("Login succeeded but no JSESSIONID cookie returned.")
|
raise FamilyWallError("Login succeeded but tokenCsrf is empty.")
|
||||||
|
|
||||||
self._session_id = session_id
|
self._session_id = session_id
|
||||||
logger.debug("Logged in; session acquired")
|
logger.debug("Logged in; session acquired")
|
||||||
|
|||||||
Reference in New Issue
Block a user