Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

ユーザーの認証 - Java SDK

項目一覧

  • ログイン
  • 匿名ユーザー
  • メール/パスワード ユーザー
  • API キー ユーザー
  • カスタムJSON web tokenユーザー
  • カスタム関数ユーザー
  • Facebook ユーザー
  • Google ユーザー
  • Apple ユーザー
  • オフライン ログイン
  • ユーザー アクセス トークンを取得する
  • ユーザーのログアウト

Realm は、有効な認証プロバイダーを使用してユーザーを認証するための API を提供します。 Credentialsオブジェクトをインスタンス化し、それを メソッドまたはapp.login() app.loginAsync()メソッドのいずれかに渡して、ユーザー ログインを認証し、User オブジェクトを作成します。各認証プロバイダは、その認証プロバイダを使用してCredentialsオブジェクトをインスタンス化するために使用される静的ヘルパー メソッドに対応します。

app.login()app.loginAsync()ユーザーは、アプリケーションの クラスのインスタンスのio.realm.mongodb.App メソッドまたは メソッドのいずれかを使用して認証できます。app.login()メソッドは、提供された認証情報によってユーザーの認証が成功または失敗するまで、呼び出しスレッドでのコード実行をブロックしますが、 app.loginAsync()メソッドでは実行が保証されているコールバック関数を使用して成功または失敗を処理し、実行を継続できます。 app.loginAsync()を呼び出した同じスレッド。

成功した場合、 app.login()メソッドはUserオブジェクトを返します。 失敗が発生した場合、 app.login()メソッドはObjectServerError型の例外をスローします。

成功または失敗を処理するには、 app.loginAsync()メソッドにコールバックを渡します。 このコールバックは、 App.Result型の単一のパラメーターを受け入れます。 コールバックに渡されるApp.ResultオブジェクトのisSuccess()メソッドは、操作が成功したかどうかを示すブール値を返します。 障害が発生した場合、 getError()メソッドを使用して、障害の原因となったエラーを表示できます。

匿名認証プロバイダーを使用すると、ユーザーは永続的な個人情報を保存しない短期間のアカウントでアプリケーションにログインできます。 匿名認証でログインするには、 Credentials.anonymous()を呼び出して匿名認証情報を作成し、生成された認証情報をapp.login()またはapp.loginAsync()に渡します。

String appID = YOUR_APP_ID; // replace this with your App ID
App app = new App(new AppConfiguration.Builder(appID)
.build());
Credentials anonymousCredentials = Credentials.anonymous();
AtomicReference<User> user = new AtomicReference<User>();
app.loginAsync(anonymousCredentials, it -> {
if (it.isSuccess()) {
Log.v("AUTH", "Successfully authenticated anonymously.");
user.set(app.currentUser());
} else {
Log.e("AUTH", it.getError().toString());
}
});
val appID = YOUR_APP_ID // replace this with your App ID
val app: App = App(
AppConfiguration.Builder(appID)
.build()
)
val anonymousCredentials: Credentials = Credentials.anonymous()
var user: User?
app.loginAsync(anonymousCredentials) {
if (it.isSuccess) {
Log.v("AUTH", "Successfully authenticated anonymously.")
user = app.currentUser()
} else {
Log.e("AUTH", it.error.toString())
}
}

メール/パスワード認証プロバイダーは、ユーザーがメール ユーザー名とパスワードを使用してアプリケーションにログインすることを可能にします。 メール/パスワード認証でログインするには、ユーザーのメールとパスワードを指定してCredentials.emailPassword()を呼び出して、メール/パスワードの認証情報を作成します。 次に、生成された認証情報をapp.login()またはapp.loginAsync()に渡します。

