如何在PHP站点iframe嵌入自有LinkedIn公司页(API v2报错排查)
问题背景
- 持有与个人LinkedIn账号绑定的LinkedIn公司主页,已在LinkedIn开发者平台创建完成对应已验证应用
- 需求为在PHP网站的iframe模块内展示该LinkedIn公司主页
- 直接嵌入常规公司页URL(格式为
/in/companyName或对应公司ID路径)会触发跨域错误,因此尝试通过LinkedIn API v2实现需求
已尝试操作及报错
- 请求地址:
https://api.linkedin.com/v2/rest/profile/<company page id>
返回错误:{"serviceErrorCode":65604,"message":"Empty oauth2 access token","status":401} - 请求地址:
https://api.linkedin.com/v2/rest/organizations/<company page id>
返回错误:{"serviceErrorCode":65604,"message":"Empty oauth2 access token","status":401}
当前卡点
- 官方API文档未明确标注携带access token的URL构造规则
- 检索到的公开教程均为用户登录后拉取个人资料数据的实现方案,对于仅嵌入自有公司主页的轻量场景流程过于冗余
- 寻求同类场景的可行落地方案
可行解决方案
1. 修复当前API调用的401报错
你遇到的Empty oauth2 access token报错和URL构造规则无关,LinkedIn v2 API不支持把access token直接拼接在URL参数中传递,必须放在请求头里,固定格式为:
Authorization: Bearer <你的应用access_token>
拉取自有公司主页公开数据不需要走用户登录的OAuth授权码流程,直接在开发者后台生成应用级Client Credentials令牌即可,权限仅需勾选r_organization_social和r_organization_basic。令牌默认有效期60天,写个PHP定时任务刷新即可,全程无用户侧交互,不存在流程冗余问题。
另外你用的接口路径有误,拉取公司页基础信息的正确v2接口为:https://api.linkedin.com/v2/organizations/<你的公司ID>?projection=(id,name,description,logoV2,vanityName,localizedWebsite)
路径里不要加/rest/前缀,这是旧版内部路由标识,公网调用直接走v2根路径即可。
2. iframe嵌入的零开发实现
直接嵌入普通LinkedIn公司页触发跨域是因为LinkedIn给主站页面加了X-Frame-Options: DENY响应头,本身就禁止第三方iframe直接嵌入主站路径,不用在这个方向浪费时间。
LinkedIn官方提供了专门的嵌入组件,已配置跨域允许头,直接用即可:
- 打开目标公司主页,在页面顶部「更多」按钮下拉菜单中找到「嵌入此主页」选项,直接生成官方iframe代码
- 生成的代码格式参考:
<iframe src="https://www.linkedin.com/embed/feed/update/urn:li:organization:<你的公司ID>" height="600" width="350" frameborder="0" allowfullscreen="" title="公司LinkedIn主页"></iframe>
将这段代码直接放到PHP站点对应页面位置即可正常加载,不需要额外开发。
3. 自定义展示样式的实现方案
如果官方嵌入组件的样式不符合站点设计要求,再走API拉取数据的自定义渲染方案:
- 用Client Credentials流程生成应用令牌,不要走用户授权流程
- 所有API请求放在PHP服务端执行,禁止前端直接调用API避免泄露应用密钥和access token
- 服务端定时拉取公司主页基础信息、最新帖子数据,缓存到本地数据库
- 前端页面直接读取本地缓存的数据渲染即可,同时规避跨域限制和API调用频次限制
注意:LinkedIn API有严格的频次限制,实时请求很容易触发限流,必须做本地缓存。
内容的提问来源于stack exchange,提问作者Nathan Bernard

