iOS: player tokens in the keychain, and a build that uploads (#419)
The player rode only on the web view's Cloudflare Access cookie, so it stopped with "Sign in again" when that session ended, and CarPlay (#420), which has no web view, would have had nothing at all. Credentials.swift keeps an ipx API token and an Access service token in the keychain, and the player sends them (Authorization: Bearer, CF-Access-Client-Id and -Secret) on its audio, position, read-flag and artwork requests. Without all three it uses the cookie as before. Shake, Player Tokens enters them. project.yml gets what TestFlight needs: the team, a numeric version (App Store Connect refuses 0.1.0-dev), upside-down portrait (an iPad build fails validation without every orientation) and ITSAppUsesNonExemptEncryption. Resources/Info.plist is generated by XcodeGen and now ignored. Not run on a phone: the header option on AVURLAsset is read by name, as the SDK has no constant for it. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -29,6 +29,16 @@ Shake the phone to change it. Plain `http://` only on your own network
|
||||
that follows, through Cloudflare Access or ipx's own form; the cookies that leaves are what the
|
||||
player uses (`CookieBridge`). `-ipx.server <url>` as a launch argument overrides it for a run.
|
||||
|
||||
## Player tokens
|
||||
|
||||
The player normally rides on the web view's cookie, which ends with Cloudflare Access's session.
|
||||
To make it outlast that, shake the phone, choose Player Tokens and enter three things, all kept
|
||||
in the keychain (`Credentials.swift`): an ipx API token (the page's Settings, API tokens), and the
|
||||
Client ID and Client Secret of an Access service token (Zero Trust, Access, Service credentials),
|
||||
which the `ipodderx` application needs a *Service Auth* policy for. Without all three the player
|
||||
sends only the cookie, as before. Playback's own requests use them (the audio, positions, the
|
||||
artwork); the page still signs in as it did.
|
||||
|
||||
## How it hangs together
|
||||
|
||||
| | |
|
||||
@@ -73,7 +83,7 @@ its own clock, so both happen while the page is frozen. Video stays in the page.
|
||||
|
||||
* Episodes kept on the device (#412) are the page's service worker's, which a `WKWebView` does
|
||||
not run without App-Bound Domains; the app plays them from the server.
|
||||
* The cookie is the only credential: when Cloudflare Access's expires mid-drive, playback stops
|
||||
with "Sign in again", and opening the app signs in. A token in the keychain would end that.
|
||||
* Without the player tokens the cookie is the only credential: when Cloudflare Access's expires
|
||||
mid-drive, playback stops with "Sign in again", and opening the app signs in.
|
||||
* CarPlay's dashboard app needs Apple's entitlement first; then it is a second scene over the same
|
||||
`Playback`.
|
||||
|
||||
Reference in New Issue
Block a user