String appID = YOUR_APP_ID; // replace this with your App ID
App app = new App(new AppConfiguration.Builder(appID)
.build());
Credentials emailPasswordCredentials = Credentials.emailPassword("<email>", "<password>");
AtomicReference<User> user = new AtomicReference<User>();
app.loginAsync(emailPasswordCredentials, it -> {
if (it.isSuccess()) {
Log.v("AUTH", "Successfully authenticated using an email and password.");
user.set(app.currentUser());
} else {
Log.e("AUTH", it.getError().toString());
}
});
val appID = YOUR_APP_ID // replace this with your App ID
val app: App = App(
AppConfiguration.Builder(appID)
.build()
)
val emailPasswordCredentials: Credentials = Credentials.emailPassword(
"<email>",
"<password>"
)
var user: User? = null
app.loginAsync(emailPasswordCredentials) {
if (it.isSuccess) {
Log.v("AUTH", "Successfully authenticated using an email and password.")
user = app.currentUser()
} else {
Log.e("AUTH", it.error.toString())
}
}

API キー認証プロバイダは、クライアント SDK で自動的に生成された API キーを使用してアプリケーションにログインできるようにします。 API キー認証でログインするには、API キーを使用してCredentials.apiKey()を呼び出して API キー認証情報を作成します。 次に、生成された認証情報をapp.login()またはapp.loginAsync()に渡します。

String appID = YOUR_APP_ID; // replace this with your App ID
App app = new App(new AppConfiguration.Builder(appID)
.build());
Credentials apiKeyCredentials = Credentials.apiKey("<key>");
AtomicReference<User> user = new AtomicReference<User>();
app.loginAsync(apiKeyCredentials, it -> {
if (it.isSuccess()) {
Log.v("AUTH", "Successfully authenticated using an API Key.");
user.set(app.currentUser());
} else {
Log.e("AUTH", it.getError().toString());
}
});
val appID = YOUR_APP_ID // replace this with your App ID
val app: App = App(
AppConfiguration.Builder(appID)
.build()
)
val apiKeyCredentials: Credentials = Credentials.apiKey("<key>")
var user: User? = null
app.loginAsync(apiKeyCredentials) {
if (it.isSuccess) {
Log.v("AUTH", "Successfully authenticated using an API Key.")
user = app.currentUser()
} else {
Log.e("AUTH", "Error logging in: ${it.error.toString()}")
}
}

カスタムJSON web token認証プロバイダーを使用すると、ユーザーは カスタムJSON web token web token を使用してアプリケーションにログインできます。 カスタムJSON web token認証を使用してログインするには、カスタム JSON web トークン で Credentials.jwt() を呼び出してカスタムJSON web tokenの認証情報を作成しJSON web token 。 次に、生成された認証情報をapp.login()またはapp.loginAsync()に渡します。

String appID = YOUR_APP_ID; // replace this with your App ID
App app = new App(new AppConfiguration.Builder(appID)
.build());
// fetch JWT from custom provider
Credentials customJWTCredentials = Credentials.jwt("<token>");
AtomicReference<User> user = new AtomicReference<User>();
app.loginAsync(customJWTCredentials, it -> {
if (it.isSuccess()) {
Log.v("AUTH", "Successfully authenticated using a custom JWT.");
user.set(app.currentUser());
} else {
Log.e("AUTH", it.getError().toString());
}
});
val appID = YOUR_APP_ID // replace this with your App ID
val app: App = App(
AppConfiguration.Builder(appID)
.build()
)
// fetch JWT from custom provider
val customJWTCredentials: Credentials = Credentials.jwt("<token>")
var user: User? = null
app.loginAsync(customJWTCredentials) {
if (it.isSuccess) {
Log.v("AUTH", "Successfully authenticated using a custom JWT.")
user = app.currentUser()
} else {
Log.e("AUTH", "Error logging in: ${it.error.toString()}")
}
}

カスタム関数認証プロバイダーを使用すると、ユーザーはアプリで定義されたRealm 関数を使用してアプリケーションにログインできます。 カスタム関数認証を使用してログインするには、 Credentials.customFunction()を呼び出して認証情報を作成します。 customFunction()メソッドは、Realm 認証関数によって使用されるプロパティと値を含むドキュメントが必要です。 たとえば、バックエンド関数では、入力パラメータにusernameという名前のフィールドが含まれていることが想定されています。次のようになります。

exports = async function(loginPayload) {
const { username } = loginPayload;
...
}

