Definir metadados personalizados do usuário
Nesta página
- Usuário de dados personalizado
- Criar e gerenciar dados de usuário personalizados
- Dados de usuário personalizados seguros
- Função de criação de usuário
- Habilitar dados de usuário personalizados
- Acessar dados personalizados de usuário a partir de um aplicativo cliente
- Melhores práticas para modificar permissões em dados de usuário personalizados
- Metadados do provedor de autenticação
- Configurar metadados do provedor de autenticação
- Acessar metadados de usuário a partir de um aplicativo cliente
Pode associar metadados personalizados a cada utilizador do seu aplicativo. Por exemplo, você pode armazenar o idioma preferido de um usuário, a data de nascimento ou qualquer outra informação que queira associar ao usuário.
Você pode obter os metadados de um usuário de duas fontes:
Uma coleção no MongoDB Atlas que armazena dados de usuário personalizados. Você pode associar cada usuário a um documento na coleção pelo ID de usuário. Você pode armazenar dados arbitrários em cada documento.
Um provedor de autenticação. Se o provedor usar tokens da Web JSON, como Google, Facebook ou um provedor personalizado, você poderá definir campos de metadados na configuração do provedor que associam dados do JWT do usuário à sua conta de usuário.
Usuário de dados personalizado
Você pode armazenar dados arbitrários sobre os usuários do aplicativo em uma coleção MongoDB. Seu aplicativo mapeia cada usuário para um documento na coleção queryndo um campo específico para o ID do usuário. Quando um usuário se autentica, seu aplicativo procura os dados do usuário e os inclui em seu token de acesso.
Considere um usuário com o ID "63ed2dbe5960df2af7fd216e"
. Se a sua collection de dados de usuário personalizada foi configurada para armazenar o ID do usuário no userId
, o usuário mapearia para o seguinte documento:
{ "_id": "63ed2e4fb7f367c92578e526", "user_id": "63ed2dbe5960df2af7fd216e", "preferences": { "preferDarkMode": true }, "dateOfBirth": "1989-03-11T00:00:00.000Z" }
Ao usar dados de usuário personalizados, lembre-se do seguinte:
Armazenar um documento por usuário: os documentos que contêm dados do usuário devem incluir o ID do usuário em um campo específico. Se vários documentos especificam o ID do mesmo usuário, o App Services expõe apenas os dados do documento que foi inserido primeiro.
Manter dados personalizados pequenos: o documento de usuário personalizado completo do usuário está incluído em seu token de acesso. Em geral, tente manter os documentos de usuário de dados personalizado pequenos (menos de 16 KB). Outros serviços podem limitar o tamanho do cabeçalho HTTP, o que significa que objetos de usuário de dados personalizado maiores podem causar problemas de integração.
Dados personalizados podem estar obsoletos: os dados personalizados de um usuário são originados de uma coleção do MongoDB, mas são armazenados e lidos a partir do token de acesso de autenticação de um usuário. Se um usuário tiver um token de acesso válido quando o documento subjacente for alterado, seus dados personalizados nessa sessão não serão atualizados até que eles atualizem seu token de acesso ou se autentiquem novamente.
Criar e gerenciar dados de usuário personalizados
Você é responsável por gerenciar documentos na collection de dados de usuário personalizada. Dependendo do seu caso de uso, você pode:
Criar automaticamente um documento para cada usuário quando ele se registra em seu aplicação usando umafunção de criação de usuário do . Essa função é executada antes que o usuário receba um token de acesso, portanto, os dados adicionados estarão no token de acesso em seu primeiro login.
Use um trigger de autenticação para atualizar os dados personalizados de um usuário quando ele se registrar ou fizer login e para excluir seus dados se a conta for excluída. Os gatilhos são executados de forma assíncrona e podem terminar após o token de acesso do usuário ser criado.
Use um trigger agendado para atualizar ou excluir periodicamente dados de usuário personalizados.
Crie, atualize e exclua documentos manualmente na collection usando operações CRUD padrão de uma Função, de um Atlas Device SDK, de um driver do MongoDB ou do MongoDB Compass.
Dados de usuário personalizados seguros
Se os dados personalizados do usuário do seu aplicativo incluírem informações pessoais ou privadas do usuário, você deverá restringir o acesso à collection de dados de usuário personalizada. Considere usar um dos seguintes modelos de permissão para restringir o acesso de leitura e gravação somente a usuários privilegiados:
Um usuário pode ler ou gravar seu próprio documento de dados de usuário personalizado. Rejeite o acesso de leitura e gravação a todos os outros documentos.
Exemplo
A seguinte configuração de coleção tem uma função que concede a um usuário acesso de leitura e escrita a um documento se e somente se sua ID estiver contida no campo
user_id
do documento.Uma configuração da collection de dados de usuário personalizada{ "database": "<Database Name>", "collection": "<Collection Name>", "roles": [ { "name": "ThisUser", "apply_when": { "user_id": "%%user.id%%" }, "insert": false, "read": true, "write": true, "search": false, "delete": false } ], "filters": [] } Nenhum usuário pode ler ou escrever documentos de usuários de dados personalizados. Em vez disso, use uma função do sistema para gerenciar usuários de dados personalizados em nome dos usuários.
Função de criação de usuário
Você pode definir uma função que é executada toda vez que um novo usuário é bem-sucedido se registra, mas antes que sua nova conta de usuário seja criada. Se a função gera erros ou gera erros, a criação da conta do usuário falha. Isso permite você garante que os usuários sempre tenham dados personalizados associados a eles uma vez criado.
A função recebe um objeto de metadados do usuário como seu único argumento. Você pode usar isso para criar um novo documento de dados de usuário personalizado para o usuário.
exports = async function onUserCreation(user) { const customUserDataCollection = context.services .get("mongodb-atlas") .db("myapp") .collection("users"); try { await customUserDataCollection.insertOne({ // Save the user's account ID to your configured user_id_field user_account_id: user.id, // Store any other user data you want favorite_color: "blue", }); } catch (e) { console.error(`Failed to create custom user data document for user:${user.id}`); throw e } }
Dica
Após configurar uma função de criação de usuário, os Serviços de aplicativos evitam que você exclua a função. Se quiser excluir a função , primeiro altere a configuração dos dados personalizados do usuário para usar uma função de criação de usuário diferente .
Habilitar dados de usuário personalizados
Você pode configurar e habilitar dados de usuário personalizados na interface de administração do App Services .
Especifique a collection de dados de usuário customizada
Você deve armazenar os dados personalizados dos usuários do seu aplicativo em uma coleção única de um cluster vinculado do MongoDB Atlas. Para configurar seu aplicativo para ler dados do usuário desta coleção, você precisa Especifique os seguintes valores:
Cluster Name: O nome de um cluster MongoDB vinculado que contém a coleção de dados personalizados do usuário.
Database Name: O nome do banco de dados MongoDB que contém a coleta de dados personalizada do usuário.
Collection Name: o nome da collection do MongoDB que contém dados de usuário personalizado.
Especifique o campo ID do usuário
Cada documento na coleção personalizada de dados do usuário tem um campo que
o mapeia para um usuário específico do aplicativo. O campo deve ser do tipo ObjectID
ou um tipo string
que represente esse ObjectID. Este campo deve estar presente em todos os documentos que mapeiam para um usuário.
Especifique o nome do campo que contém a ID de cada usuário na entrada User ID Field.
Observação
Se dois documentos contiverem o mesmo ID de usuário, um armazenado como uma string e o outro como um ObjectID, o App Services mapeia o documento com o tipo de string para o usuário.
Definir uma função de criação de usuário (opcional)
Se você quiser usar uma função de criação de usuário, defina-a no editor incorporado ou faça referência a uma função existente pelo nome.
Distribuir o aplicativo atualizado
Depois de configurar a collection de dados de usuário customizada, é possível disponibilizar os dados personalizados do usuário para os aplicativos clientes implementando o aplicativo. Para implementar um rascunho de aplicativo a partir da UI do App Services:
Clique em Deploy no menu de navegação esquerdo.
Encontre o rascunho na tabela de histórico de implementação e clique em Review & Deploy Changes.
Revise a diferença de alterações e clique em Deploy.
Depois que o aplicativo for implementado corretamente, o App Services começa a associar dados personalizados aos usuários. Quando um usuário faz se conecta, o App Services faz query automaticamente à collection de dados de usuário customizada em busca de um documento em que o User ID Field especificado contém o ID do usuário. Se um documento corresponder, o App Services expõe os dados no documento no campo custom_data
do objeto de usuário desse usuário.
Obtenha a versão mais recente da sua aplicação
Para definir dados de usuário personalizados com appservices, você precisa de uma cópia local dos arquivos de configuração do seu aplicativo.
Para extrair uma cópia local da versão mais recente do seu aplicativo, execute o seguinte:
appservices pull --remote="<Your App ID>"
Dica
Você também pode baixar uma cópia dos arquivos de configuração do seu aplicativo na tela Deploy > Export App na interface do usuário do App Services.
Configurar dados de usuário personalizados
Você deve armazenar os dados personalizados para os usuários do seu aplicativo em uma única coleção de um Atlas cluster vinculado. Cada documento na coleção deve incluir um campo específico que contenha o ID do usuário do usuário dos App Services que ele descreve.
Para configurar seu aplicação para ler dados de usuário desta coleção, defina um documento de configuração de dados de usuário personalizado no /auth/custom_user_data.json
:
{ "enabled": <Boolean>, "mongo_service_name": "<MongoDB Data Source Name>", "database_name": "<Database Name>", "collection_name": "<Collection Name>", "user_id_field": "<User ID Field Name>", "on_user_creation_function_name": "<Function Name>" }
Acessar dados personalizados de usuário a partir de um aplicativo cliente
Para exemplos de código que demonstram como acessar e atualizar dados de usuário personalizado do aplicação cliente , consulte a documentação para os Atlas Device SDKs:
Melhores práticas para modificar permissões em dados de usuário personalizados
As permissões serão atualizadas automaticamente para um usuário quando você alterar seu documento de dados de usuário personalizado. A sessão de usuário será encerrada e atualizada automaticamente.
Para que as permissões de usuário sejam atualizadas automaticamente, os documentos de dados de usuário personalizado devem ser armazenados em uma coleção normal e não em uma exibição ou coleção de séries temporais .
Para que as permissões sejam atualizadas automaticamente, não exclua um documento de dados de usuário personalizado. Em vez disso, desmarque todos os campos que não sejam ID no documento.
Exemplo
Considere o seguinte documento em que o usuário recebe permissões de leitura e gravação:
{ "_id": "63ed2erealobjectid78e526", "user_id": "63ed2dbe5960df2af7fd216e", "canRead": true, "canWrite": true, }
Os campos canRead
e canWrite
podem ajudar a determinar as funções da coleção deste documento. Por exemplo, o campo canRead
é utilizado para determinar a elegibilidade para o seguinte readAllRole
na expressão apply_when
:
{ "name": "readAllRole" "apply_when": {"%%user.custom_data.canRead": true}, ... }
Digamos que você gostaria de remover o documento do usuário porque ele não está ativo há um longo período de tempo. Primeiro, você precisa remover corretamente as permissões do funcionário, desmarcando os campos que não são ID. O documento seria então:
{ "_id": "63ed2erealobjectid78e526", "user_id": "63ed2dbe5960df2af7fd216e" }
A redefinição do campo não ID permite que os App Services atualizem automaticamente as permissões do usuário de acordo com as funções. Agora você pode excluir o documento com segurança, se necessário.
Metadados do provedor de autenticação
O Atlas App Services pode ler os metadados do usuário a partir do fornecedor de autenticação. Em seguida, o App Services expõe os dados de cada usuário em um campo de seu objeto de usuário. Por exemplo, você pode acessar o nome, e-mail, aniversário ou gênero de um usuário.
É possível configurar o App Services para solicitar metadados com o token de acesso quando os usuários iniciam sessão. Você pode acessar esses dados a partir do objeto do usuário conectado com um SDK do cliente.
Você pode definir os metadados para solicitar ao configurar os provedores de autenticação. Especifique os campos de metadados opcionais que pretende aceder através da conta do utilizador. Esses campos de metadados variam dependendo do provedor.
Fornecedor | Campos de metadados |
---|---|
Facebook |
|
Google |
|
JWT personalizado | Qualquer campo no JWT conforme especificado pela configuração de campos de metadados do fornecedor JWT personalizado. |
Importante
Evite metadados do provedor de autenticação obsoletos
Se os metadados de um usuário forem atualizados após a emissão do token de acesso, as solicitações que usam o token de acesso criado anteriormente não terão os metadados recém-atualizados. Os metadados do usuário serão atualizados quando eles atualizarem o token de acesso ou se autenticarem novamente.
Observação
Metadados do provedor de segurança e autenticação
Os metadados do provedor de autenticação podem ser definidos externamente por clientes, bem como por provedores de autenticação externos, e devem ser considerados com cautela. Não confie apenas nos metadados do provedor de autenticação para tomar decisões relacionadas à segurança, por exemplo, usar esses metadados em expressões de regras para permissões de acesso a dados.
Configurar metadados do provedor de autenticação
Navegue até a tela de configuração do fornecedor de autenticação
Você pode configurar e habilitar os metadados do usuário na interface do usuário do App Services. Para acessar a página de configuração:
Clique em Authentication no menu de navegação esquerdo.
Selecione a guia Authentication Providers.
Pressione o botão EDIT do provedor cujos metadados você deseja configurar.
Configurar metadados do usuário
Google ou Facebook
Marque as caixas de seleção ao lado dos campos de metadados que você deseja habilitar.
Autenticação JWT personalizada
Você pode especificar os campos de metadados aceitos pelo seu fornecedor de identidade. Depois de pressionar o botão Add Field, defina:
O caminho
O nome do campo
Se o campo é opcional ou obrigatório
Para obter mais detalhes, consulte Campos de metadados JWT.
Depois de configurar os metadados que pretende acessar, pressione o botão Save Draft .
Distribuir o aplicativo atualizado
Após atualizar a configuração de metadados, você deve implantar seu aplicativo. Para implementar um rascunho de aplicativo a partir da interface do usuário do App Services:
Clique em Deploy no menu de navegação esquerdo.
Encontre o rascunho na tabela de histórico de implementação e clique em Review & Deploy Changes.
Revise a diferença de alterações e clique em Deploy.
Depois que o aplicativo é implantado com sucesso, o App Services começa a associar metadados aos usuários. Quando um usuário faz login, o App Services solicita permissão do usuário para acessar os metadados solicitados. Se o usuário aprovar, os Serviços de Aplicativo expõem os dados no objeto de usuário desse usuário.
Obtenha a versão mais recente da sua aplicação
Para atualizar seu aplicativo com serviços de aplicativo, você precisa de uma cópia local de seus arquivos de configuração.
Para extrair uma cópia local da versão mais recente do seu aplicativo, execute o seguinte:
appservices pull --remote="<Your App ID>"
Dica
Você também pode baixar uma cópia dos arquivos de configuração do seu aplicativo na UI do App Services. Go para a tela Deploy > Export App no dashboard do aplicativo.
Configurar campos de metadados
Você pode encontrar metadata_fields do provedor de autenticação para sua aplicação em /auth/providers.json
. Atualize esta array para solicitar metadados do usuário do provedor de autenticação.
Google ou Facebook
Esta array se assemelha a:
{ ...other config details... "metadata_fields": [ { "required": false, "name": "name" }, { "required": false, "name": "gender" } ] }
Autenticação JWT personalizada
A array metadata_fields tem uma propriedade adicional, field_name
. Na autenticação JSON web token personalizado, name
representa o caminho para o campo. O field_name
representa o nome do campo.
{ ...other config details... "metadata_fields": [ { "required": true, "name": "user.name", "field_name": "name" }, { "required": false, "name": "user.favoriteColor", "field_name": "favoriteColor" } ] }
Autenticar um usuário do MongoDB Atlas
Chame o endpoint de autenticação do usuário administrador com seu par de chaves da API do MongoDB Atlas:
curl -X POST \ https://services.cloud.mongodb.com/api/admin/v3.0/auth/providers/mongodb-cloud/login \ -H 'Content-Type: application/json' \ -H 'Accept: application/json' \ -d '{ "username": "<Public API Key>", "apiKey": "<Private API Key>" }'
Se a autenticação for bem-sucedida, o corpo da resposta conterá um objeto JSON com um valor access_token
:
{ "access_token": "<access_token>", "refresh_token": "<refresh_token>", "user_id": "<user_id>", "device_id": "<device_id>" }
O access_token
concede acesso à App Services Admin API. Você deve incluí-lo como um token do portador no cabeçalho Authorization
para todas as solicitações de API Admin.
Configurar campos de metadados
Envie uma solicitação para o endpoint Atualizar um provedor de autenticação . No corpo da solicitação, defina metadata_fields
para o provedor.
Certifique-se de incluir sua API Admin access_token
, o groupId
do projeto Atlas que contém seu aplicativo, a string hexadecimal appId
interna do aplicativo e o valor _id
do provedor de autenticação:
curl --request PATCH 'https://services.cloud.mongodb.com/api/admin/v3.0/groups/{groupId}/apps/{appId}/auth_providers/{providerId}' \ --header 'Authorization: Bearer <access_token>' \ --header 'Content-Type: application/json' \ --data '{ "_id": "<Provider ID>", "name": "oauth2-facebook", "type": "oauth2-facebook", "redirect_uris": ["https://example.com/"], "config": { "clientId": "<Facebook Client ID>" }, "secret_config": { "clientSecret": "<Facebook Client Secret Name>" }, "metadata_fields": [ { "required": false, "name": "name" }, { "required": true, "name": "first_name" }, { "required": true, "name": "last_name" }, { "required": false, "name": "picture" }, { "required": false, "name": "gender" }, { "required": false, "name": "birthday" }, { "required": false, "name": "min_age" }, { "required": false, "name": "max_age" }, { "required": false, "name": "email" } ], "disabled": false }'
curl --request PATCH 'https://services.cloud.mongodb.com/api/admin/v3.0/groups/{groupId}/apps/{appId}/auth_providers/{providerId}' \ --header 'Authorization: Bearer <access_token>' \ --header 'Content-Type: application/json' \ --data '{ "_id": "<Provider ID>", "name": "oauth2-google", "type": "oauth2-google", "redirect_uris": ["https://example.com/"], "config": { "clientId": "<Google Client ID>" }, "secret_config": { "clientSecret": "<Google Client Secret Name>" }, "metadata_fields": [ { "required": false, "name": "name" }, { "required": true, "name": "first_name" }, { "required": true, "name": "last_name" }, { "required": false, "name": "picture" }, { "required": false, "name": "gender" }, { "required": false, "name": "birthday" }, { "required": false, "name": "min_age" }, { "required": false, "name": "max_age" }, { "required": false, "name": "email" } ], "disabled": false }'
curl --request PATCH 'https://services.cloud.mongodb.com/api/admin/v3.0/groups/{groupId}/apps/{appId}/auth_providers/{providerId}' \ --header 'Authorization: Bearer <access_token>' \ --header 'Content-Type: application/json' \ --data '{ "_id": "<Provider ID>", "name": "custom-token", "type": "custom-token", "metadata_fields": [ { "required": true, "name": "jwt.field.path", "field_name": "metadataFieldName" } ], "config": { "audience": [], "requireAnyAudience": false, "signingAlgorithm": "HS256", "useJWKURI": false }, "secret_config": { "signingKeys": [ "<JWT Signing Key>" ] }, "disabled": true }'
Se você configurar com sucesso os campos de metadados do provedor, o App Services retornará uma resposta 204
.
Observação
Dicas para usuários com vários provedores de autenticação vinculados
Para garantir os metadados mais atualizados, os usuários devem se autenticar novamente depois de alternar para um provedor de autenticação diferente. Se isso não for feito, poderá resultar em metadados desatualizados refletidos na tabela Users na página App Users da interface do usuário e para solicitações que usam provedores de autenticação.
Se um usuário alternar entre provedores de autenticação, pode levar até 30 minutos para que os metadados se propaguem. É sempre garantido que a solicitação tenha os metadados mais atualizados associados ao provedor de autenticação usado.
Acessar metadados de usuário a partir de um aplicativo cliente
Para exemplos de código que demonstram como acessar os dados de metadados do usuário a partir do aplicação do cliente , consulte a documentação para os SDKs do Dispositivo Atlas :