105 lines
4.7 KiB
Markdown
105 lines
4.7 KiB
Markdown
|
|
# Authentication Issue - Bot Appears as Anonymous
|
||
|
|
|
||
|
|
## Problem
|
||
|
|
|
||
|
|
The bot successfully authenticates via browser automation and joins the Kosmi room, but appears in the user list as an **anonymous user** (e.g., "Anonymous Donkey") instead of as the authenticated account.
|
||
|
|
|
||
|
|
## What We Know
|
||
|
|
|
||
|
|
### ✅ Working Correctly
|
||
|
|
|
||
|
|
1. **Browser authentication**: Successfully logs in and obtains JWT token
|
||
|
|
2. **Token format**: Valid JWT with correct structure and claims
|
||
|
|
3. **Token transmission**: Correct token is sent in `connection_init`
|
||
|
|
4. **Server acceptance**: Server accepts the token (returns `connection_ack`)
|
||
|
|
5. **Room joining**: Successfully joins the room (`joinRoom` mutation returns `ok: true`)
|
||
|
|
|
||
|
|
### 🔍 Investigation Results
|
||
|
|
|
||
|
|
#### Token Claims Analysis
|
||
|
|
|
||
|
|
The authenticated JWT token contains:
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"aud": "kosmi",
|
||
|
|
"exp": 1761874131,
|
||
|
|
"iat": 1730338131,
|
||
|
|
"iss": "kosmi",
|
||
|
|
"sub": "e410acc0-e4bd-4694-8498-f20b9aa033fc",
|
||
|
|
"typ": "access"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**Key finding**: The token **only contains the user ID** (`sub`), but **NO display name, username, or email**. This is just an authentication token, not a profile token.
|
||
|
|
|
||
|
|
#### GraphQL API Queries
|
||
|
|
|
||
|
|
Tested the following queries with the authenticated token:
|
||
|
|
- `query { me { ... } }` - ❌ Field doesn't exist
|
||
|
|
- `query { currentUser { ... } }` - ❌ Field doesn't exist
|
||
|
|
- `query { user { ... } }` - ❌ Field doesn't exist
|
||
|
|
- `query { viewer { ... } }` - ❌ Field doesn't exist
|
||
|
|
|
||
|
|
**Conclusion**: There's no GraphQL query to fetch the current user's profile.
|
||
|
|
|
||
|
|
#### WebSocket Flow
|
||
|
|
|
||
|
|
Current flow:
|
||
|
|
1. `connection_init` with authenticated token → Server accepts
|
||
|
|
2. `connection_ack` → Server acknowledges
|
||
|
|
3. Subscribe to `newMessage` → Working
|
||
|
|
4. `joinRoom` mutation → Returns `ok: true`
|
||
|
|
5. Bot appears in user list as "Anonymous [Animal]"
|
||
|
|
|
||
|
|
## Hypotheses
|
||
|
|
|
||
|
|
### 1. Missing Profile Fetch
|
||
|
|
The server might need a separate API call (REST or GraphQL) to fetch the user profile using the user ID from the token.
|
||
|
|
|
||
|
|
### 2. Missing Display Name Mutation
|
||
|
|
There might be a GraphQL mutation to set the display name after joining:
|
||
|
|
- `mutation { setDisplayName(name: "...") }`
|
||
|
|
- `mutation { updateProfile(displayName: "...") }`
|
||
|
|
|
||
|
|
### 3. Server-Side Bug
|
||
|
|
The server might not be correctly associating the authenticated token with the user profile when joining via WebSocket.
|
||
|
|
|
||
|
|
### 4. Additional WebSocket Message
|
||
|
|
The browser might be sending an additional WebSocket message after `joinRoom` that we're not aware of.
|
||
|
|
|
||
|
|
## Next Steps
|
||
|
|
|
||
|
|
1. **Check `connection_ack` payload**: See if the server returns user info
|
||
|
|
2. **Monitor browser WebSocket traffic**: Watch what messages the browser sends after successful login and room join
|
||
|
|
3. **Test GraphQL introspection**: Query the schema to see all available mutations
|
||
|
|
4. **Compare anonymous vs authenticated flow**: See if there are any differences in the WebSocket message sequence
|
||
|
|
|
||
|
|
## Logs
|
||
|
|
|
||
|
|
### Successful Authentication and Join
|
||
|
|
```
|
||
|
|
time="2025-11-01T14:48:51-04:00" level=info msg="✅ Successfully obtained token via browser automation" prefix=kosmi
|
||
|
|
time="2025-11-01T14:48:51-04:00" level=info msg=" Email used: d2bkvqnh0@mozmail.com" prefix=kosmi
|
||
|
|
time="2025-11-01T14:48:51-04:00" level=info msg=" Token (first 50 chars): eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJrb..." prefix=kosmi
|
||
|
|
time="2025-11-01T14:48:51-04:00" level=info msg=" Token user ID (sub): e410acc0-e4bd-4694-8498-f20b9aa033fc" prefix=kosmi
|
||
|
|
time="2025-11-01T14:48:51-04:00" level=info msg=" Token type (typ): access" prefix=kosmi
|
||
|
|
time="2025-11-01T14:48:51-04:00" level=info msg="✓ getToken: Using manually provided token" prefix=kosmi
|
||
|
|
time="2025-11-01T14:48:51-04:00" level=info msg=" Length: 371" prefix=kosmi
|
||
|
|
time="2025-11-01T14:48:51-04:00" level=info msg=" First 50: eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJrb..." prefix=kosmi
|
||
|
|
time="2025-11-01T14:48:51-04:00" level=info msg="Sending connection_init with token (length: 371, first 20 chars: eyJhbGciOiJIUzUxMiIs...)" prefix=kosmi
|
||
|
|
time="2025-11-01T14:48:51-04:00" level=info msg="✅ WebSocket connection established and authenticated" prefix=kosmi
|
||
|
|
time="2025-11-01T14:48:51-04:00" level=info msg="✅ Successfully joined room" prefix=kosmi
|
||
|
|
time="2025-11-01T14:48:51-04:00" level=info msg="Join response payload: {"data":{"joinRoom":{"ok":true}}}" prefix=kosmi
|
||
|
|
```
|
||
|
|
|
||
|
|
**Result**: Bot appears as "Anonymous [Animal]" in the user list despite successful authentication.
|
||
|
|
|
||
|
|
## Files Modified for Debugging
|
||
|
|
|
||
|
|
- `bridge/kosmi/browser_auth.go`: Added comprehensive token logging
|
||
|
|
- `bridge/kosmi/kosmi.go`: Added token setting confirmation
|
||
|
|
- `bridge/kosmi/graphql_ws_client.go`: Added token source and `connection_ack` payload logging
|
||
|
|
- `cmd/decode-token/main.go`: Tool to decode and analyze JWT tokens
|
||
|
|
- `cmd/test-profile-query/main.go`: Tool to test GraphQL profile queries
|
||
|
|
|