Credentials.customFunction()に渡すドキュメントは次のようになります。

Document("username", "bob")

次に、生成された認証情報をapp.login()またはapp.loginAsync()に渡します。

String appID = YOUR_APP_ID; // replace this with your App ID
App app = new App(new AppConfiguration.Builder(appID).build());
Credentials customFunctionCredentials =
Credentials.customFunction(new org.bson.Document("username", "bob"));
AtomicReference<User> user = new AtomicReference<User>();
app.loginAsync(customFunctionCredentials, it -> {
if (it.isSuccess()) {
Log.v("AUTH", "Successfully authenticated using a custom function.");
user.set(app.currentUser());
} else {
Log.e("AUTH", it.getError().toString());
}
});
val appID = YOUR_APP_ID // replace this with your App ID
val app: App = App(
AppConfiguration.Builder(appID)
.build()
)
val customFunctionCredentials:
Credentials = Credentials.customFunction(org.bson.Document("username", "bob"))
var user: User? = null
app.loginAsync(customFunctionCredentials) {
if (it.isSuccess) {
Log.v("AUTH", "Successfully authenticated using a custom function.")
user = app.currentUser()
} else {
Log.e("AUTH", "Error logging in: ${it.error.toString()}")
}
}

Facebook認証プロバイダーは、既存の Facebook アカウントを使用して Facebook アプリを通じてユーザーを認証することを可能にします。

重要

Facebook 認証プロバイダーを有効にする

ユーザーを既存の Facebook アカウントでログインするには、アプリケーションのFacebook 認証プロバイダを設定して有効にする必要があります。

重要

Facebook プロファイル画像 URL を保存しないでください

Facebook のプロファイル画像 URL には、画像の使用許可を付与するためのユーザーのアクセス トークンが含まれます。 セキュリティを確保するために、ユーザーのアクセストークンを含む URL を保存しないでください。 代わりに、画像を取得する必要がある場合は、ユーザーのメタデータ フィールドから URL に直接アクセスします。

Android クイック スタート用の公式「Facebook ログイン」に 従う アプリケーションの認証フローを設定します。ログイン完了ハンドラーで、Facebook LoginResult からログインユーザーのアクセス トークンを取得します 。アクセス トークンを使用して Realm Facebook の認証情報を作成し、ユーザーを Realm アプリにログインさせます。

FacebookSdk.setApplicationId(YOUR_FACEBOOK_SDK_APP_ID);
FacebookSdk.sdkInitialize(activity);
CallbackManager callbackManager = CallbackManager.Factory.create();
LoginManager.getInstance().registerCallback(callbackManager,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
// Signed in successfully, forward credentials to MongoDB Realm.
AccessToken accessToken = loginResult.getAccessToken();
Credentials facebookCredentials = Credentials.facebook(accessToken.getToken());
app.loginAsync(facebookCredentials, it -> {
if (it.isSuccess()) {
Log.v("AUTH", "Successfully logged in to MongoDB Realm using Facebook OAuth.");
} else {
Log.e("AUTH", "Failed to log in to MongoDB Realm", it.getError());
}
});
}
@Override
public void onCancel() {
Log.v("AUTH", "Facebook authentication cancelled.");
}
@Override
public void onError(FacebookException exception) {
Log.e("AUTH", "Failed to authenticate using Facebook: " + exception.getMessage());
}
}
);
LoginManager.getInstance().logIn(activity, null);
FacebookSdk.setApplicationId(YOUR_FACEBOOK_SDK_APP_ID)
FacebookSdk.sdkInitialize(activity)
val callbackManager = CallbackManager.Factory.create()
LoginManager.getInstance().registerCallback(
callbackManager,
object : FacebookCallback<LoginResult> {
override fun onSuccess(loginResult: LoginResult) {
// Signed in successfully, forward credentials to MongoDB Realm.
val accessToken = loginResult.accessToken
val facebookCredentials: Credentials =
Credentials.facebook(accessToken.token)
app.loginAsync(facebookCredentials) {
if (it.isSuccess) {
Log.v(
"AUTH",
"Successfully logged in to MongoDB Realm using Facebook OAuth."
)
} else {
Log.e("AUTH", "Failed to log in to MongoDB Realm", it.error)
}
}
}
override fun onCancel() {
Log.v("AUTH", "Cancelled Facebook login")
}
override fun onError(exception: FacebookException) {
Log.e("AUTH", "Failed to authenticate with Facebook: ${exception.message}")
}
})

