Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Slack API chat.update returns 'not_authed' error

I have a google script running as a webapp to handle the backend of a slack app.

The app has been Authenticated and I have the OAUTH token from this.

I can currently post to a channel with button actions using the chat.postMessage using the for-mentioned token.

Actions url points back at my webapp and hook in via doGet, from this response i construct a JSON object.

var response_payload = {
    "token" : access_token,
    "ts" : message_ts,
    "channel" : channel_id,
    "text" : "Approved! you are a winner!"
  })

response_url = "https://slack.com/api/chat.update";

sendToSlack_(response_url, response_payload)

posted via the following function:

function sendToSlack_(url,payload) {
   var options =  {
    "method" : "post",
    "contentType" : "application/json;charset=iso-8859-1",
    "payload" : JSON.stringify(payload)
  };
  return UrlFetchApp.fetch(url, options)
}

however returned is the following:

{"ok":false,"error":"not_authed"}

I can't find any documentation about this error other than the following

Sending JSON to Slack in a HTTP POST request

However this is in regard to a chat.postMessage request of which in my implementation is working correctly.

like image 316
Jamie Avatar asked Dec 06 '16 02:12

Jamie


2 Answers

You need to put token to header instead of json payload if using application/json. Here is doc for this.

So you request should look like this:

POST /api/chat.update HTTP/1.1
Authorization: Bearer xoxp-xxx-xxx-xxx-xxx
Content-Type: application/json;charset=UTF-8

{
    "channel": "xxx",
    "text": "Hello ~World~ Welt",
    "ts": "xxx"
}

Note: there is no token field in payload.

like image 156
Walery Strauch Avatar answered Oct 05 '22 23:10

Walery Strauch


Well according to the link your provided, Slack does not accept JSON data (weird).

Also, after playing around with their tester, Slack seems to be doing a GET request on https://slack.com/api/chat.update with query parameters attached like this:

https://slack.com/api/chat.update?token=YOUR_TOKEN&ts=YOUR_TIME&channel=YOUR_CHANNEL&text=YOUR_TEXT_URL_ENCODED&pretty=1

So use this code:

var response_payload = {
    "token" : access_token,
    "ts" : message_ts,
    "channel" : channel_id,
    "text" : "Approved! you are a winner!"
  }


function httpGet(theUrl)
{
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.open( "GET", theUrl, false ); // false for synchronous request
    xmlHttp.send( null );
    return xmlHttp.responseText;
}

response_url = encodeURI("https://slack.com/api/chat.update?token=" + response_payload['token'] + 
"&ts=" + response_payload['ts'] + "&channel=" + response_payload['channel'] + "&text=" + response_payload['text'] +"&pretty=1");

httpGet(response_url);
like image 20
Apoorv Kansal Avatar answered Oct 05 '22 22:10

Apoorv Kansal