如何获取所有 Auth0 用户的列表

Posted

技术标签:

【中文标题】如何获取所有 Auth0 用户的列表【英文标题】:How to get list of all Auth0 users 【发布时间】:2017-01-12 23:25:14 【问题描述】:

我想从 Java API(auth0 客户端)获取 Auth0 用户列表。我可以做吗?基于Java+Spring Security的API。 我试过用 RestTemplate 来做:

List findAllUsers()
    String idToken = RestService.getIdToken()
    HttpHeaders headers = new HttpHeaders()
    headers.set("Authorization", "Bearer $idToken");
    List users = []
    try
        ResponseEntity entity = restTemplate.exchange(issuer+"api/v2/users", HttpMethod.GET, new HttpEntity<Object>(headers), List)
        users = entity.getBody()
     catch (HttpClientErrorException e)
        e.printStackTrace()
    
    return users

但是我得到了 403 Forbidden 状态。

【问题讨论】:

【参考方案1】:

rest 模板的简单方法。

final String MANAGEMENT_TOKEN = "ManagementToken";
        RestTemplate restTemplate = new RestTemplate();
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.set("Authorization", "Bearer" + " " + MANAGEMENT_TOKEN);
        HttpEntity<Object> httpEntity = new HttpEntity<>(httpHeaders);
        String url = "https:<//YOUR_DOMAIN>.auth0.com/api/v2/users";
    ResponseEntity<Object>response=restTemplate.exchange(url,HttpMethod.GET,httpEntity, Object.class);

`

To genarate MANAGEMENT_TOKEN

希望对你有所帮助

【讨论】:

【参考方案2】:

您可以使用库 Apache HTTP 客户端:

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.2</version>
</dependency>

这段代码运行良好:

HttpClient httpclient = new DefaultHttpClient();

                URIBuilder builder = new URIBuilder("https://domain.auth0.com/api/v2/users");
                HttpGet httpGet = new HttpGet(builder.build());
                httpGet.setHeader("Accept", "application/json");
                httpGet.setHeader("Content-type", "application/json");
                httpGet.setHeader(
                        "Authorization",
                        "Bearer "+ token);

                HttpResponse responseHttp = httpclient.execute(httpGet);

                HttpEntity entity = responseHttp.getEntity();

                BufferedReader rd = new BufferedReader(new InputStreamReader(entity.getContent()));

                StringBuffer result = new StringBuffer();

                String line = "";
                while ((line = rd.readLine()) != null) 
                    result.append(line);
                    System.out.println(line);
                

这个代码你只会给你50个用户,如果你的用户超过50个你必须使用这个URL:

https://domain.auth0.com/api/v2/users?per_page=50&page="+ pageNumber + "&include_totals=true"

您可以指定每页的用户数和包含用户总数的页码。

这段代码的结果是一个 JSON,所以最简单的方法是使用 Gson 库来解析它:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.7</version>
</dependency>

这是一个使用 Gson 库解析 Json 字符串的示例:

 public String parse(String jsonLine) 
    JsonElement jelement = new JsonParser().parse(jsonLine);
    JsonObject  jobject = jelement.getAsJsonObject();
    jobject = jobject.getAsJsonObject("data");
    JsonArray jarray = jobject.getAsJsonArray("translations");
    jobject = jarray.get(0).getAsJsonObject();
    String result = jobject.get("translatedText").toString();
    return result;

【讨论】:

【参考方案3】:

是的,这是可能的。但是,您需要使用 Auth0 Management Token

请参阅我写的this sample,我在其中进行搜索(在这种情况下过滤以获取特定用户帐户而不是所有用户)。

您可以获得管理令牌并查看搜索选项here。您需要根据文档提供您的管理令牌 read:usersread:user_idp_tokens 范围。

建议您首先使用 Postman 等工具进行正确搜索,然后转换为 Java。您可以使用上面示例链接中列出的 sn-p 和相关依赖项OkHttpClient

    <dependency>
        <groupId>com.squareup.okhttp3</groupId>
        <artifactId>okhttp</artifactId>
        <version>3.2.0</version>
    </dependency>

此外,Postman 也可用于generate 您定义的请求中的代码。 Auth0 目前不提供 Java 库的 Management API,但很快就会提供。

更新:

这是一些工作代码,只需替换为您的管理令牌和租户(用于 URL)。

import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;

import java.io.IOException;

/**
 * Created by arcseldon on 07/09/2016.
 */
public class GetUsers 

    public static void main(String[] args) throws IOException 

        final String MANAGEMENT_TOKEN = "YOUR_MANAGEMENT_TOKEN";

        OkHttpClient client = new OkHttpClient();

        Request request = new Request.Builder()
                .url("https://<YOUR_TENANT>.auth0.com/api/v2/users")
                .get()
                .addHeader("authorization", "Bearer " + MANAGEMENT_TOKEN)
                .addHeader("cache-control", "no-cache")
                .build();
        Response response = client.newCall(request).execute();
        System.out.println("All done: " + response.body().string());
    

【讨论】:

@SergeyLinnik - 非常棒 - 如果您在设置过程中遇到任何其他问题,请随时在此处发表评论。 所以,还有一个小问题。当我尝试使用 okhttp 在您的简单请求中执行请求时,出现此错误:"statusCode":400,"error":"Bad Request","message":"Bad HTTP authentication header format","errorCode":"Bearer"。你能帮忙吗?抱歉问了这么愚蠢的问题 一点也不。看到这条线github.com/auth0-samples/… 您需要一个带有键 Authorization 和值 Bearer &lt;your_management_token&gt; 的 HTTP 标头您是否使用上述答案中的链接生成了管理令牌? 我只是复制粘贴你的代码块String url = "https://default-app.eu.auth0.com/api/v2/users" final OkHttpClient client = new OkHttpClient(); final Request request = new Request.Builder() .url(url) .get() .addHeader("Authorization", "Bearer " + managementToken) .addHeader("cache-control", "no-cache") .build();

以上是关于如何获取所有 Auth0 用户的列表的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用 auth0 进行身份验证的反应应用程序中获取用户信息

如何使用 Auth0 Lock 从响应对象中获取用户名?

auth0 从角度 2 获取所有用户

登录 Auth0 后找不到如何获取访问令牌

获取 auth0 用户元数据作为用户信息的一部分

discord.py 如何获取用户连接的所有服务器的列表?