Yammer REST API:如何获取外部网络的访问令牌?

Posted

技术标签:

【中文标题】Yammer REST API:如何获取外部网络的访问令牌?【英文标题】:Yammer REST API: How to get access tokens for external networks? 【发布时间】:2014-05-01 06:00:05 【问题描述】:

我正在开发一个从 Yammer 读取数据的 ASP.NET Web 应用程序。我已成功完成身份验证并从“家庭”网络获取消息。

现在我想切换到另一个网络并从中获取消息。我已经阅读了所有的 documentation,特别是 Networks 部分,其中陈述了以下内容:

便于在不同 Yammer 网络之间切换用户。全部 Yammer Web 请求在 URL 中包含网络永久链接 (https://www.yammer.com/network_permalink/resource_path) 来表示 网络上下文。 API 请求对每个请求使用不同的 OAuth 令牌 用户/网络组合。

Endpoint:返回当前用户拥有的网络列表 使用权。支持included_suspended参数。

GET https://www.yammer.com/api/v1/networks/current.json

好的,所以我需要为用户/网络组合获取相应的令牌。完美的。 我向networks/current.json 端点发出GET 请求,我得到了当前用户可以访问的所有网络。伟大的。现在,令牌在哪里?它们不在 json 响应中。

所以……

如何使用 Yammer REST 从外部网络获取消息 API 通过服务器端代码? 如何获取外部令牌 网络?

更新

听从布赖恩的建议:

    我执行GET https://www.yammer.com/api/v1/oauth/tokens.json 在身份验证标头中传递当前令牌 (Bearer: xxxxxxxxx) 这将返回我正在使用的用户所在的 2 个网络。家庭网络和外部网络。我注意到的一件事是user_id 对于每个网络都不同。我不知道这是否是其他用户,或者同一用户是否为每个网络使用不同的user_id。 现在我想从其他网络获取消息,所以我做了一个

GET https://www.yammer.com/api/v1/messages.json

但现在使用我从tokens.json 端点获得的外部网络令牌。但我得到以下回复:


  "response":
     
      "stat":"fail",
      "code":17,
      "message":"Attempt to access a protected resource failed."
     
 

再一次,根据文档,端点用于模拟并且仅限于付费 Yammer 网络中经过验证的管理员用户。

我真的不知道。

更新 2

上述更新中描述的过程适用于创建 Yammer 应用程序的用户(我)。我正在使用。除非我在该网络中,否则其他用户无法从外部网络获取消息。所以看起来他们正在使用我的令牌,但除非 API 中存在错误,否则这是不可能的。

【问题讨论】:

【参考方案1】:

您需要点击https://www.yammer.com/api/v1/oauth/tokens.json。这个话题在 Zapier 博客上是 covered。他们的博客将 access_token 指定为查询字符串参数,但不再受支持。如 Yammer 开发人员网站上所示,在 Authorization 标头上为当前用户指定访问令牌。

【讨论】:

根据doc,这是模拟的端点。我已经尝试过了,但我得到了其他用户的令牌。我的意思是,JSON 响应包含一组 user_id/token 组合,但那些 user_id 不是当前登录的。因此,当我尝试使用其中一个令牌从相应的外部网络获取消息时,我什么也得不到。 这是令牌端点。您可以发布到它以获取用于模拟的令牌。我稍后会从我的测试网络中的另一台机器上检查。 问题是由于 Yammer 应用未部署,因此无权访问外部网络。【参考方案2】:

到目前为止,我发现的是: 由于某些跨域限制,SDK 在页面上创建了一个隐藏的 iframe,作为代理网桥,以使用用户的主要网络凭据并访问外部网络资源。 网络参数是谜题的关键。

然后可以在重新加载页面时手动设置获取的令牌以用于进一步的请求,避免再次显示登录窗口。

yam.platform.login( network: 'your-permalink-goes-here' , function (data) 

    console.log('login-status: ',data)
    if(data.status ==='connected')
        yam.platform.request(
            url: "oauth/tokens.json"     
            , method: "GET"
            , success: function (tokens)  console.log('user-tokens:',tokens); 
            , error: function (err)  alert("There was an error with the request."); 
        );
)

然后对于下一个请求,setAuthToken 可以解决问题。

yam.platform.setAuthToken('the-token-goes-here'))

【讨论】:

【参考方案3】:

如果您希望您的应用在启用 SSO 的网络中工作,您需要全球化您的应用。为此,您需要向 yammer 服务台提出请求。

参考:yammer oauth2 returning 403 Client Error: Forbidden

【讨论】:

以上是关于Yammer REST API:如何获取外部网络的访问令牌?的主要内容,如果未能解决你的问题,请参考以下文章

Yammer REST API - 在更新之前获取所有消息旧消息,因此无法返回old_than

Yammer REST API

如何在 yammer 中的特定组上发布时解决 REST Api 中的跨域错误

Yammer REST API CORS

如何从外部应用程序安全地使用json web令牌,与wordpress rest api对话

NodeJS Rest API - 调用外部 API 的正确位置在哪里