iOS e Android
Os apps nativos iniciam a sessão das pessoas pelo Lobby do ambiente no navegador do sistema, nunca em uma web view: as pessoas usam as suas chaves-senha, as senhas salvas e a sessão do Usher, e o app nunca vê uma senha. Os SDKs fazem o resto do OpenID Connect por você e guardam os tokens no dispositivo.
Registre o app
No Usher Console, abra o ambiente e vá em Aplicações → Nova aplicação → Móvel ou desktop. Dê a ela um redirecionamento de uso privado criado a partir de um domínio seu, como com.example.notes:/oauth/callback. Ela recebe um ID de cliente e nenhum segredo: um app em um celular não tem como mantê-lo em sigilo, então usa PKCE no lugar. O Console mostra a configuração para as duas plataformas.
iOS e 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)Os tokens ficam nas Chaves (Keychain), somente neste dispositivo.
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))O início de sessão abre em uma Custom Tab. A sessão é criptografada com uma chave no Android Keystore.
O que os SDKs verificam
- PKCE, state e nonce em todo início de sessão, e o emissor indicado na resposta (RFC 9207).
- A assinatura do token de ID com as chaves do seu ambiente, além do emissor, do público-alvo e da expiração dele.
- Os tokens de atualização passam por rotação: cada um é usado uma única vez. Finalizar a sessão o revoga no Usher.
- DPoP, se você ativar: tokens vinculados a uma chave no dispositivo, inúteis se copiados para outro lugar.
Para chamar a sua própria API com o token de acesso, dê um nome à API e peça por ela com resources: veja As suas próprias APIs.