Docs Menu
Docs Home
/ /
Atlas App Services
/

ユーザー セッションの管理

項目一覧

  • Overview
  • ユーザー セッション アクセス トークンを取得する
  • HTTPS 経由でユーザー アクセス トークンを取得する
  • Realm SDK からのユーザー アクセス トークンの取得
  • ユーザー セッション アクセス トークンの更新
  • HTTPS 経由でユーザー アクセス トークンを更新する
  • Realm SDK からのユーザー アクセス トークンの更新
  • リフレッシュ トークンの有効期限を設定する
  • 管理 UI でリフレッシュ トークンの有効期限を設定する
  • HTTPS 経由でリフレッシュ トークンの有効期限を設定する
  • ユーザー アクセス トークンの検証とデコード
  • ユーザー セッションの終了
  • ユーザーのセッションを取り消す

App Services は、アクセス トークンとリフレッシュ トークンを使用してユーザー セッションを管理します。 アクセス トークンを使用すると、トークンを持っているすべてのユーザーは、関連付けられているセッションを最大 30 分間使用できます。 リフレッシュ トークンを使用すると、前のトークンの有効期限がすでに切れている場合でも、セッションの新しいアクセス トークンを生成できます。

Realm SDK は、App Services に接続すると、ユーザー アクセスとリフレッシュ トークンを自動的に管理します。 Data API などの API サービスに接続している場合は、セッションを自分で管理する必要がある場合があります。

ユーザーを認証し、HTTPS 経由で直接または Realm SDK によって管理されるセッションを通じてユーザー アクセス トークンを受け取ることができます。

HTTPS 経由で App Services に認証リクエストを直接送信することで、アクセス トークンを取得できます。 認証エンドポイントは、ユーザーのログイン認証情報を含む JSON 本文を持つ HTTPS POST リクエストを受け入れます。 認証情報が有効な場合、応答にはユーザーのアクセス トークンが含まれます。

1

アプリの認証エンドポイント URL は、アプリの配置モデルによって異なります。

ベース URL の作成方法を確認するには、アプリの配置モデルを選択します。

https://services.cloud.mongodb.com/api/client/v2.0/app/<App ID>

<App ID>をクライアント アプリ ID に置き換えます。 たとえば、 myapp-abcde

https://<Region>.<Cloud>.services.cloud.mongodb.com/api/client/v2.0/app/<App ID>
  • <Region>をアプリがホストされているリージョンに置き換えます。 たとえば、 us-east-1

  • <Cloud>をアプリがホストされているクラウドに置き換えます。 たとえば、 awsazuregcpなどがあります。

  • <App ID>をクライアント アプリ ID に置き換えます。 たとえば、 myapp-abcde

アプリ ロケーション エンドポイントを使用して、プログラムでベース URL を見つけることができます。 レスポンス本文には、 hostnameフィールドとしてベース URL が含まれています。

curl 'https://services.cloud.mongodb.com/api/client/v2.0/app/<App ID>/location'
{
"deployment_model": "LOCAL",
"location": "US-VA",
"hostname": "https://us-east-1.aws.services.cloud.mongodb.com",
"ws_hostname": "wss://ws.us-east-1.aws.services.cloud.mongodb.com"
}
2

ユーザーを認証するには、認証プロバイダを指定してログイン エンドポイントを呼び出します。 ログイン エンドポイントは<Base URL>/auth/providers/<ProviderType>/loginで、 <ProviderType>は次のいずれかのタイプです。

  • anon-user

  • local-userpass

  • api-key

  • custom-token

  • custom-function

ログイン エンドポイントをベース URL に追加し、選択したプロバイダー タイプのユーザーのログイン認証情報を含む JSON 本文を使用して HTTPS POST リクエストを送信します。

curl -X POST 'https://services.cloud.mongodb.com/api/client/v2.0/app/myapp-abcde/auth/providers/anon-user/login'
curl -X POST 'https://services.cloud.mongodb.com/api/client/v2.0/app/myapp-abcde/auth/providers/local-userpass/login' \
--header 'Content-Type: application/json' \
--data-raw '{
"username": "test@example.com",
"password": "Pa55w0rd"
}'
curl -X POST 'https://services.cloud.mongodb.com/api/client/v2.0/app/myapp-abcde/auth/providers/api-key/login' \
--header 'Content-Type: application/json' \
--data-raw '{
"key": "hScMWZyOKnjQMbfDPMJ1qHgtdGT2raQXdVDDvlC2SzKEBKlHKV8FK9SPCSTnODPg"
}'
curl -X POST 'https://services.cloud.mongodb.com/api/client/v2.0/app/myapp-abcde/auth/providers/custom-token/login' \
--header 'Content-Type: application/json' \
--data-raw '{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJ0ZXN0ZGV2LWJwcWVsIiwiZXhwIjoxNTE2MjM5MDIyLCJzdWIiOiIyNDYwMSIsInVzZXJfZGF0YSI6eyJuYW1lIjoiSmVhbiBWYWxqZWFuIiwiYWxpYXNlcyI6WyJNb25zaWV1ciBNYWRlbGVpbmUiLCJVbHRpbWUgRmF1Y2hlbGV2ZW50IiwiVXJiYWluIEZhYnJlIl19fQ.mVWr4yFf8nD1EhuhrJbgKfY7BEpMab38RflXzUxuaEI"
}'
curl -X POST 'https://services.cloud.mongodb.com/api/client/v2.0/app/myapp-abcde/auth/providers/custom-function/login' \
--header 'Content-Type: application/json' \
--data-raw '{
"someCustomFunctionArg": "<Login Info>"
}'

