iOSとAndroid
ネイティブアプリは、Webビューではなくシステムブラウザーで、環境のLobbyを通じてサインインします。ユーザーは自分のパスキー、保存済みのパスワード、Usherのセッションを使え、アプリがパスワードを目にすることはありません。OpenID Connectの残りの処理はSDKが行い、トークンはデバイス上に保管されます。
アプリを登録する
Usher Consoleで環境を開き、アプリケーション → 新規アプリケーション → モバイルまたはデスクトップを選びます。com.example.notes:/oauth/callbackのように、自分が所有するドメインから作ったプライベートユースのリダイレクトを指定してください。アプリにはクライアントIDが発行され、シークレットは発行されません。スマートフォン上のアプリはシークレットを安全に保管できないため、代わりに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 Keystoreの鍵で暗号化されます。
SDKが確認すること
- PKCE、state、nonceをすべてのサインインで確認し、応答に記された発行者も確認します(RFC 9207)。
- IDトークンの署名を環境の鍵で検証し、発行者、オーディエンス、有効期限も確認します。
- リフレッシュトークンはローテーションされます。各トークンは1回だけ使われます。サインアウトすると、Usherでそのトークンが失効します。
- DPoP(オンにした場合):トークンはデバイス上の鍵に結び付けられ、ほかの場所にコピーされても役に立ちません。
アクセストークンで独自のAPIを呼び出すには、APIに名前を付け、resourcesでそれを要求します。詳しくは独自のAPIをご覧ください。