#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
Спасибо за ответы!