Auth0.Androidでトークンを保存および更新する

offline_accessスコープを含んだまま認証を行う場合、新しいユーザートークンの要求に使用するリフレッシュトークンが返され、ユーザーに再認証を強制する必要はありません。

資格情報マネージャー

Auth0.Androidには、資格情報の保存と更新プロセスを合理化するためのユーティリティクラスが用意されています。accessTokenまたはidTokenプロパティには、[Credentials(資格情報)]インスタンスからアクセスすることができます。これは、ユーザー資格情報を管理する上で推奨される方法です。

Credential Managers(資格情報マネージャー)は、Auth0.Android SDKの一部として含まれています。これがまだ、ユーザーの依存関係の一部でない場合は、Auth0.Androidの指示に従ってください。

資格情報の管理に使用できるクラスは2つあります。

  • CredentialsManagerはプレーンテキスト形式でデータを保存します。

  • SecureCredentialsManagerはデータを保存する前に暗号化し、Android KeyStoreと共にRSAとAESアルゴリズムの組み合わせを使用します。

CredentialsManagerクラスの使用

CredentialsManagerをセットアップする

AuthenticationAPIClientおよびStorage実装を渡して、新しいインスタンスを作成します。

val auth0 = Auth0(this)
val apiClient = AuthenticationAPIClient(auth0)
val manager = CredentialsManager(apiClient, SharedPreferencesStorage(this))

Was this helpful?

/

認証の現在の状態

保存された資格情報は、期限切れになっていないか更新可能である場合は有効であるとみなされます。ユーザーが既にログインしているか確認します。

val loggedIn = manager.hasValidCredentials()

Was this helpful?

/

ユーザーをアプリケーションからログアウトするには、保存された資格情報を削除し、ユーザーをログイン画面に誘導します。

manager.clearCredentials()

Was this helpful?

/

資格情報の取得

資格情報はAuth0 Serversに対して更新される必要があるため、この方法は非同期です。資格情報を受信したいコールバック実装を渡します。正常に実行された後、この方法で返される資格情報は常に有効です。

manager.getCredentials(object: Callback<Credentials, CredentialsManagerException>() {
    override fun onSuccess(credentials: Credentials) {
        // Use credentials
    }

    override fun onFailure(error: CredentialsManagerException) {
        // No credentials were previously saved or they couldn't be refreshed
    }
})

Was this helpful?

/

accessTokenの有効期限が切れた場合、マネージャーはrefreshTokenを自動的に使用し、資格情報を更新します。新しい資格情報は将来のアクセスのために保存されます。

新しい資格情報を保存する

マネージャーで認証中に取得した資格情報を保存することができます。

manager.saveCredentials(credentials)

Was this helpful?

/

SecureCredentialsManagerクラスの使用

SecureCredentialsManagerをセットアップする

有効なAndroid ContextAuthenticationAPIClient、およびStorage実装を渡して、新しいインスタンスを作成します。

val auth0 = Auth0(this)
val apiClient = AuthenticationAPIClient(auth0)
val manager = SecureCredentialsManager(this, apiClient, SharedPreferencesStorage(this))

Was this helpful?

/

資格情報を取得、保存、有無を確認、および消去する方法は、上のセクションで説明したのと同じです。

ユーザーを事前認証する

このクラスは、デバイスで構成されたロック画面を使って、さらなる認証のためのオプション機能を備えています。

以下のメソッドを呼び出して認証を有効にします。有効なActivityコンテント、要求コード、および2つの任意の文字列を渡し、ロック画面のタイトルと説明に使用します。

また、アクティビティの結果からの要求コードが一致するように、要求コード定数を定義します。

companion object {
  const val RC_UNLOCK_AUTHENTICATION = 123
}

// Called from an Activity
val available = manager.requireAuthentication(this, RC_UNLOCK_AUTHENTICATION, getString(R.string.unlock_authentication_title), getString(R.string.unlock_authentication_description))

Was this helpful?

/

機能が有効な場合、マネージャーは構成されたロック画面を使ってユーザーに認証を行うよう促します。この呼び出しの結果は、最初のパラメーターとして以前に渡されたアクティビティのonActivityResultメソッドで取得されます。機能が有効でなかった場合、ロック画面の認証はスキップされます。

受け取った要求コードが構成手順で使用されたものに一致することを確認したら、受信したパラメーターをマネージャーにリダイレクトし、認証を終了します。資格情報が元のコールバックに渡ります。

override fun onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == RC_UNLOCK_AUTHENTICATION && manager.checkAuthenticationResult(requestCode, resultCode)) {
        return
    }

    super.onActivityResult(requestCode, resultCode, data)
}

Was this helpful?

/

使用状況の例外処理

Credentials(資格情報)を保存または取得中に予期しないイベントが起きた場合は、CredentialsManagerExceptionが発生します。想定できる失敗したシナリオには以下のようなものがあります。

  • 保存される資格情報が無効である(access_tokenid_token、またはexpires_atといった一部のフィールドが定義されていないなど)。

  • 保存された資格情報の有効期限が切れているが、自動更新するために利用できるリフレッシュトークンがない。

  • デバイスのロック画面のセキュリティ設定が変更されている(セキュリティPINコードが変更されているなど)。hasCredentialsがTrueを返しても、暗号化キーは無効とみなされます。saveCredentialsが再び呼び出されても、前の既存のコンテンツを復号化することはできません。これは、前に使用したキーが新しいものと同じではないためです。

  • デバイスがSecureCredentialsManagerクラスで必要な一部の暗号化アルゴリズに対応していない。これは壊滅的なイベントとしてみなされ、ユーザーが実装を使用するのを阻止する唯一の例外です。このシナリオは、OEMがデバイスのAndroid ROMを変更し、各Androidディストリビューションに正式に含まれている一部のアルゴリズムを削除するときに発生します。しかしながら、isDeviceIncompatibleメソッドを呼び出して、これが例外インスタンス自体で本当かどうかを確認することができます。そうすることで、ユーザーは資格情報を保存するためのフォールバックの実装(通常のCredentialsManagerクラスを使用するなど)を決定することができます。