[AWS] Sử dụng API Gateway Lambda Authorizers với JWT như thế nào?

by Hieu Nguyen
1.1K views

Một trọng những vấn đề quan trọng trong các dự án đó là điều khiển quyền truy cập. Với các ứng dụng xây dựng trên nền tảng AWS việc điều khiển truy cập cũng phức tạp hơn. Trong bài viết này tôi sẽ hướng dẫn các bạn cách tôi đã làm để điểu khiển truy cập với các API sử dụng API Gateway Lambda Authorizers.

Luồng xác thực Lambda Authorizer

Luồng xác thực của Lambda Authorizer được minh hoạ trong hình sau:

auhorizer

Các bược xác thực như sau:

  1. Máy khách gửi yêu cầu lên API Gateway API có kèm theo Bearer Token.
  2. API Gateway kiểm tra cấu hình authorizer đã được cấu hình tương ứng với hàm Lambda. Nếu nó tồn tại thì Lambda Authoirizer sẽ được gọi.
  3. Lambda Authorizer sẽ thực hiện xác thực bằng Bearer Token đã được gửi lên.
  4. Nếu việc gọi Lambda Authrorizer thực hiện thành công, hàm Lambda sẽ trả về thông tin chứa chính sách IAM và thông tin người dùng.
  5. API Gateway sử dụng thông tin trả về từ Lambda Authorizer để kiểm tra quyền truy cập:
  • Trường hợp nhận được thông tin từ chối truy cập thì API Gateway sẽ trả về mã 403 và từ chối truy cập tới API từ máy khách.
  • Trường hợp nhận được thôn tin cho phép truy cập thì phương thức sẽ được thực thi.

Định nghĩa Lambda Authorizer

  • Khai báo authorizer trong serverless.yml:
functions:
  authorizer:
    handler: src.api.authorizer.lambda_handler
    cors: true
  • Định nghĩa hàm Lambda Authorizer:
import jwt


def lambda_handler(event, context):
    try:
        token = event.get("authorizationToken").split(" ")[1] # lấy thông tin token trong Authorization header
        claims = jwt.decode(token, "secret", algorithms=["HS256"]) # decode xem token có hợp lệ không
        return {
            "principalId": claims["uid"], # lấy thông tin user đề gán vào IAM
            "policyDocument": {
                "Version": "2012-10-17",
                "Statement": [
                    {
                        "Action": "execute-api:Invoke",
                        "Effect": "Allow", # cho phép nếu token hợp lệ
                        "Resource": event["methodArn"],
                    }
                ],
            },
        }
    except:
        return {
            "principalId": "denied",
            "policyDocument": {
                "Version": "2012-10-17",
                "Statement": [
                    {
                        "Action": "execute-api:Invoke",
                        "Effect": "Deny", # từ chối nếu token không hợp lệ
                        "Resource": event["methodArn"],
                    }
                ],
            },
        }

Định nghĩa hàm Lambda cần điều khiển quyề truy cập

  • Khai báo hàm Lambda trong serverless.yml
functions:
  test:
    handler: src.api.test.lambda_handler
    events:
      - http:
          method: get
          path: api/test
          cors: true
          authorizer: authorizer # khai báo Lambda Authorizer
  • Định nghĩa hàm Lambda:
import json


def lambda_handler(event, context):
    headers = {"Access-Control-Allow-Origin": "*", "Accept": "application/json"}
    body = {"status": "success"}
    return {
        "statusCode": 200,
        "headers": headers,
        "body": json.dumps(body),
    }

Test thử Lambda với Authorizer

  • Trường hợp không truyền token trên Authorizer Header, API Gateway sẽ trả về 403

No Auth

  • Trường hợp có truyền token trên Authorization Header, API Gateway sẽ cho phép phương thức được thực thi

Token được tạo như sau

(zpn) hieunv@HieuNV lambda % python
Python 3.7.7 (default, Mar 10 2020, 15:43:33)
[Clang 11.0.0 (clang-1100.0.33.17)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import jwt
>>> jwt.encode({'uid': 'hieunv'}, "secret", algorithm='HS256')
b'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiJoaWV1bnYifQ.xuZSlS_3lw6NvGvw_fQ2qXGBWiv2HpXTFtYtO85lQac'

Truyền token lên Authorizer Header

Bearer Auth

Tài liệu tham khảo:

Cám ơn các bạn đã theo dõi bài viết. Hy vọng bài viết có thể giúp các bạn cài đặt việc điều khiển truy cập dễ dàng hơn với các ứng dụng trên nền tảng AWS.

Leave a Comment

* By using this form you agree with the storage and handling of your data by this website.

You may also like