ユーザーの認証 - .NET SDK
項目一覧
SDK は、有効な認証プロバイダーを使用してユーザーを認証するための API を提供します。 認証情報オブジェクトをインスタンス化し、それをLogInAsync()メソッドに渡して、ユーザーインスタンスを認証して取得します。 Credentials
クラスは、各認証プロバイダに対応するファクトリー メソッドを公開します。
ユーザーを認証する前に、以下があることを確認してください。
1 つ以上の認証プロバイダを有効にしました
ログイン
匿名ユーザー
App Services UI で匿名認証を有効にした場合、ユーザーは識別情報を提供せずにすぐにアプリにログインできます。 次のコードは、これを行う方法を示しています。
var user = await app.LogInAsync(Credentials.Anonymous());
メール/パスワード ユーザー
メール/パスワード認証を有効にしている場合は、次のコードを使用してログインできます。
var user = await app.LogInAsync( Credentials.EmailPassword("caleb@mongodb.com", "MySekritPwd"));
API キー ユーザー
API キー認証を有効にしている場合は、次のコードを使用してログインできます。
var user = await app.LogInAsync(Credentials.ApiKey(apiKey));
カスタムJSON web tokenユーザー
カスタムJSON web token認証プロバイダを有効にした場合は、次のコードを使用してログインできます。
var user = await app.LogInAsync(Credentials.JWT(jwt_token));
カスタム関数ユーザー
カスタム関数認証プロバイダを有効にした場合は、次のコードを使用してログインできます。
var functionParameters = new { username = "caleb", password = "MySekritPwd", IQ = 42, hasPets = true }; var user = await app.LogInAsync(Credentials.Function(functionParameters));
Facebook ユーザー
Facebook認証プロバイダーは、既存の Facebook アカウントを使用して Facebook アプリを通じてユーザーを認証することを可能にします。
重要
Facebook 認証プロバイダーを有効にする
ユーザーを既存の Facebook アカウントでログインするには、アプリケーションのFacebook 認証プロバイダを設定して有効にする必要があります。
重要
Facebook プロファイル画像 URL を保存しないでください
Facebook のプロファイル画像 URL には、画像の使用許可を付与するためのユーザーのアクセス トークンが含まれます。 セキュリティを確保するために、ユーザーのアクセストークンを含む URL を保存しないでください。 代わりに、画像を取得する必要がある場合は、ユーザーのメタデータ フィールドから URL に直接アクセスします。
var user = await app.LogInAsync(Credentials.Facebook(facebookToken));
Google ユーザー
Google 認証を有効にしている場合は、次のコードを使用してログインできます。
var user = await app.LogInAsync(Credentials.Google(googleAuthCode, GoogleCredentialType.AuthCode));
Apple ユーザー
Sign in with Apple 認証 を有効にしている場合は、次のコードを使用してログインできます。
var user = await app.LogInAsync(Credentials.Apple(appleToken));
Tip
Login failed
というエラーが発生した場合は、 のtoken contains
an invalid number of segments
UTF-8string でエンコードされたJSON web token バージョンを渡していることを確認してください。
オフライン ログイン
Realm アプリケーションはユーザーを認証する際、ユーザーの認証情報をキャッシュします。 既存のユーザー認証情報を確認して、ログイン フローをバイパスし、キャッシュされたユーザーにアクセスできます。 これを使用して、Realm をオフラインで開きます。
注意
最初のログインにはネットワーク接続が必要です
ユーザーがアプリにサインアップしたり、クライアントに既存のアカウントを使用して初めてログインする場合、クライアントにはネットワーク接続が必要です。 キャッシュされたユーザー認証情報を確認すると、ユーザーが以前にオンライン時にログインしたことがある場合にのみ、オフラインで Realm を開くことができます。
次の例では、キャッシュされた ユーザー オブジェクトがあるかどうかを確認しています。 停止しない場合、ユーザーはログインします。 それ以外の場合は、キャッシュされた認証情報が使用されます。
if (app.CurrentUser == null) { // App must be online for user to authenticate user = await app.LogInAsync( Credentials.EmailPassword("caleb@mongodb.com", "MySekritPwd")); config = new PartitionSyncConfiguration("_part", user); realm = await Realm.GetInstanceAsync(config); } else { // This works whether online or offline user = app.CurrentUser; config = new PartitionSyncConfiguration("_part", user); realm = Realm.GetInstance(config); }
ユーザーのログアウト
ログインしたら、 LogOutAsync()
メソッドを呼び出してログアウトできます。
await user.LogOutAsync();
警告
ユーザーがログアウトすると、ユーザーが開いた同期された Realm でデータの読み取りも書き込みもできなくなります。 その結果、開始ユーザーがログアウトする前にまだ完了していない操作は正常に完了できず、エラーが発生する可能性が高くなります。 このように失敗した書込み操作のデータは失われます。
現在のユーザーを取得
認証済みユーザーを作成したら、 App.currentUserプロパティを使用して User オブジェクトを検索できます。 CurrentUser
オブジェクトはローカル ストレージに保存されているため、初期認証後にアプリがシャットダウンした場合でも、 LoginAsync
を再度呼び出す必要はありません(ユーザーがログアウトした場合を除く)。 代わりに、 Realm.GetInstance(config)を使用してください。ここで、 config
はFlexibleConfigurationオブジェクトです。 このアプローチにより起動がより迅速になり、ユーザーはオフラインで作業できるようになります。
ユーザー アクセス トークンを取得する
ユーザーがログインすると、Atlas App Services はユーザー用のアクセス トークンを作成し、アプリへのアクセスを許可します。 Realm SDK はアクセス トークンを自動的に管理し、有効期限が切れると更新し、リクエストごとに現在のユーザーの有効なアクセス トークンを含めます。 Realm はリフレッシュ トークンを自動的に更新しません。 リフレッシュ トークンの有効期限が切れると、ユーザーは再度ログインする必要があります。
SDK 外でリクエストを送信する場合は、リクエストごとにユーザーのアクセス トークンを含め、有効期限が切れたときにトークンを手動で更新する必要があります。
次の例のように、 Realm.User
オブジェクトから SDK 内のログイン ユーザーのアクセス トークンにアクセスして更新できます。
// Returns a valid user access token to authenticate requests public async Task<string> GetValidAccessToken(User user) { // An already logged in user's access token might be stale. To // guarantee that the token is valid, refresh it. await user.RefreshCustomDataAsync(); return user.AccessToken; }
リフレッシュ トークンの有効期限
リフレッシュ トークンは一定期間後に期限切れになります。 更新トークンの有効期限が切れると、アクセス トークンの更新ができなくなり、ユーザーは再度ログインする必要があります。
Realm が開いた後に更新トークンの有効期限が切れると、ユーザーが再度ログインするまでデバイスは同期できなくなります。 同期エラー ハンドラーには、同期試行時にトークンの期限切れエラーを検出し、ユーザーをログイン フローにリダイレクトするロジックを実装する必要があります。
リフレッシュ トークンの有効期限の設定の詳細については、App Services ドキュメントの「ユーザー セッションの管理」を参照してください。
認証の変更を監視
バージョン 11.6.0 の新機能。
有効なユーザー オブジェクトでUser.changed()を呼び出すと、認証変更イベントのフローを観察できます。
現在、 User.Changed()
はすべてのユーザー イベントでトリガーされているため、イベントへの応答が冪等であるようにするためにハンドラーを追加する必要があります。
app.CurrentUser.Changed += (change, _) => { Debug.WriteLine($"Auth change: {change}, {_}"); };