本文へ移動
ドキュメント · iOSとAndroid

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をご覧ください。