[Serverless][Part-3] Phần 3: Verify token của slack và lấy thông tin team

Spread the love

# [Serverless][Part-3] Phần 3: Verify token của slack và lấy thông tin team

Tiếp theo phần trước, sau khi chúng ta đã pass được phần validate của slack. Phần này chúng ta sẽ thực hiện những xử lý bên dưới * Verify token do slack gửi đến

Verify Token do Slack gửi đến

Giả sử hàm events của chúng ta nếu không có một cơ chế nào để bảo vệ thì có thể cuối tháng chúng ta sẽ ngất ngây với billing của AWS gửi về. Và bên dưới là cách để bảo vệ endpoint của chúng ta không bị gọi bởi một bên thứ 3 mà không được sự cho phép

  • Với mỗi application tạo với slack, slack sẽ tạo ra một Verification Token ( dùng để verify request đến từ slack, tuy nhiên hiện nay thì Slack đang khuyến cáo người dùng chuyển qua sử dụng Signed Request – theo như hình )

  • Khi Slack gọi đến API endpoint của chúng ta (ở đây là hàm events) chúng ta sẽ validate verification token có match với validation token chúng ta đã đăng kí trong biến môi trường của AWS Lambda không. Chúng ta sẽ phải sửa 2 chỗ

    • events.js : thêm hàm verifyToken
    • serverless.yml : chúng ta cần thêm biến môi trường cho Lambda, ở đây chính là verification token của slack

Sửa hàm events để validate verification token từ slack

Chúng ta sửa lại file events như bên dưới

// Get JUST the Slack event.
const getSlackEvent = event => ({ slack: JSON.parse(event.body) });

// Keep Slack happy by reponding to the event.
const respond = callback => (event) => {
  const response = { statusCode: 200 };
  if (event.slack.type === 'url_verification') {
    response.body = event.slack.challenge;
  }
  callback(null, response);
  return event;
};

// Verify the token matches ours.
const verifyToken = (event) => {
  if (event.slack.token !== process.env.VERIFICATION_TOKEN) {
    throw new Error('InvalidToken');
  }
  return event;
};

module.exports.handler = (event, context, callback) =>
  Promise.resolve(event) // Start the promise chain
    .then(getSlackEvent) // Get just the Slack event payload
    .then(respond(callback)) // Respond OK to Slack
    .then(verifyToken) 
    .catch(callback);

Ok. Chúng ta thấy chúng ta sẽ có thêm hàm verifyToken và việc xử lý nó như bên dưới:

// Verify the token matches ours.
const verifyToken = (event) => {
  if (event.slack.token !== process.env.VERIFICATION_TOKEN) {
    throw new Error('InvalidToken');
  }
  return event;
};

Chúng ta so sánh slack.token nằm bên trong object request, với biến môi trường của process env.VERIFICATION_TOKEN . Tiếp theo chúng ta sẽ thêm khai báo cho biến môi trường VERIFICATION_TOKEN nằm trong file serverless.yml

  environment:
    CLIENT_ID: '141688652678.141098631428'
    CLIENT_SECRET: 48e88bba4aef0b84a862b8d35ca4e31d
    VERIFICATION_TOKEN: l9aFfdi0vqgAXRvrEqvMByGp
    INSTALL_ERROR_URL: http://serverlessslackbot.s3-website-us-east-1.amazonaws.com/#error
    INSTALL_SUCCESS_URL: http://serverlessslackbot.s3-website-us-east-1.amazonaws.com/#success
    NAMESPACE: ${self:custom.namespace}
    TEAMS_TABLE: ${self:custom.namespace}-teams
  iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:GetItem
        - dynamodb:PutItem
      Resource:
        - arn:aws:dynamodb:*:*:table/${self:provider.environment.TEAMS_TABLE}

Chúng ta thêm biến VERIFICATION_TOKEN vào trong block environment, và như thế là đã hoàn tất, chúng ta có thể deploy lên AWS Lambda bằng câu lệnh sls deploy

Ở phần tiếp theo mình sẽ nói về việc “Lấy thông tin team từ DynamoDB” Trong DynamoDB có lưu thông tin team cũng như thông tin về access_token của bot user, do đó để có thể tương tác được với channel của người dùng, ta cần phải kết nối đến DynamoDB thông qua AWS SDK.

Series Navigation<< [Serverless][Part-3] Phần 3: Subscribe vào event bằng Slack

Leave a Reply

Your email address will not be published. Required fields are marked *