iOS и Android
Нативните приложения осигуряват вход през Lobby на своята среда в системния браузър, никога в уеб изглед: хората използват своите ключове за достъп, запазени пароли и сесия в Usher, а приложението никога не вижда парола. SDK правят останалото от OpenID Connect вместо вас и пазят токените на устройството.
Регистрирайте приложението
В Usher Console отворете средата, след това Приложения → Ново приложение → Мобилно или настолно. Задайте му пренасочване с частна схема, образувана от домейн, който притежавате, например com.example.notes:/oauth/callback. Приложението получава ID на клиента без секрет: приложение на телефон не може да пази секрет, затова вместо това използва PKCE. Console показва настройката и за двете платформи.
iOS и macOS
import UsherKit
let usher = UsherClient(configuration: .init(
issuer: URL(string: "https://login.example.com")!,
clientID: "…",
redirectURI: URL(string: "com.example.notes:/oauth/callback")!))
let session = try await usher.signIn()
var request = URLRequest(url: URL(string: "https://api.example.com/notes")!)
try await usher.authorize(&request)Токените се пазят в Ключодържателя, само на това устройство.
Android
// build.gradle.kts: manifestPlaceholders["usherRedirectScheme"] = "com.example.notes"
val usher = Usher.client(context, UsherConfiguration(
issuer = "https://login.example.com",
clientId = "…",
redirectUri = "com.example.notes:/oauth/callback"))
val session = usher.signIn(Usher.customTabs(activity))Входът се отваря в Custom Tab. Сесията е шифрована с ключ в Android Keystore.
Какво проверяват SDK
- PKCE, state и nonce при всеки вход, както и издателя, посочен в отговора (RFC 9207).
- Подписа на ID токена спрямо ключовете на вашата среда, както и неговия издател, аудитория и срок на валидност.
- Токените за опресняване се сменят: всеки се използва веднъж. При изход токенът се отменя в Usher.
- DPoP, ако го включите: токени, обвързани с ключ на устройството, безполезни, ако бъдат копирани другаде.
За да извиквате собствения си API с токена за достъп, назовете API и го поискайте с resources: вижте Вашите собствени API.