跳到正文
文档 · iOS 和 Android

iOS 和 Android

原生 App 在系统浏览器中通过环境的 Lobby 让用户登录,绝不使用网页视图:用户可以使用自己的通行密钥、已存储的密码和 Usher 会话,而 App 永远看不到密码。OpenID Connect 的其余部分由 SDK 替你完成,令牌也保存在设备上。

注册 App

在 Usher Console 中打开环境,然后前往 应用 → 新建应用 → 移动或桌面。为它设置一个由你拥有的域名构成的私有重定向地址,例如 com.example.notes:/oauth/callback。它会获得一个客户端 ID,但没有机密:手机上的 App 无法妥善保管机密,因此改用 PKCE。Console 会显示两个平台的设置方法。

iOS 和 macOS

swift
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

kotlin
// 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 密钥库中的密钥加密。

SDK 会检查什么

  • 每次登录时的 PKCE、state 和 nonce,以及响应中写明的颁发者(RFC 9207)。
  • ID 令牌的签名是否与你的环境的密钥相符,以及它的颁发者、受众和过期时间。
  • 刷新令牌会轮换:每个只使用一次。退出登录时,会在 Usher 处将其撤销。
  • DPoP(如果你开启了它):令牌绑定到设备上的密钥,复制到别处就毫无用处。

如需用访问令牌调用你自己的 API,请为 API 命名,并通过 resources 请求它:请参阅你自己的 API。