Device ID
PlayerPrefs["DEVICE_ID"]; on iOS additionally mirrored to the Keychain (survives uninstall). The assets/deviceId.txt file present in the install package contains a single byte, "1"; no code reads it anywhere; it does not appear to be the device id source.
SFS zone login
A stock SFS2XLoginRequest (action=1, system controller), but every call site passes an empty password. Real auth material is entirely inside the parameters SFSObject:
All three integrity fields (
SecurityCode/OneCode/CoreV) are ordinary client-side MD5 constructions with a hardcoded salt, fully reproducible in Go, no native dependency. Native binaries & security posture found no evidence the server treats them as a hard gate versus a fingerprint for offline analysis, but a Go client should send them anyway (they cost nothing to compute).
Post-login sequence
The server pushes, unsolicited, in order:init.before → init (the big state snapshot: user.uid, account-bind status, and critically chatToken for the separate chat WebSocket) → init.after (or init.error). A Go client does not send init itself, just wait for it. Immediately after, the real client fires check.device.change (empty payload), worth mimicking.
Guest identity is sufficient
No OAuth is required to play:account.login.new with type=1 and only deviceId/airKey/pf is the full “no external provider” path. Social binding (Google Sign-In type=2, Apple Game Center type=4, Play Games type=5) requires obtaining a provider token yourself, out of scope for a headless client, and optional.
Session persistence
A second, optional channel: chat
Real-time chat text runs over a separate WebSocket (JSON frames, not SFSObject), authenticated with thechatToken from the init push. Server discovery is its own HTTP bootstrap (chat_server_links.php, signed with an MD5 formula keyed on a fixed app id 100017). Every outbound message is signed: MD5(uid + json(sortedParams) + sendTime + connectionSign). This channel is optional, skip it entirely if the Go client doesn’t need real-time chat; “share to chat” and moderation commands still work over the plain SFS socket regardless (see Alliance, chat & mail).