Yammer API — Отправка во внешние сети

#rest #cookies #oauth #yammer

#rest #файлы cookie #oauth #yammer

Вопрос:

Я широко использовал Yammer API для доступа к внутренней сети текущих пользователей. Все вызовы API работали корректно (GET и POST) с исходным токеном, извлеченным из;

«https://www.yammer.com/oauth2/access_token.json?client_id ={Идентификатор приложения}amp;client_secret={Секрет приложения}amp;код ={Код доступа}»

и использование заголовков; «Авторизация: Предъявитель {токен}» и «Cookie: {Файлы cookie, полученные из HTML-запроса}.

Я получил токены для всех доступных сетей, используя; «https://www.yammer.com/api/v1/oauth/tokens.json«.

Доступ к внешним сетям после этого момента оказался затруднительным. Я изменил заголовок на «Авторизация: Bearer {NetworkToken}». Хотя я могу ПОЛУЧАТЬ подробную информацию из внешних сетей, я не могу отправлять во внешние сети. Я всегда получаю ответ «401 Несанкционированный». «Несанкционированные» запросы включают удаление сообщений и лайк сообщений во внешних сетях.

Есть ли еще один шаг между возможностью чтения данных из внешней сети и включением методов POST?

Если бы я мог получить какое-либо представление об этом, я был бы чрезвычайно благодарен! Приветствия!

Ответ №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);
        }
  

Шаг 2. Установите authToken для правильной внешней сети

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

Комментарии:

1. Спасибо; У меня уже есть токены авторизации. Поскольку я не использую SDK, это не то, что я могу использовать напрямую. Я должен был упомянуть, что я использую C # для создания заголовков в словаре, который я добавляю к веб-запросу. Я не уверен, где ‘networkPermalink’ следует вставить отдельно от URL, как описано в документации; www.yammer.com /{NetworkPermalink}/{resourcePath} Я уже пытался вставить отдельный сетевой токен в заголовок «Авторизация: {NetworkToken}».

2. NetworkPermalink нужна только в URL-адресе. Если у вас есть правильный токен, предоставленный для внешней сети, как описал Питер выше, и вы используете «Авторизация на предъявителя {NetworkToken}», это должно сработать.

3. Хорошо, спасибо. Итак, я уже пробовал это (как указано в моем вопросе) и несколько альтернативных комбинаций. Несмотря на это, я продолжаю получать ответ «401 Несанкционированный» и заголовок ответа; 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   "amp;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. Теперь я разобрался с внешними сетями во всей их совокупности. Вот некоторые вещи, которые могут быть непонятны;

При выполнении запроса на публикацию или УДАЛЕНИЕ не включайте ссылку network_permaline в URL-адрес! Включайте network_permalink только при выполнении запроса GET. Это была моя главная проблема.

Требуемые заголовки запроса;

 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

Спасибо за ответы!