重要

ユーザーを既存の Google アカウントでログインするには、アプリケーションのGoogle 認証プロバイダを設定して有効にする必要があります。

Google ユーザー認証用にアプリケーションを設定するには、次の手順に従います。

  1. Google Cloud Platform コンソール で 、OAuth2 を作成します。0「Web アプリケーション」タイプのクライアント ID。

  2. そのクライアント ID と関連付けられたクライアントシークレットを使用するようにバックエンド アプリを構成します。

  3. バックエンドで OpenID Connect を有効にします。

Android 用 の Google の公式ログインを使用する Android アプリケーションで Google ユーザーを認証するには、次の手順に従います。

注意

以下のコード例

これらの手順の実装については、以下のコード ブロックを参照してください。

  1. Android 用の Google ログイン 依存関係をアプリケーション レベルbuild.gradledependenciesブロックに追加します。

    com.google.android.gms:play-services-auth:19.2.0
  2. GoogleSignInOptions の作成 次のビルダ オプションを持つ。

  3. GoogleSignInOptionsを使用して、GoogleSignInClient GoogleSignIn.getClient() を持つ を作成します

  4. GoogleSignInClientを使用して、Google ログインをトリガーできるIntentを作成します。

  5. registerForActivityResult() の使用 コールバックを構成する。コールバックでは、 GoogleSignIn.getSignedInAccountFromIntent() を使用する必要があります。Google ログイン の結果にアクセスするには: Task<GoogleSignInAccount>

  6. start () を使用する アクティビティ 結果ランシャーのメソッド Google ログインを開始するために前の手順で返された 。Google ログインIntentlaunch()メソッドを渡します。

  7. Google ログイン エラーを処理するには、 isSuccessful()を使用します。

  8. タスクの結果( GoogleSignInAccount )とgetResult()

  9. getIdToken()を使用してGoogleSignInAccountの ID トークンにアクセスします。

  10. Credentials.google()を使用して Realm Credentialsオブジェクトを作成します。 最初のパラメーターとして ID トークンを渡し、2 番目のパラメーターとしてGoogleAuthType.ID_TOkenを渡します。

  11. app.loginAsync () メソッドまたはapp.login()メソッドを使用して、トークンを使用して Atlas App Services バックエンドで認証します。

次のコードは、 loginWithGoogle()へのメソッド呼び出しから始めて、このフローを実装します。

