无法对Slack API进行新的请求验证

时间:2018-07-19 15:04:06

标签: aws-lambda aws-api-gateway slack slack-api

我正在尝试对AWS Lambda上的Slack API进行新的请求验证过程,但无法从请求中产生有效的签名。

  1. https://api.slack.com/docs/verifying-requests-from-slack中显示的示例用于斜杠命令,但我用于事件订阅,尤其是对机器人事件(app_mention)的订阅。 新流程也支持事件订阅吗?

  2. 如果是这样,我想念什么吗?

API网关中用于集成请求的映射模板。松弛的文档说,我无法收到原始请求,但我做到了最好,就像这样:

{
  "body" : $input.body,
  "headers": {
    #foreach($param in $input.params().header.keySet())
    "$param": "$util.escapeJavaScript($input.params().header.get($param))" #if($foreach.hasNext),#end

    #end  
  }
}

我的验证功能

def is_valid_request(headers, body):
   logger.info(f"DECODED_SECRET: {DECODED_SECRET}")
   logger.info(f"DECRYPTED_SECRET: {DECRYPTED_SECRET}")

   timestamp   = headers.get(REQ_KEYS['timestamp'])
   logger.info(f"timestamp: {timestamp}")

   encoded_body = urlencode(body)
   logger.info(f"encoded_body: {encoded_body}")

   base_str    = f"{SLACK_API_VER}:{timestamp}:{encoded_body}"
   logger.info(f"base_str: {base_str}")

   base_b      = bytes(base_str, 'utf-8')
   dgst_str    = hmac.new(DECRYPTED_SECRET, base_b, digestmod=sha256).hexdigest()

   sig_str     = f"{SLACK_API_VER}={dgst_str}"
   logger.info(f"signature: {sig_str}")

   req_sig = headers.get(REQ_KEYS['sig'])
   logger.info(f"req_sig: {req_sig}")

   logger.info(f"comparing: {hmac.compare_digest(sig_str, req_sig)}")
   return hmac.compare_digest(sig_str, req_sig)

Lambda登录CloudWatch。出于安全原因,我无法显示这些值,但似乎每个变量/常量都有一个合理的值:

DECODED_SECRET: ...
DECRYPTED_SECRET: ...
timestamp: 1532011621
encoded_body: ...
base_str: v0:1532011621:token= ... &team_id= ... &api_app_id= ...
signature: v0=3 ...
req_sig: v0=1 ...
comparing: False

signature应该与req_sig匹配,但是不匹配。我猜base_str = f"{SLACK_API_VER}:{timestamp}:{encoded_body}"出问题了。我的意思是请求主体的隐式或urlencoding,但我不确定。预先谢谢你!

0 个答案:

没有答案