ユーザー セッションの管理
項目一覧
- Overview
- ユーザー セッション アクセス トークンを取得する
- HTTPS 経由でユーザー アクセス トークンを取得する
- Realm SDK からのユーザー アクセス トークンの取得
- ユーザー セッション アクセス トークンの更新
- HTTPS 経由でユーザー アクセス トークンを更新する
- Realm SDK からのユーザー アクセス トークンの更新
- リフレッシュ トークンの有効期限を設定する
- 管理 UI でリフレッシュ トークンの有効期限を設定する
- HTTPS 経由でリフレッシュ トークンの有効期限を設定する
- ユーザー アクセス トークンの検証とデコード
- ユーザー セッションの終了
- ユーザーのセッションを取り消す
Overview
App Services は、アクセス トークンとリフレッシュ トークンを使用してユーザー セッションを管理します。 アクセス トークンを使用すると、トークンを持っているすべてのユーザーは、関連付けられているセッションを最大 30 分間使用できます。 リフレッシュ トークンを使用すると、前のトークンの有効期限がすでに切れている場合でも、セッションの新しいアクセス トークンを生成できます。
Realm SDK は、App Services に接続すると、ユーザー アクセスとリフレッシュ トークンを自動的に管理します。 Data API などの API サービスに接続している場合は、セッションを自分で管理する必要がある場合があります。
ユーザー セッション アクセス トークンを取得する
ユーザーを認証し、HTTPS 経由で直接または Realm SDK によって管理されるセッションを通じてユーザー アクセス トークンを受け取ることができます。
HTTPS 経由でユーザー アクセス トークンを取得する
HTTPS 経由で App Services に認証リクエストを直接送信することで、アクセス トークンを取得できます。 認証エンドポイントは、ユーザーのログイン認証情報を含む JSON 本文を持つ HTTPS POST リクエストを受け入れます。 認証情報が有効な場合、応答にはユーザーのアクセス トークンが含まれます。
アプリのクライアント API ベース URL を見つける
アプリの認証エンドポイント 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>
をアプリがホストされているクラウドに置き換えます。 たとえば、aws
、azure
、gcp
などがあります。<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" }
ユーザーの認証
ユーザーを認証するには、認証プロバイダを指定してログイン エンドポイントを呼び出します。 ログイン エンドポイントは<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_token
とrefresh_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 からのユーザー アクセス トークンの取得
Realm SDKでは、 User
オブジェクトからログイン ユーザーのアクセス トークンにアクセスできます。 SDK は SDK 操作の期限切れのアクセス トークンを自動的に更新します。 メソッドを呼び出すことで手動で更新できます。
詳しくは、Realm SDK のドキュメントを参照してください。
ユーザー セッション アクセス トークンの更新
アクセス トークンは付与後 30 分で期限切れになります。 アクセス トークンの有効期限が切れても、リクエストの送信を続行するには新しいアクセス トークンを取得する必要があります。
ユーザーを再度ログインさせることで新しいアクセス トークンを取得できますが、そのためにはユーザーの認証情報を再入力する必要があります。 代わりに、ユーザーのセッションに関連付けられたリフレッシュ トークンを使用して、さらに 30 分間有効な新しいアクセス トークンを取得できます。
ログインに成功すると、アクセス トークンと同じ応答でリフレッシュ トークンが取得されます。
HTTPS 経由でユーザー アクセス トークンを更新する
セッション更新エンドポイントは、 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>
をアプリがホストされているクラウドに置き換えます。 たとえば、aws
、azure
、gcp
などがあります。
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 からのユーザー アクセス トークンの更新
Realm SDK は、リクエスト時にトークンの有効期限が切れている場合、ログインしたユーザーのアクセス トークンを自動的に更新します。
SDK では、 User
オブジェクトで メソッドを呼び出して、ユーザーのアクセス トークンを手動で更新することもできます。
詳しくは、Realm SDK のドキュメントを参照してください。
リフレッシュ トークンの有効期限を設定する
デフォルトでは、リフレッシュ トークンは発行後 60 日で期限切れになります。 アプリのリフレッシュ トークンの有効期限は、30 分から 5 年までの範囲で設定できます。
匿名ユーザー更新トークンは有効期限が長く、実質的に期限切れになりません。 代わりに、匿名ユーザー アカウントは作成後 90 日後に自動的に削除されます。
管理 UI または 管理 API から、アプリ内のすべてのセッションのリフレッシュ トークンの有効期限を構成できます。
管理 UI でリフレッシュ トークンの有効期限を設定する
次の方法で、管理 UI からアプリ内のすべてのセッションのリフレッシュ トークンの有効期限を設定できます。
左側のナビゲーション メニューで [ App Usersをクリックします。
User Settings タブを選択します。
Refresh Token Expirationオプションを見つけ、 Editボタンをクリックします。
テキスト入力に時間値を入力し、適切な時間単位(例: ドロップダウン メニューから「分」または「日数」)を選択します。
[Save] をクリックします。
HTTPS 経由でリフレッシュ トークンの有効期限を設定する
管理 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 分間リクエストを行うことができます。 これらのリクエストは「ログアウト」したユーザーから送信されるよう表示されます。
ユーザーのセッションを取り消す
ユーザーの現在のセッションをすべて取り消すことができます。 これにより、セッション アクセス トークンとリフレッシュ トークンが無効になり、ユーザーは再度ログインするまですべてのデバイスに対してリクエストを実行できなくなります。
ユーザー アカウントが管理者またはユーザーによって削除されると、ユーザーのすべてのセッションが自動的に取り消されます。
左側のナビゲーション メニューからApp Usersを選択します。
[ Usersタブで、リスト内のユーザーを検索し、省略記号(
...
)をクリックします。[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 で必ず次の値を置き換えてください。
{groupId}
使用しているAtlas プロジェクト ID{appId}
アプリの内部ObjectIdに設定します。{userId}
ユーザーのアカウント ID を使用します。
curl -X PUT \ -H 'Authorization: Bearer {access_token}' \ https://services.cloud.mongodb.com/api/admin/v3.0/groups/{groupId}/apps/{appId}/users/{userId}/logout