【问题标题】:Yammer API - Posting to External NetworksYammer API - 发布到外部网络
【发布时间】:2014-08-24 00:37:03
【问题描述】:

我已广泛使用 Yammer API 来访问当前用户的内部网络。使用从中提取的原始令牌,所有 API 调用(GET 和 POST)都正常工作;

"https://www.yammer.com/oauth2/access_token.json?client_id={App ID}&client_secret={App Secret}&code={Access Code}"

并使用标题; "Authorization : Bearer {Token}" 和 "Cookie : {Cookies Received from HTML request}.

我已经获得了所有可访问网络的令牌; “https://www.yammer.com/api/v1/oauth/tokens.json”。

在此之后访问外部网络已被证明很麻烦。我将标题更改为“授权:承载 {NetworkToken}”。虽然我能够从外部网络获取详细信息,但我无法发布到外部网络。我总是收到“401 Unauthorized”回复。 “未授权”请求包括在外部网络中删除消息和点赞消息。

在能够从外部网络读取数据和启用 POST 方法之间是否还有其他步骤?

如果我能对此有所了解,我将不胜感激! 干杯!

【问题讨论】:

    标签: rest cookies oauth yammer


    【解决方案1】:

    访问外网时,需要将authToken设置为该外网的authToken。

    第 1 步 - 获取所有身份验证令牌:

      yam.platform.request({
            url: "oauth/tokens.json",
            type: 'GET',
            success: function (msg) {
                accessTokens = msg;
               /....
    
            },
            error: function (msg) {
                console.log(msg);
                error(msg);
            }
    

    第二步:设置authToken到正确的外网

    var currentToken = "";
        $.each(accessTokens, function (i,val) {
            if (val.network_permalink == $.cookie('networkPermalink')) {
                currentToken = val;
            }
        });
    

    【讨论】:

    • 谢谢;我已经有了身份验证令牌。由于我没有使用 SDK,这不是我可以直接使用的东西。我应该提到我正在使用 C# 在要添加到 Web 请求的字典中构造标题。我不确定应该将“networkPermalink”插入到文档中描述的 URL 之外的哪个位置; www.yammer.com/{NetworkPermalink}/{ResourcePath} 我已经尝试在标题“授权:{NetworkToken}”中插入单个网络令牌。
    • 仅在 URL 中需要 NetworkPermalink。如果您拥有如 Peter 所述为外部网络授予的正确令牌并使用“授权:Bearer {NetworkToken}”,它应该可以工作。
    • 好的,谢谢。所以我已经尝试过这个(如我的问题中所述)和一些替代组合。不管我一直收到“401 Unauthorized”的响应和响应头; WWW-AUTHENTICATE : Bearer realm="www.yammer.com" 以及一些不相关的标题。我们可以朝着解决这个问题的方向前进吗?它显然没有按应有的方式工作。也许这是一个错误?
    【解决方案2】:

    上个月我在做一个项目的时候,我用下面的方式发消息。

    消息必须以 UTF-8 格式进行字节加密。 将内容类型指定为“application/x-www-form-urlencoded”。

    所以,一个示例代码是:

    HttpWebRequest a = (HttpWebRequest)WebRequest.Create(postUrl);
    a.Headers.Add("Authorization", "Bearer" + authToken);
    a.Method = "POST";
    byte[] message = Encoding.UTF8.GetBytes("body=" + message + "&replied_to_id=" + threadID);
            a.ContentType = "application/x-www-form-urlencoded";
            a.ContentLength = message.Length;
            using (var postStream = request.GetRequestStream())
            {
                postStream.Write(message, 0, message.Length);
            }
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            using (var postStreamForResponse = response.GetResponseStream())
            {
                StreamReader postReader = new StreamReader(postStreamForResponse);
                string results = postReader.ReadToEnd();
                postReader.Close();
            }
    

    【讨论】:

      【解决方案3】:

      我发现了很多关于 Yammer API 的 inconsistencies 怪癖。我现在已经全面了解了外部网络。这里有一些可能不清楚的地方;

      在执行 POST 或 DELETE 请求时,不要在 url 中包含 network_permalink!仅在执行 GET 请求时包含 network_permalink。这是我的主要问题。

      必需的请求标头;

      Content-Type : application/x-www-form-urlencoded
      Accept : application/json
      Cookie : _workfeed_session_id=(A code that can be extracted from the response from your first request with an auth token)
      Authorization : Bearer (Access token for whichever network you wish to access)
      

      哦,仅供参考,要在“所有公司”组中请求线程,这是 url; https://www.yammer.com/(network_permalink)/api/v1/messages/general.json

      感谢您的回答!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-01
        • 2014-10-30
        • 1970-01-01
        • 2018-07-31
        • 2014-06-17
        相关资源
        最近更新 更多