認証リクエストが成功した場合、レスポンス本文にはユーザーのaccess_tokenrefresh_tokenの値が含まれます。 access_token は、リクエストの認証に使用できる JSON JSON web token ( JSON web token )です。

{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJiYWFzX2RldmljZV9pZCI6IjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsImJhYXNfZG9tYWluX2lkIjoiNWVlYTg2NjdiY2I0YzgxMGI2NTFmYjU5IiwiZXhwIjoxNjY3OTQwNjE4LCJpYXQiOjE2Njc5Mzg4MTgsImlzcyI6IjYzNmFiYTAyMTcyOGI2YzFjMDNkYjgzZSIsInN0aXRjaF9kZXZJZCI6IjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsInN0aXRjaF9kb21haW5JZCI6IjVlZWE4NjY3YmNiNGM4MTBiNjUxZmI1OSIsInN1YiI6IjYzNmFiYTAyMTcyOGI2YzFjMDNkYjdmOSIsInR5cCI6ImFjY2VzcyJ9.pyq3nfzFUT-6r-umqGrEVIP8XHOw0WGnTZ3-EbvgbF0",
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJiYWFzX2RhdGEiOm51bGwsImJhYXNfZGV2aWNlX2lkIjoiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwiYmFhc19kb21haW5faWQiOiI1ZWVhODY2N2JjYjRjODEwYjY1MWZiNTkiLCJiYWFzX2lkIjoiNjM2YWJhMDIxNzI4YjZjMWMwM2RiODNlIiwiYmFhc19pZGVudGl0eSI6eyJpZCI6IjYzNmFiYTAyMTcyOGI2YzFjMDNkYjdmOC1ud2hzd2F6ZHljbXZycGVuZHdkZHRjZHQiLCJwcm92aWRlcl90eXBlIjoiYW5vbi11c2VyIiwicHJvdmlkZXJfaWQiOiI2MjRkZTdiYjhlYzZjOTM5NjI2ZjU0MjUifSwiZXhwIjozMjQ0NzM4ODE4LCJpYXQiOjE2Njc5Mzg4MTgsInN0aXRjaF9kYXRhIjpudWxsLCJzdGl0Y2hfZGV2SWQiOiIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCJzdGl0Y2hfZG9tYWluSWQiOiI1ZWVhODY2N2JjYjRjODEwYjY1MWZiNTkiLCJzdGl0Y2hfaWQiOiI2MzZhYmEwMjE3MjhiNmMxYzAzZGI4M2UiLCJzdGl0Y2hfaWRlbnQiOnsiaWQiOiI2MzZhYmEwMjE3MjhiNmMxYzAzZGI3Zjgtbndoc3dhemR5Y212cnBlbmR3ZGR0Y2R0IiwicHJvdmlkZXJfdHlwZSI6ImFub24tdXNlciIsInByb3ZpZGVyX2lkIjoiNjI0ZGU3YmI4ZWM2YzkzOTYyNmY1NDI1In0sInN1YiI6IjYzNmFiYTAyMTcyOGI2YzFjMDNkYjdmOSIsInR5cCI6InJlZnJlc2gifQ.h9YskmSpSLK8DMwBpPGuk7g1s4OWZDifZ1fmOJgSygw",
"user_id": "636aba021728b6c1c03db7f9"
}

Realm SDKでは、 Userオブジェクトからログイン ユーザーのアクセス トークンにアクセスできます。 SDK は SDK 操作の期限切れのアクセス トークンを自動的に更新します。 メソッドを呼び出すことで手動で更新できます。

詳しくは、Realm SDK のドキュメントを参照してください。

  • Realm C++ SDK

  • Realm Flutter SDK

  • Realm Java SDK

  • Realm Kotlin SDK

  • Realm .NET SDK

  • Realm Node.js SDK

  • Realm React Native SDK

  • Realm Swift SDK

  • Web SDK

アクセス トークンは付与後 30 分で期限切れになります。 アクセス トークンの有効期限が切れても、リクエストの送信を続行するには新しいアクセス トークンを取得する必要があります。

