从SharePoint 2013 Web部件访问LinkedIn 2.0 API时遭遇403 Forbidden错误
先给你梳理下这个403错误最可能的几个原因,以及对应的解决办法,都是踩过LinkedIn API坑的经验总结:
1. 权限不匹配:v1 vs v2 API权限混淆
LinkedIn的v1和v2 API权限是不通用的,你当前用的r_basicprofile是v1版本的权限,但调用的是v2的/me接口,这个接口需要的是v2的r_liteprofile权限。
解决步骤:
- 登录LinkedIn开发者后台,把应用的权限从
r_basicprofile替换成r_liteprofile - 重新引导用户授权,获取新的access token(旧的token没有新权限,会继续报错)
2. Access Token的Scope未包含正确权限
就算你在开发者后台配置了权限,也要确保获取token时的请求里,scope参数包含了r_liteprofile(如果需要邮箱还要加r_emailaddress)。比如授权URL里的scope应该是:scope=r_liteprofile%20r_emailaddress%20w_share
3. 缺失LinkedIn v2 API强制要求的请求头
LinkedIn v2 API要求必须携带X-RestLi-Protocol-Version头,否则会拒绝请求。在你的代码里添加这个头:
webRequest.Headers.Add("X-RestLi-Protocol-Version", "2.0.0");
另外,默认的.NET HttpWebRequest的User-Agent可能会被LinkedIn的安全机制拦截,建议手动设置一个合规的User-Agent:
webRequest.UserAgent = "SharePoint2013-WebPart/1.0";
4. 验证SharePoint服务器的.NET框架与TLS支持
你已经设置了SecurityProtocolType.Tls12,这是对的,但要确认你的SharePoint 2013服务器上的.NET框架版本至少是4.5.2(4.5本身对TLS1.2的支持有限)。如果是4.5版本,可能需要升级到4.5.2或更高,或者通过修改注册表强制启用TLS1.2。
修正后的完整代码示例
把上面的修改整合后,你的代码应该是这样的:
ServicePointManager.Expect100Continue = true; ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; string requesturl = "https://api.linkedin.com/v2/me?projection=(id,firstName,lastName)"; HttpWebRequest webRequest = System.Net.WebRequest.Create(requesturl) as HttpWebRequest; webRequest.Method = "GET"; webRequest.Host = "api.linkedin.com"; webRequest.UserAgent = "SharePoint2013-WebPart/1.0"; webRequest.Headers.Add("Authorization", "Bearer " + accessToken); webRequest.Headers.Add("X-RestLi-Protocol-Version", "2.0.0"); WebResponse response = webRequest.GetResponse(); Stream dataStream = response.GetResponseStream(); StreamReader responseReader = new StreamReader(dataStream); String returnVal = responseReader.ReadToEnd().ToString();
先按这个顺序排查,最可能的问题就是权限不匹配和缺失请求头,先解决这两个试试。
内容的提问来源于stack exchange,提问作者Ashish Naik
相关产品推荐
相关产品推荐

