offline_access スコープを含めて認証を行うと、認証情報の再入力を求めることなく新しいトークンをリクエストするために使用できる リフレッシュトークン が返されます。
Auth0.swift には、認証情報の保存と更新を簡単に行うためのユーティリティクラスが用意されています。Credentials インスタンスから accessToken または idToken プロパティにアクセスできます。ユーザーの認証情報を管理するには、この方法を推奨します。
まず、Auth0 モジュールをインポートします。
import Auth0
次に、Universal Login ページを表示します。
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 を返します。
このセクションは、Credentials Manager を使用しない開発者向けです。システム Keychain を薄くラップしたユーティリティである SimpleKeychain が用意されており、これを使用してトークンを安全に保存できます。
まず、SimpleKeychain モジュールをインポートします。
import SimpleKeychain
次に、インスタンスを作成し、必要なトークンを保存します。この例では、認証に成功した後で access_token と refresh_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) :
// エラーを処理する
}
}
See all 26 lines