iOS і Android
Нативні програми виконують вхід через Lobby свого середовища в системному браузері, а ніколи не у вебпредставленні: люди користуються своїми ключами входу, збереженими паролями й сеансом Usher, а програма ніколи не бачить пароля. Решту OpenID Connect SDK роблять за вас і зберігають токени на пристрої.
Зареєструйте програму
В 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.