为什么当我尝试获取电子邮件地址时 Linkedin API 返回 404

问题描述 投票:0回答:2

我尝试从 Linkedin API 获取已登录用户的电子邮件地址,因此我在以下位置执行 GET 请求:

https://api.linkedin.com/v2/emailAddress?q=members&projection=(elements*(handle~))
带有授权标头
Bearer access_token
。但是我得到 404 响应

{"serviceErrorCode":0,"message":"Resource null does not exist","status":404}

带有配置文件数据的端点

/v2/me
正常工作。我做错了什么?

示例代码尚未重构,仅用于获取响应和请求日志。不要被变量名影响:

   webClient = WebClient.builder()
            .baseUrl("https://api.linkedin.com")
            .clientConnector(new ReactorClientHttpConnector(HttpClient.create().wiretap(this.getClass().getCanonicalName(), LogLevel.INFO, AdvancedByteBufFormat.TEXTUAL)))
            .build();
        webClient.get()
            .uri(uriBuilder -> uriBuilder.path("/v2/me").build())
            .header("Authorization", "Bearer " + facebook.getAccessToken())
            .retrieve()
            .bodyToMono(GoogleProfile.class)
            .log()
            .block();
        webClient.get()
            .uri(uriBuilder -> uriBuilder.path("v2/emailAddress?q=members&projection=(elements*(handle~))").build())
            .header("Authorization", "Bearer " + facebook.getAccessToken())
            .retrieve()
            .bodyToMono(GoogleProfile.class)
            .log()
            .block();

我的客户代码:

    const redirectUri = 'http://localhost:8082/login/linkedin/callback';
    const scope = 'r_liteprofile r_emailaddress';
    const clientId = 'client_code';
    const responseType = 'code';

    const linkedinLoginAction = () => {
        window.open(`https://www.linkedin.com/oauth/v2/authorization?client_id=${clientId}&redirect_uri=${redirectUri}&scope=${scope}&response_type=${responseType}`)
    }

也许是与电子邮件地址隐私政策相关联的用户配置文件配置有问题?

java oauth-2.0 linkedin
2个回答
1
投票

我通过不直接在 url 中的方法添加 queryParams 来修复它:

webClient.get()
            .uri(uriBuilder -> uriBuilder.path("v2/emailAddress")
                .queryParam("q", "members")
                .queryParam("projection", "(elements*(handle~))").build())
            .header("Authorization", "Bearer " + facebook.getAccessToken())
            .retrieve()
            .bodyToMono(GoogleProfile.class)
            .log()
            .block();

0
投票

更简单更好的方法是使用

userinfo
端点,如here所述。

这将在同一个回复中为您提供所有必填字段:

{
"sub": "782bbtaQ",
"name": "John Doe",
"given_name": "John",
"family_name": "Doe",
"picture": "https://media.licdn-ei.com/dms/image/C5F03AQHqK8v7tB1HCQ/profile-displayphoto-shrink_100_100/0/",
"locale": "en-US",
"email": "[email protected]",
"email_verified": true

}

© www.soinside.com 2019 - 2024. All rights reserved.