CORS là gì và ứng dụng trong aws lambda như thế nào ?

 

CORS viết tắt bởi từ Cross-Origin Resource Sharing là kỹ thuật HTTP header  của một server cho biết các thông tin tên miền, cổng và giao thức (schema - http hay https ) từ một trình duyệt khách cho phép truy cập vào tài nguyên. 

Ở dây thông thường là cho phép truy cập vào một API nào đó. 

Ví dụ: Javascript trên domain-a.com truy cập đến domain-b.com



Trong trường hợp này việc truy cập tới domain-b.com bị giới hạn vì việc truy cập này cần phải khai báo CORS. 

Một request sử dụng kỹ thuật CORS như thế nào ? 

Có 2 loại request áp dụng kỹ thuật này:

1. simple request: 

Như tên gọi của nó thì simple request là một request đơn giản được sử dụng trong các method sau ; 

GET 
POST
HEAD

Content-type header trong simple request chỉ cho phép các giá trị sau: 


  • application/x-www-form-urlencoded
  • multipart/form-data
  • text/plain


Ví dụ cho một request áp dụng kỹ thuật simple request CORS như sau: 

const xhr = new XMLHttpRequest();
const url = 'https://bar.other/resources/public-data/';

xhr.open('GET', url);
xhr.onreadystatechange = someHandler;
xhr.send();
Trong đó schema là : https , domain là : bar.other và resource là : /resources/public-data/



Trong kỹ thuật này chỉ cần một request duy nhất là có thể retrieve nội dung cần mong muốn. 

Và phía server phải khai báo : 

Access-Control-Allow-Origin: *
*: any origin 

Ví dụ : ta muốn giới hạn truy cập vào tài nguyên thì  khai báo: 

Access-Control-Allow-Origin: https://foo.example
việc truy cập bị giới hạn từ client có domain : foo.example 

2. Preflighted requests

Không giống như simple request ở trên Preflighted request sẽ gửi một request có method là : OPTIONS đầu tiên để thăm dò xem là request có an toàn hay không ? 

Ví dụ một request sử dũng Preflighted như sau: 

const xhr = new XMLHttpRequest();
xhr.open('POST', 'https://bar.other/resources/post-here/');
xhr.setRequestHeader('X-PINGOTHER', 'pingpong');
xhr.setRequestHeader('Content-Type', 'application/xml');
xhr.onreadystatechange = handler;
xhr.send('<person><name>Arun</name></person>');
Request gửi một body với phương thức POST và custom header là : X-PINGOTHER, nên nó không phải là một phần của HTTP/1.1 

Và giá trị của content-type là : application/xml 

Nên request này là Preflighted 



Request đầu tiên với phương thức OPTIONS và Access-control-request-header: X-PINGOTHER, Content-type: application/xml

CORS in aws lambda function. 

Trong trường hợp API gateway của bạn sử dụng lambda proxy integration hay HTTP poxy integration thì bạn phải define CORS trong code. 

Lambda sẽ chịu trách nhiệm response cho phần Access-Control-Allow-Origin and Access-Control-Allow-Headers bởi vì proxy integration sẽ không trả về integration response. 

Node.JS

exports.handler = async (event) => {
    const response = {
        statusCode: 200,
        headers: {
            "Access-Control-Allow-Headers" : "Content-Type",
            "Access-Control-Allow-Origin": "https://www.example.com",
            "Access-Control-Allow-Methods": "OPTIONS,POST,GET"
        },
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};


Trong python:

import json def lambda_handler(event, context): return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': 'Content-Type', 'Access-Control-Allow-Origin': 'https://www.example.com', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET' }, 'body': json.dumps('Hello from Lambda!') }


Java

// new respose class, replace for your class - ResponseClass
public class Response {
private int statusCode; // http status code
private Map<String, String> headers; // headers
private String body; // body - what you want to return to client
public Response(int statusCode, Map<String, String> headers, String body) {
this.statusCode = statusCode;
this.headers = headers;
this.body = body;
}
public int getStatusCode() {
return statusCode;
}
public Map<String, String> getHeaders() {
return headers;
}
public String getBody() {
return body;
}
public void setStatusCode(int statusCode) {
this.statusCode = statusCode;
}
public void setHeaders(Map<String, String> headers) {
this.headers = headers;
}
public void setBody(String body) {
this.body = body;
} }
/// -------------
package lambda;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import lambda.axon.Path;
public class shortestPath implements RequestHandler<RequestClass, Response>{
public Response handleRequest(RequestClass request, Context context){
String inputString = request.inputString;
int steps = Path.stepsTo(inputString);
Map<String, String> headers = new HashMap<>();
headers.put(Access-Control-Allow-Origin, "*"); // cors header, you can add another header fields
return new Response(200, headers, "" + steps);
// return new Response(200, headers, "{result: " + steps + "}");
// simple json response. ex: {result: '3433"}
}
}




            





Nhận xét

Bài đăng phổ biến từ blog này

Trang web medium.com chết, vì sao ?

Cách sử dụng sys.argv trong python.

Thiết kế một RESTful API bằng python và flask.