private void signInWithGoogle() {
GoogleSignInOptions gso = new GoogleSignInOptions
.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken("YOUR WEB APPLICATION CLIENT ID FOR GOOGLE AUTH")
.build();
GoogleSignInClient googleSignInClient = GoogleSignIn.getClient(this, gso);
Intent signInIntent = googleSignInClient.getSignInIntent();
ActivityResultLauncher<Intent> resultLauncher =
registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
Task<GoogleSignInAccount> task =
GoogleSignIn.getSignedInAccountFromIntent(result.getData());
handleSignInResult(task);
}
});
resultLauncher.launch(signInIntent);
}
private void handleSignInResult(Task<GoogleSignInAccount> completedTask) {
try {
if (completedTask.isSuccessful()) {
GoogleSignInAccount account = completedTask.getResult(ApiException.class);
String token = account.getIdToken();
Credentials googleCredentials =
Credentials.google(token, GoogleAuthType.ID_TOKEN);
app.loginAsync(googleCredentials, it -> {
if (it.isSuccess()) {
Log.v("AUTH",
"Successfully logged in to MongoDB Realm using Google OAuth.");
} else {
Log.e("AUTH",
"Failed to log in to MongoDB Realm: ", it.getError());
}
});
} else {
Log.e("AUTH", "Google Auth failed: "
+ completedTask.getException().toString());
}
} catch (ApiException e) {
Log.w("AUTH", "Failed to log in with Google OAuth: " + e.getMessage());
}
}
fun loginWithGoogle() {
val gso = GoogleSignInOptions
.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken("YOUR WEB APPLICATION CLIENT ID FOR GOOGLE AUTH")
.build()
val googleSignInClient = GoogleSignIn.getClient(this, gso)
val signInIntent: Intent = googleSignInClient.signInIntent
val resultLauncher: ActivityResultLauncher<Intent> =
registerForActivityResult(ActivityResultContracts.StartActivityForResult())
{ result ->
val task: Task<GoogleSignInAccount> =
GoogleSignIn.getSignedInAccountFromIntent(result.data)
handleSignInResult(task)
}
resultLauncher.launch(signInIntent)
}
fun handleSignInResult(completedTask: Task<GoogleSignInAccount>) {
try {
if (completedTask.isSuccessful) {
val account: GoogleSignInAccount? = completedTask.getResult(ApiException::class.java)
val token: String = account?.idToken!!
val googleCredentials: Credentials =
Credentials.google(token, GoogleAuthType.ID_TOKEN)
app.loginAsync(googleCredentials) {
if (it.isSuccess) {
Log.v(
"AUTH",
"Successfully logged in to MongoDB Realm using Google OAuth."
)
} else {
Log.e("AUTH",
"Failed to log in to MongoDB Realm", it.error)
}
}
} else {
Log.e("AUTH", "Google Auth failed: ${completedTask.exception}")
}
} catch (e: ApiException) {
Log.e("AUTH", "Failed to authenticate using Google OAuth: " + e.message);
}
}

Tip

以下も参照してください。

Android 用の Google ログインについて詳しくは、公式の「 Google 統合ガイド 」を参照してください。

Sign in with Apple 認証プロバイダーを使用すると、ユーザーは Apple が提供するカスタム トークンを使用してアプリケーションにログインできます。 Sign-in with Apple 認証でログインするには、Apple が提供するトークンでCredentials.apple()を呼び出して Sign in with Apple の認証情報を作成します。 次に、生成された認証情報をapp.login()またはapp.loginAsync()に渡します。

String appID = YOUR_APP_ID; // replace this with your App ID
App app = new App(new AppConfiguration.Builder(appID)
.build());
// fetch apple token using Apple SDK
Credentials appleCredentials = Credentials.apple("<token>");
AtomicReference<User> user = new AtomicReference<User>();
app.loginAsync(appleCredentials, it -> {
if (it.isSuccess()) {
Log.v("AUTH", "Successfully authenticated using Sign-in with Apple.");
user.set(app.currentUser());
} else {
Log.e("AUTH", it.getError().toString());
}
});
val appID = YOUR_APP_ID // replace this with your App ID
val app: App = App(
AppConfiguration.Builder(appID)
.build()
)
// fetch IDToken using Apple SDK
val appleCredentials: Credentials = Credentials.apple("<token>")
var user: User? = null
app.loginAsync(appleCredentials) {
if (it.isSuccess) {
Log.v("AUTH", "Successfully authenticated using Sign-in with Apple.")
user = app.currentUser()
} else {
Log.e("AUTH", "Error logging in: ${it.error.toString()}")
}
}

Tip

Login failedというエラーが発生した場合は、 のtoken contains an invalid number of segments UTF-8string でエンコードされたJSON web token バージョンを渡していることを確認してください。

App Services はアクセス トークンとリフレッシュ トークンを使用してセッションを管理します。 クライアント SDK は、トークンを管理するためのロジックを提供し、そのトークンにリクエストを提供します。

SDK はこれらのトークンを 共有設定 に保存します。 。

Tip

以下も参照してください。

Realm アプリケーションはユーザーを認証する際、ユーザーの認証情報をキャッシュします。 既存のユーザー認証情報を確認して、ログイン フローをバイパスし、キャッシュされたユーザーにアクセスできます。 これを使用して、Realm をオフラインで開きます。

注意

