Pesquisa avançada de usuários
Utilize diretamente a Management API para aproveitar condições avançadas de pesquisa de usuários.
Realizar uma solicitação de pesquisa
Use GET /api/users para pesquisar usuários. Observe que é uma Management API que requer autenticação como as demais. Veja Interaja com a Management API para a receita de interação.
Exemplo
Requisição
curl \
--location \
--request GET \
'http://<your-logto-endpoint>/api/users?search=%25alice%25'
Resposta
Um array de entidades User.
[
{
"id": "MgUzzDsyX0iB",
"username": "alice_123",
"primaryEmail": "alice@some.email.domain",
"primaryPhone": null,
"name": null,
"avatar": null
// ...
}
]
Parâmetros
Uma solicitação de pesquisa consiste nas seguintes chaves de parâmetro:
- Palavras-chave de pesquisa:
search,search.* - Modo de pesquisa para campos:
mode,mode.*(valor padrão'like', disponíveis['exact', 'like', 'similar_to', 'posix']) - Modo de junção:
jointoujointMode(valor padrão'or', disponíveis['or', 'and']) - É sensível a maiúsculas e minúsculas:
isCaseSensitive(valor padrãofalse)
Esta API possui paginação habilitada.
Vamos passar por eles com alguns exemplos. Todos os parâmetros de pesquisa serão formatados como um construtor de URLSearchParams.
O modo de pesquisa é definido como like por padrão, que utiliza Correspondência aproximada de strings ("busca difusa").
Todos os modos de busca difusa suportam apenas a correspondência de um valor por campo. Se você precisar corresponder múltiplos valores para um único campo, deve usar o modo "exact". Veja Correspondência exata e sensibilidade a maiúsculas e minúsculas para detalhes.
Busca difusa básica
Se você deseja realizar uma busca difusa em todos os campos disponíveis, basta fornecer um valor para a chave search. Será utilizado o operador like internamente:
new URLSearchParams([['search', '%foo%']]);
Esta busca irá iterar sobre todos os campos disponíveis em uma pesquisa de usuário, ou seja, id, primaryEmail, primaryPhone, username, name.
Especificar campos
E se você quiser limitar a busca apenas ao campo name? Para buscar alguém que inclua foo no nome, basta usar o símbolo . para especificar o campo:
new URLSearchParams([['search.name', '%foo%']]);
Lembre-se de que campos aninhados não são suportados, por exemplo, search.name.first resultará em erro.
Você também pode especificar vários campos ao mesmo tempo:
new URLSearchParams([
['search.name', '%foo%'],
['search.primaryEmail', '%@gmail.com'],
]);
Significa buscar usuários que tenham foo no nome OU cujo e-mail termine com @gmail.com.
Alterando o modo de junção
Se você deseja que a API retorne apenas o resultado que satisfaça TODAS as condições, defina o modo de junção como and:
new URLSearchParams([
['search.name', '%foo%'],
['search.primaryEmail', '%@gmail.com'],
['joint', 'and'],
]);
Significa buscar usuários que tenham foo no nome E cujo e-mail termine com @gmail.com.
Correspondência exata e sensibilidade a maiúsculas e minúsculas
Suponha que você queira buscar quem tem o nome exatamente "Alice". Você pode definir mode.name para usar correspondência exata.
new URLSearchParams([
['search.name', 'Alice'],
['mode.name', 'exact'],
]);
Você pode perceber que tem o mesmo efeito ao usar o modo like (padrão) vs. especificar exact. Uma diferença é que o modo exact usa = para comparar enquanto like usa like ou ilike. Teoricamente, = deve ter melhor desempenho.
Além disso, no modo exact, você pode passar múltiplos valores para correspondência, e eles serão conectados com or:
new URLSearchParams([
['search.name', 'Alice'],
['search.name', 'Bob'],
['mode.name', 'exact'],
]);
Irá corresponder usuários com nome "Alice" OU "Bob".
Por padrão, a busca não diferencia maiúsculas de minúsculas. Para ser mais preciso, defina a busca como sensível a maiúsculas e minúsculas:
new URLSearchParams([
['search.name', 'Alice'],
['search.name', 'Bob'],
['mode.name', 'exact'],
['isCaseSensitive', 'true'],
]);
Observe que isCaseSensitive é uma configuração global. Assim, TODO campo irá segui-la.
Expressão regular (RegEx)
O PostgreSQL suporta dois tipos de expressões regulares, similar to e posix. Defina mode como similar_to ou posix para buscar por expressões regulares:
new URLSearchParams([
['search', '^T.?m Scot+$'],
['mode', 'posix'],
]);
Observação: O modo similar_to só funciona em buscas sensíveis a maiúsculas e minúsculas.
Sobrescrever o modo de correspondência
Por padrão, todas as palavras-chave herdarão o modo de correspondência da busca geral:
new URLSearchParams([
['search', '^T.?m Scot+$'],
['mode', 'posix'],
['search.primaryEmail', 'tom%'], // Modo Posix
['joint', 'and'],
]);
Para sobrescrever para um campo específico:
new URLSearchParams([
['search', '^T.?m Scot+$'],
['mode', 'posix'],
['search.primaryEmail', 'tom%'], // Modo Like
['mode.primaryEmail', 'like'],
['search.phone', '0{3,}'], // Modo Posix
['joint', 'and'],
]);
Buscar por identidade externa
Para encontrar o usuário vinculado a uma identidade social ou SSO corporativo, passe os três parâmetros de consulta a seguir juntos para uma busca exata:
identityType:socialpara uma identidade de conector social, oussopara uma identidade de SSO corporativo.identityProvider: o destino do conector para uma identidade social (por exemplo,dingtalk), ou o emissor para uma identidade de SSO corporativo.identityId: o identificador do usuário emitido pelo provedor de identidade externo.
// Encontrar o usuário vinculado a uma identidade social do DingTalk
new URLSearchParams([
['identityType', 'social'],
['identityProvider', 'dingtalk'],
['identityId', 'dingtalk-open-id'],
]);
// Encontrar o usuário vinculado a uma identidade SSO corporativa
new URLSearchParams([
['identityType', 'sso'],
['identityProvider', 'https://example.com/issuer'],
['identityId', 'enterprise-user-id'],
]);
O filtro de identidade é combinado com outros filtros de pesquisa usando lógica AND. Por exemplo, para refinar ainda mais a busca de identidade com uma palavra-chave:
new URLSearchParams([
['identityType', 'social'],
['identityProvider', 'dingtalk'],
['identityId', 'dingtalk-open-id'],
['search', '%foo%'],
]);