ユーザーを再度ログインさせることで新しいアクセス トークンを取得できますが、そのためにはユーザーの認証情報を再入力する必要があります。 代わりに、ユーザーのセッションに関連付けられたリフレッシュ トークンを使用して、さらに 30 分間有効な新しいアクセス トークンを取得できます。

ログインに成功すると、アクセス トークンと同じ応答でリフレッシュ トークンが取得されます。

セッション更新エンドポイントは、 Authorizationヘッダーに更新トークンを含むPOSTリクエストを受け入れます。 エンドポイント URL は、アプリの配置モデルによって異なります。

curl -X POST 'https://services.cloud.mongodb.com/api/client/v2.0/auth/session' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <RefreshToken>'
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJiYWFzX2RldmljZV9pZCI6IjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsImJhYXNfZG9tYWluX2lkIjoiNWVlYTg2NjdiY2I0YzgxMGI2NTFmYjU5IiwiZXhwIjoxNjY3OTQzOTc5LCJpYXQiOjE2Njc5NDIxNzksImlzcyI6IjYzNmFjNzAyMDE5ZDJkYmY0NzUxMDRjMiIsInN0aXRjaF9kZXZJZCI6IjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsInN0aXRjaF9kb21haW5JZCI6IjVlZWE4NjY3YmNiNGM4MTBiNjUxZmI1OSIsInN1YiI6IjYzNmFjNzAyMDE5ZDJkYmY0NzUxMDQ5MyIsInR5cCI6ImFjY2VzcyJ9.pF3DR-096Ujt9-0KOWJTU25ZuryvwMfeCI7TiHJERNg"
}
  • <Region>をアプリがホストされているリージョンに置き換えます。 たとえば、 us-east-1

  • <Cloud>をアプリがホストされているクラウドに置き換えます。 たとえば、 awsazuregcpなどがあります。

curl -X POST 'https://<Region>.<Cloud>.services.cloud.mongodb.com/api/client/v2.0/auth/session' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <RefreshToken>'
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJiYWFzX2RldmljZV9pZCI6IjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsImJhYXNfZG9tYWluX2lkIjoiNWVlYTg2NjdiY2I0YzgxMGI2NTFmYjU5IiwiZXhwIjoxNjY3OTQzOTc5LCJpYXQiOjE2Njc5NDIxNzksImlzcyI6IjYzNmFjNzAyMDE5ZDJkYmY0NzUxMDRjMiIsInN0aXRjaF9kZXZJZCI6IjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsInN0aXRjaF9kb21haW5JZCI6IjVlZWE4NjY3YmNiNGM4MTBiNjUxZmI1OSIsInN1YiI6IjYzNmFjNzAyMDE5ZDJkYmY0NzUxMDQ5MyIsInR5cCI6ImFjY2VzcyJ9.pF3DR-096Ujt9-0KOWJTU25ZuryvwMfeCI7TiHJERNg"
}

Realm SDK は、リクエスト時にトークンの有効期限が切れている場合、ログインしたユーザーのアクセス トークンを自動的に更新します。

SDK では、 Userオブジェクトで メソッドを呼び出して、ユーザーのアクセス トークンを手動で更新することもできます。

詳しくは、Realm SDK のドキュメントを参照してください。

デフォルトでは、リフレッシュ トークンは発行後 60 日で期限切れになります。 アプリのリフレッシュ トークンの有効期限は、30 分から 5 年までの範囲で設定できます。

匿名ユーザー更新トークンは有効期限が長く、実質的に期限切れになりません。 代わりに、匿名ユーザー アカウントは作成後 90 日後に自動的に削除されます。

管理 UI または 管理 API から、アプリ内のすべてのセッションのリフレッシュ トークンの有効期限を構成できます。

次の方法で、管理 UI からアプリ内のすべてのセッションのリフレッシュ トークンの有効期限を設定できます。

  1. 左側のナビゲーション メニューで [ App Usersをクリックします。

  2. User Settings タブを選択します。

  3. Refresh Token Expirationオプションを見つけ、 Editボタンをクリックします。

  4. テキスト入力に時間値を入力し、適切な時間単位(例: ドロップダウン メニューから「分」または「日数」)を選択します。

  5. [Save] をクリックします。

管理 API からアプリ内のすべてのセッションのリフレッシュ トークンの有効期限を設定するには、リクエスト本文のexpiration_time_secondsフィールドを希望の有効期限に設定して、アプリの 「ユーザー リフレッシュ トークンの有効期限を設定」エンドポイントを呼び出します。

curl -X PUT \
https://services.cloud.mongodb.com/api/admin/v3.0/groups/{groupId}/apps/{appId}/security/refresh_token_expiration \
--data-raw '{
"expiration_time_seconds": 864000
}'

リフレッシュ トークンの有効期限が正常に更新されると、エンドポイントは204応答を返します。