最初のログインにはネットワーク接続が必要です

ユーザーがアプリにサインアップしたり、クライアントに既存のアカウントを使用して初めてログインする場合、クライアントにはネットワーク接続が必要です。 キャッシュされたユーザー認証情報を確認すると、ユーザーが以前にオンライン時にログインしたことがある場合にのみ、オフラインで Realm を開くことができます。

// Log the user into the backend app.
// The first time you login, the user must have a network connection.
String appID = YOUR_APP_ID; // replace this with your App ID
App app = new App(new AppConfiguration.Builder(appID)
.build());
// Check for an existing user.
// If the user is offline but credentials are
// cached, this returns the existing user.
AtomicReference<User> user = new AtomicReference<User>();
user.set(app.currentUser());
if (user.get() == null) {
// If the device has no cached user
// credentials, log them in.
Credentials anonymousCredentials = Credentials.anonymous();
app.loginAsync(anonymousCredentials, it -> {
if (it.isSuccess()) {
Log.v("AUTH", "Successfully authenticated anonymously.");
user.set(app.currentUser());
} else {
Log.e("AUTH", it.getError().toString());
}
});
}
// Log the user into the backend app.
// The first time you login, the user must have a network connection.
val appID = YOUR_APP_ID // replace this with your App ID
val app = App(
AppConfiguration.Builder(appID)
.build()
)
// Check for an existing user.
// If the user is offline but credentials are
// cached, this returns the existing user.
val user =
AtomicReference<User?>()
user.set(app.currentUser())
if (user.get() == null) {
// If the device has no cached user
// credentials, log them in.
val anonymousCredentials =
Credentials.anonymous()
app.loginAsync(
anonymousCredentials
) { it: App.Result<User?> ->
if (it.isSuccess) {
Log.v("AUTH", "Successfully authenticated anonymously.")
user.set(app.currentUser())
} else {
Log.e("AUTH", it.error.toString())
}
}
}

ユーザーがログインすると、Atlas App Services はユーザー用のアクセス トークンを作成し、アプリへのアクセスを許可します。 Realm SDK はアクセス トークンを自動的に管理し、有効期限が切れると更新し、リクエストごとに現在のユーザーの有効なアクセス トークンを含めます。 Realm はリフレッシュ トークンを自動的に更新しません。 リフレッシュ トークンの有効期限が切れると、ユーザーは再度ログインする必要があります。

SDK 外でリクエストを送信する場合は、リクエストごとにユーザーのアクセス トークンを含め、有効期限が切れたときにトークンを手動で更新する必要があります。

次の例のように、 Realm.Userオブジェクトから SDK 内のログイン ユーザーのアクセス トークンにアクセスして更新できます。

// Gets a valid user access token to authenticate requests
public String getValidAccessToken(User user) {
// An already logged in user's access token might be stale. To
// guarantee that the token is valid, refresh it if necessary.
user.refreshCustomData();
return user.getAccessToken();
}
// Gets a valid user access token to authenticate requests
fun getValidAccessToken(user: User?): String {
// An already logged in user's access token might be stale. To
// guarantee that the token is valid, refresh it if necessary.
user!!.refreshCustomData()
return user.accessToken
}

ログインに使用された認証プロバイダに関係なく、 メソッドまたはuser.logOut() user.logOutAsync()メソッドを使用して、任意のユーザーをログアウトできます。どちらの方法も次のとおりです。

  • デバイスからローカルに保存されたユーザー認証情報を削除する

  • ユーザーの邦土との間の同期を直ちに停止する

ログアウトすると同期が停止するため、すべてのローカル Realm の更新がサーバーにアップロードされた後にのみログアウトする必要があります。

user.get().logOutAsync( result -> {
if (result.isSuccess()) {
Log.v("AUTH", "Successfully logged out.");
} else {
Log.e("AUTH", result.getError().toString());
}
});
user?.logOutAsync {
if (it.isSuccess) {
Log.v("AUTH", "Successfully logged out.")
} else {
Log.e("AUTH", it.error.toString())
}
}

戻る

ユーザーの作成と削除