diff options
| author | Christian Cleberg <[email protected]> | 2026-07-17 17:04:15 -0500 |
|---|---|---|
| committer | Christian Cleberg <[email protected]> | 2026-07-17 17:04:15 -0500 |
| commit | 8e6d29f1806cc569b48d913564c7d80a1c2f2355 (patch) | |
| tree | 60ae62636b45c1a6368f4d0b3c119df74b6ba029 /octosentry/DeviceAuthModels.swift | |
| parent | 2f72d3d0736a6fac306d4e5d9406cb33b08bc2a0 (diff) | |
| download | octosentry-0.4.0.tar.gz octosentry-0.4.0.tar.bz2 octosentry-0.4.0.zip | |
Replace env-var PAT with GitHub device authorization flow + Keychain0.4.0
Closes #6, #7 (milestone 0.4.0).
- GitHubDeviceAuthClient implements the OAuth 2.0 device authorization
grant (device code request + poll for token) against GitHub's OAuth
App endpoints. Verified against the real endpoints directly.
- KeychainTokenStore stores the resulting token in the app's own
Keychain item (not synced to iCloud Keychain), no shared entitlement
needed since nothing else reads it.
- AuthStore drives the sign-in state machine (signedOut /
awaitingAuthorization / signedIn) and a new SignInView replaces the
old "missing token" error state with an actual sign-in UI.
- SecurityEventStore now reads the token from Keychain instead of the
GITHUB_TOKEN environment variable, which is fully retired.
- Scope requested is security_events, the narrowest available for
classic OAuth Apps (no read-only variant exists at this level, unlike
fine-grained PATs). Private-repo Dependabot alerts may need broader
repo scope — to be confirmed with real-world testing.
Diffstat (limited to 'octosentry/DeviceAuthModels.swift')
| -rw-r--r-- | octosentry/DeviceAuthModels.swift | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/octosentry/DeviceAuthModels.swift b/octosentry/DeviceAuthModels.swift new file mode 100644 index 0000000..dcd62c6 --- /dev/null +++ b/octosentry/DeviceAuthModels.swift @@ -0,0 +1,38 @@ +// +// DeviceAuthModels.swift +// octosentry +// +// Wire types for GitHub's OAuth 2.0 Device Authorization Grant +// (RFC 8628): github.com/login/device/code and +// github.com/login/oauth/access_token. +// + +import Foundation + +nonisolated struct DeviceCodeResponse: Decodable { + let deviceCode: String + let userCode: String + let verificationUri: URL + let expiresIn: Int + let interval: Int + + enum CodingKeys: String, CodingKey { + case deviceCode = "device_code" + case userCode = "user_code" + case verificationUri = "verification_uri" + case expiresIn = "expires_in" + case interval + } +} + +nonisolated struct AccessTokenResponse: Decodable { + let accessToken: String? + let error: String? + let interval: Int? + + enum CodingKeys: String, CodingKey { + case accessToken = "access_token" + case error + case interval + } +} |
