我尝试从 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}`)
}
也许是与电子邮件地址隐私政策相关联的用户配置文件配置有问题?
我通过不直接在 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();
更简单更好的方法是使用
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
}