Overview
App Services gestiona las sesiones de usuario con tokens de acceso y tokens de actualización. Un token de acceso permite que cualquiera que tenga el token utilice la sesión con la que está asociado durante hasta 30 minutos. Un token de actualización permite generar un nuevo token de acceso para una sesión, incluso si el token anterior ya ha expirado.
Los SDK de Realm gestionan automáticamente el acceso de los usuarios y los tokens de actualización cuando se conectan a App Services. Si se conecta a un servicio API como la API de datos, puede que desee gestionar las sesiones usted mismo.
Obtener un token de acceso a la sesión de usuario
Puede autenticar un usuario y recibir un token de acceso de usuario directamente a través de HTTPS o mediante una sesión administrada por un SDK de Realm.
Obtener un token de acceso de usuario a través de HTTPS
Puedes obtener un token de acceso enviando una solicitud de autenticación directamente a App Services mediante HTTPS. El punto de conexión de autenticación acepta una solicitud POST HTTPS con un cuerpo JSON que contiene las credenciales de inicio de sesión del usuario. Si las credenciales son válidas, la respuesta contiene un token de acceso de usuario.
Encuentre la URL base de la API del cliente de su aplicación
La URL del punto final de autenticación de su aplicación depende del modelo de implementación de la aplicación.
Seleccione el modelo de implementación de su aplicación para ver cómo construir la URL base.
https://services.cloud.mongodb.com/api/client/v2.0/app/<App ID>
Reemplaza <App ID> con el ID de la aplicación cliente. Por ejemplo, myapp-abcde.
https://<Region>.<Cloud>.services.cloud.mongodb.com/api/client/v2.0/app/<App ID>
Reemplaza
<Region>por la región donde está alojada tu aplicación. Por ejemplo,us-east-1.Reemplaza
<Cloud>por la nube donde está alojada tu aplicación. Por ejemplo,aws,azureogcp.Reemplace
<App ID>con el ID de su aplicación cliente. Por ejemplo,myapp-abcde.
Puede encontrar la URL base mediante programación con el punto final de ubicación de la aplicación. El cuerpo de la respuesta incluye la URL base como el campo hostname.
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" }
Autenticar un usuario
Para autenticar a un usuario, llame al punto de acceso de inicio de sesión y especifique el proveedor de autenticación. El punto de acceso de inicio de sesión es <Base URL>/auth/providers/<ProviderType>/login, donde <ProviderType> es uno de los siguientes tipos:
anon-userlocal-userpassapi-keycustom-tokencustom-function
Agregue el punto final de inicio de sesión a la URL base y envíe una solicitud POST HTTPS con un cuerpo JSON que contenga las credenciales de inicio de sesión del usuario para el tipo de proveedor elegido:
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>" }'
Si la solicitud de autenticación se realiza correctamente, el cuerpo de la respuesta incluye los valores access_token y refresh_token del usuario. access_token es un token web JSON (JWT) que puede usar para autenticar solicitudes.
{ "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJiYWFzX2RldmljZV9pZCI6IjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsImJhYXNfZG9tYWluX2lkIjoiNWVlYTg2NjdiY2I0YzgxMGI2NTFmYjU5IiwiZXhwIjoxNjY3OTQwNjE4LCJpYXQiOjE2Njc5Mzg4MTgsImlzcyI6IjYzNmFiYTAyMTcyOGI2YzFjMDNkYjgzZSIsInN0aXRjaF9kZXZJZCI6IjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsInN0aXRjaF9kb21haW5JZCI6IjVlZWE4NjY3YmNiNGM4MTBiNjUxZmI1OSIsInN1YiI6IjYzNmFiYTAyMTcyOGI2YzFjMDNkYjdmOSIsInR5cCI6ImFjY2VzcyJ9.pyq3nfzFUT-6r-umqGrEVIP8XHOw0WGnTZ3-EbvgbF0", "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJiYWFzX2RhdGEiOm51bGwsImJhYXNfZGV2aWNlX2lkIjoiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwiYmFhc19kb21haW5faWQiOiI1ZWVhODY2N2JjYjRjODEwYjY1MWZiNTkiLCJiYWFzX2lkIjoiNjM2YWJhMDIxNzI4YjZjMWMwM2RiODNlIiwiYmFhc19pZGVudGl0eSI6eyJpZCI6IjYzNmFiYTAyMTcyOGI2YzFjMDNkYjdmOC1ud2hzd2F6ZHljbXZycGVuZHdkZHRjZHQiLCJwcm92aWRlcl90eXBlIjoiYW5vbi11c2VyIiwicHJvdmlkZXJfaWQiOiI2MjRkZTdiYjhlYzZjOTM5NjI2ZjU0MjUifSwiZXhwIjozMjQ0NzM4ODE4LCJpYXQiOjE2Njc5Mzg4MTgsInN0aXRjaF9kYXRhIjpudWxsLCJzdGl0Y2hfZGV2SWQiOiIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCJzdGl0Y2hfZG9tYWluSWQiOiI1ZWVhODY2N2JjYjRjODEwYjY1MWZiNTkiLCJzdGl0Y2hfaWQiOiI2MzZhYmEwMjE3MjhiNmMxYzAzZGI4M2UiLCJzdGl0Y2hfaWRlbnQiOnsiaWQiOiI2MzZhYmEwMjE3MjhiNmMxYzAzZGI3Zjgtbndoc3dhemR5Y212cnBlbmR3ZGR0Y2R0IiwicHJvdmlkZXJfdHlwZSI6ImFub24tdXNlciIsInByb3ZpZGVyX2lkIjoiNjI0ZGU3YmI4ZWM2YzkzOTYyNmY1NDI1In0sInN1YiI6IjYzNmFiYTAyMTcyOGI2YzFjMDNkYjdmOSIsInR5cCI6InJlZnJlc2gifQ.h9YskmSpSLK8DMwBpPGuk7g1s4OWZDifZ1fmOJgSygw", "user_id": "636aba021728b6c1c03db7f9" }
Obtener un token de acceso de usuario desde un SDK de Realm
En los SDK de Realm, puedes acceder al token de acceso de un usuario conectado desde su objeto User. Los SDK actualizan automáticamente los tokens de acceso caducados para las operaciones del SDK, y puedes actualizarlos manualmente llamando a un método.
Para obtener más información, consulte la documentación de su SDK de Realm:
Actualizar un token de acceso a la sesión de usuario
Los tokens de acceso caducan 30 minutos después de su otorgamiento. Cuando un token de acceso caduca, debe obtener uno nuevo para continuar enviando solicitudes.
Podría obtener un nuevo token de acceso iniciando de nuevo la sesión del usuario, pero esto requeriría que el usuario reintrodujera sus credenciales. En su lugar, puede usar el token de actualización asociado a la sesión del usuario para obtener un nuevo token de acceso válido por 30 minutos más.
Obtendrás el token de actualización en la misma respuesta que el token de acceso después de un inicio de sesión exitoso.
Actualizar un token de acceso de usuario a través de HTTPS
El punto final de actualización de sesión acepta una solicitud POST que incluye el token de actualización en el encabezado Authorization. La URL del punto final depende del modelo de implementación de la aplicación.
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" }
Reemplaza
<Region>por la región donde está alojada tu aplicación. Por ejemplo,us-east-1.Reemplaza
<Cloud>por la nube donde está alojada tu aplicación. Por ejemplo,aws,azureogcp.
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" }
Actualizar un token de acceso de usuario desde un SDK de Realm
Los SDK de Realm actualizan automáticamente el token de acceso de un usuario que ha iniciado sesión si el token ha expirado en el momento de una solicitud.
Los SDK también le permiten actualizar manualmente el token de acceso de un usuario llamando a un método en el objeto User.
Para obtener más información, consulte la documentación de su SDK de Realm:
Configurar la expiración del token de actualización
De forma predeterminada, los tokens de actualización caducan 60 días después de su emisión. Puedes configurar el intervalo de caducidad del token de actualización para tu aplicación entre 30 minutos y 5 años, ambos inclusive.
Los tokens de actualización de usuarios anónimos tienen un tiempo de expiración largo y, en realidad, no caducan. En cambio, las cuentas de usuarios anónimos se eliminan automáticamente 90 días después de su creación.
Puede configurar el tiempo de expiración del token de actualización para todas las sesiones en una aplicación desde la IU de administración o la API de administración.
Establecer la expiración del token de actualización en la interfaz de administración
Para establecer el tiempo de vencimiento del token de actualización para todas las sesiones en una aplicación desde la interfaz de administración:
Haga clic App Users en el menú de navegación de la izquierda.
Seleccione la pestaña User Settings.
Busque la opción Refresh Token Expiration y haga clic en el botón Edit.
Introduzca un valor de tiempo en la entrada de texto y elija la unidad de tiempo adecuada (por ejemplo, "minutos" o "días") en el menú desplegable.
Haga clic en Save.
Establece la expiración del token de actualización a través de HTTPS
Para establecer el tiempo de expiración del token de actualización para todas las sesiones en una aplicación desde la API de administración, llame al punto final Establecer tiempo de expiración del token de actualización del usuario de su aplicación con el expiration_time_seconds campo del cuerpo de la solicitud establecido en el tiempo de expiración deseado.
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 }'
Si actualiza correctamente el tiempo de expiración del token de actualización, el punto final devuelve una respuesta 204.
Verificar y decodificar un token de acceso de usuario
Puede decodificar un token de acceso para verificar que tenga el formato correcto y una firma válida. La respuesta decodificada incluye información adicional, como la fecha de vencimiento del token de acceso.
Llama a la función Verificar de tu aplicación y decodifica un punto final de API de administración de token de acceso con el token en el token campo del cuerpo de la solicitud.
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" }
Si el token es válido, recibirás una respuesta 200.
Si el token es válido pero ha expirado, la respuesta indica que el token ha expirado en lugar de contener el JWT decodificado.
"token expired"
Si el token no es válido, recibirá una respuesta 401 que contiene un mensaje de error.
{ "error": "signature is invalid" }
Finalizar una sesión de usuario
Una vez establecida una sesión, no es posible finalizarla individualmente, aunque sí se pueden revocar todas las sesiones activas de un usuario.
Puede finalizar una sesión de usuario eliminando todas las copias del token de acceso y del token de actualización. Esto impide que se vuelva a acceder a la sesión y requiere que el usuario se autentique e inicie una nueva sesión para continuar.
Cada SDK de Realm tiene un método User.logOut() que elimina copias locales del token de acceso y del token de actualización e invalida el token de actualización para que no pueda usarse para obtener un nuevo token de acceso.
Si se elimina una cuenta de usuario, ya sea por un administrador o por el usuario, todas las sesiones del usuario se revocan automáticamente.
Importante
Mantenga los tokens seguros
Incluso si elimina e invalida todas las copias de un token, esto no finaliza la sesión activa en el servidor. Si un usuario malintencionado copió el token de acceso antes de que se eliminara, podría usarlo para realizar solicitudes durante un máximo de 30 minutos, hasta que caduque. Estas solicitudes parecerían provenir del usuario que cerró sesión.
Revocar las sesiones de un usuario
Puede revocar todas las sesiones actuales de un usuario. Esto invalida el acceso a la sesión y los tokens de actualización, y evita que el usuario realice cualquier solicitud en cualquier dispositivo hasta que vuelva a iniciar sesión.
Si se elimina una cuenta de usuario, ya sea por un administrador o por el usuario, todas las sesiones del usuario se revocan automáticamente.
Seleccione App Users en el menú de navegación de la izquierda.
En la pestaña Users, busque un usuario en la lista y haga clic en el ícono de puntos suspensivos (
...).Haga clic en Revoke all sessions.
Para revocar todas las sesiones de un usuario, llame a appservices users
revoke. La CLI le solicitará el ID de su aplicación y le mostrará una lista de usuarios de esa aplicación para que los seleccione.
appservices users revoke
También puedes especificar los argumentos cuando ejecutas el comando:
appservices users revoke \ --app=<Your App ID> \ --user=<User ID>
Tip
Puede revocar sesiones para varios usuarios con un solo comando especificando sus valores id como una lista separada por comas.
appservices users revoke --user=6099694d5debcbcc873ff413,60996996b78eca4a8d615d3a
Llamar al punto final Revocar sesiones de usuario.
Asegúrese de reemplazar los siguientes valores en la URL del punto final:
{groupId}con su ID de proyecto Atlas.{appId}con el ObjectID interno de su aplicación.{userId}con el ID de la cuenta del usuario.
curl -X PUT \ -H 'Authorization: Bearer {access_token}' \ https://services.cloud.mongodb.com/api/admin/v3.0/groups/{groupId}/apps/{appId}/users/{userId}/logout