Skip to main content
offline_access スコープを含めて認証を行うと、認証情報の再入力を求めることなく新しいトークンをリクエストするために使用できる が返されます。

Credentials Manager

Auth0.swift には、認証情報の保存と更新を簡単に行うためのユーティリティクラスが用意されています。Credentials インスタンスから accessToken または idToken プロパティにアクセスできます。ユーザーの認証情報を管理するには、この方法を推奨します。 まず、Auth0 モジュールをインポートします。 import Auth0 次に、 ページを表示します。
let credentialsManager = CredentialsManager(authentication: Auth0.authentication())

Auth0
    .webAuth()
    .scope("openid profile offline_access")
    .start { result in
        switch result {
        case .success(let credentials):
            // 認証情報を Credentials Manager に渡す
            credentialsManager.store(credentials: credentials)
        case .failure(let error):
            // エラーを処理する
        }
}
アプリをアンインストールしても、Keychain の項目は削除されません。そのため、初回起動時にはアプリの Keychain 項目を必ずすべて消去することを推奨します。

認証情報の確認

アプリの起動時に簡単なチェックを行い、更新可能な認証情報がマネージャーに保存されていることを確認しておくと便利です。保存されていない場合は、ユーザーに認証を求めることができます。
guard credentialsManager.canRenew() else {
    // ログインページを表示する
}

ユーザーの認証情報の取得

次のようにして、ユーザーの認証情報を取得できます。
credentialsManager.credentials { result in 
    switch result {
    case .success(let credentials):
        // 有効な認証情報です。`idToken`、`accessToken` などのトークンプロパティにアクセスできます
    case .failure(let error):
        // エラーを処理し、ログインページを表示します
    }
}
トークンの有効期限が切れている場合でも、ユーザーの認証情報はまったく同じ方法で更新できます。Credentials Manager は認証情報を自動的に更新し、更新した認証情報を Keychain に保存したうえで、認証情報またはエラーのいずれかを含む Result を返します。

代替方法 - SimpleKeychain

このセクションは、Credentials Manager を使用しない開発者向けです。システム Keychain を薄くラップしたユーティリティである SimpleKeychain が用意されており、これを使用してトークンを安全に保存できます。 まず、SimpleKeychain モジュールをインポートします。 import SimpleKeychain 次に、インスタンスを作成し、必要なトークンを保存します。この例では、認証に成功した後で access_tokenrefresh_token を Keychain に保存します。
let keychain = SimpleKeychain(service: "Auth0")

Auth0
    .webAuth()
    .scope("openid profile offline_access")
    .start { result in
        switch result {
        case .success(let credentials):
            guard let refreshToken = credentials.refreshToken else { 
                // Handle error 
                return
            }
            // Store the tokens
            do {
                try keychain.set(credentials.accessToken, forKey: "access_token")
                try keychain.set(refreshToken, forKey: "refresh_token")
            } catch {
                // エラーを処理する
            }
            // ここでアプリのメインフローに遷移することを検討してください
        case .failure(let error):
            // エラーを処理する
        }
}
これらを保存しておけば、いつでも新しい Credentials インスタンスを取得できます。

ユーザーの認証情報の更新

let keychain = SimpleKeychain(service: "Auth0")

Auth0
    .authentication()
    .renew(withRefreshToken: refreshToken)
    .start { result in
        switch(result) {
        case .success(let credentials):
            // リフレッシュトークンローテーションが有効な場合、新しい
            // リフレッシュトークンが取得されます
            // 無効な場合は、新しいアクセストークンのみが取得されます
            guard let refreshToken = credentials.refreshToken else { 
                // エラーを処理する 
                return
            }
            // 新しいトークンを保存する
            do {
                try keychain.set(credentials.accessToken, forKey: "access_token")
                try keychain.set(refreshToken, forKey: "refresh_token")
            } catch {
                // エラーを処理する
            }
        case .failure(let error):
            // エラーを処理する
        }
}