アクセス トークンをデコードして、正しい形式と有効な署名があることを確認できます。 デコードされた応答には、アクセス トークンの有効期限が切れるタイミングなどのその他の情報が含まれます。

アプリのVerify を呼び出し、リクエスト本文のtokenフィールドにトークンを使用してアクセス トークンの Admin API エンドポイントをデコードします。

curl -X POST \
https://services.cloud.mongodb.com/api/admin/v3.0/groups/{groupId}/apps/{appId}/users/verify_token \
--data-raw '{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJiYWFzX2RldmljZV9pZCI6IjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsImJhYXNfZG9tYWluX2lkIjoiNWNkYjEyNDA4ZTIzMmFjNGY5NTg3ZmU4IiwiZXhwIjoxNjc2NTExMjgyLCJpYXQiOjE2NzY1MDk0ODIsImlzcyI6IjYzZWQ4MTJhNDNiZTcyYzE3NmFhNWQyMyIsInN0aXRjaF9kZXZJZCI6IjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsInN0aXRjaF9kb21haW5JZCI6IjVjZGIxMjQwOGUyMzJhYzRmOTU4N2ZlOCIsInN1YiI6IjYzZWQ4MTJhNDNiZTcyYzE3NmFhNWQyMSIsInR5cCI6ImFjY2VzcyJ9.7kHO9wjWvIaD3VewDyPhLyb-oRc7wTYZdD9-hroF-H4"
}'
{
"sub": "63ed812a43be72c176aa5d21",
"exp": 1676511282,
"iat": 1676509482,
"iss": "63ed812a43be72c176aa5d23",
"domain_id": "5cdb12408e232ac4f9587fe8",
"device_id": "000000000000000000000000"
}

トークンが有効な場合は、 200応答が返されます。

トークンが有効であるが期限切れである場合、レスポンスはデコードされたJSON web tokenを含むのではなく、トークンが期限切れであることを示します。

"token expired"

トークンが無効な場合は、エラー メッセージを含む401レスポンスが返されます。

{
"error": "signature is invalid"
}

セッションが確立されると、そのセッションを個別に終了することはできませんが、ユーザーのアクティブなセッションをすべて取り消すことはできます。

アクセス トークンとリフレッシュ トークンのすべてのコピーを削除することで、ユーザー セッションを実質的に終了できます。 これにより、セッションへのそれ以上のアクセスが妨げられ、続行するにはユーザーが新しいセッションを認証して開始する必要があります。

各 Realm SDK には、アクセス トークンとリフレッシュ トークンのローカル コピーを削除し、リフレッシュ トークンを無効にして、新しいアクセス トークンを取得するために使用できないようにするUser.logOut()メソッドがあります。

管理者またはユーザーによって ユーザー アカウントが削除 されると、ユーザーのすべてのセッションが自動的に取り消されます。

重要

トークンを安全に保つ

所有するトークンのすべてのコピーを削除して無効にした場合でも、サーバー上のアクティブなセッションは終了しませ。 悪意のあるユーザーがアクセス トークンを削除する前にコピーした場合、そのトークンを使用して有効期限が切れるまでに最大 30 分間リクエストを行うことができます。 これらのリクエストは「ログアウト」したユーザーから送信されるよう表示されます。

ユーザーの現在のセッションをすべて取り消すことができます。 これにより、セッション アクセス トークンとリフレッシュ トークンが無効になり、ユーザーは再度ログインするまですべてのデバイスに対してリクエストを実行できなくなります。

ユーザー アカウントが管理者またはユーザーによって削除されると、ユーザーのすべてのセッションが自動的に取り消されます。

  1. 左側のナビゲーション メニューからApp Usersを選択します。

  2. [ Usersタブで、リスト内のユーザーを検索し、省略記号( ... )をクリックします。

  3. [Revoke all sessions] をクリックします。

ユーザーのすべてのセッションを取り消すには、 appservices users revokeを呼び出します。 CLI では、アプリ ID の入力を求められ、選択するアプリのユーザーが一覧表示されます。

appservices users revoke

コマンドを実行するときに引数を指定することもできます。

appservices users revoke \
--app=<Your App ID> \
--user=<User ID>

Tip

id値をカンマ区切りのリストとして指定することで、1 つのコマンドで複数のユーザーのセッションを取り消すことができます。

appservices users revoke --user=6099694d5debcbcc873ff413,60996996b78eca4a8d615d3a

ユーザー セッションの取り消しエンドポイントを呼び出します。

エンドポイント URL で必ず次の値を置き換えてください。

curl -X PUT \
-H 'Authorization: Bearer {access_token}' \
https://services.cloud.mongodb.com/api/admin/v3.0/groups/{groupId}/apps/{appId}/users/{userId}/logout

戻る

ユーザー アカウントの管理