برنامه نویسی

آپلود اصلی فایل امن به AWS S3 در Node.js با Express و Multer

آپلود فایل ها به صورت ایمن بخش کلیدی حفاظت از داده های کاربر در هر برنامه وب است. در این وبلاگ، شما را با ایجاد یک سیستم آپلود فایل امن با استفاده از Node.js، Express، Multer و AWS S3 راهنمایی می کنیم. برای اطمینان از ایمن بودن آپلودهای شما و ایمن ماندن برنامه شما، روی بهترین شیوه ها تمرکز خواهیم کرد. این راهنما برای مبتدیانی که می‌خواهند یاد بگیرند که چگونه با آپلود فایل‌ها مدیریت کنند و امنیت را در اولویت قرار دهند، عالی است.

حالا بیایید شیرجه بزنیم

پیش نیازها

  • دانش اولیه Node.js/Javascript
  • دانش اولیه AWS و CloudFormation
  • حساب AWS. یکی را در اینجا به صورت رایگان ایجاد کنید
  • صبر

مرحله 1: تنظیم محیط

1. Node.js و npm را نصب کنید:

  • Node.js را از nodejs.org دانلود و نصب کنید.
  • تأیید نصب:
$ node -v
#v20.18.1
$ npm -v
#10.8.2
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

2. AWS CLI را نصب کنید:

  • AWS CLI را از aws.amazon.com/cli دانلود و نصب کنید.
  • AWS CLI را با اعتبار خود پیکربندی کنید:
$ aws configure
#AWS Access Key ID [****************H53C]: 
#AWS Secret Access Key [****************1CcY]: 
#Default region name [us-east-1]: 
#Default output format [json]:
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله 2: برنامه Node.js را ایجاد کنید

1. یک پروژه Node.js جدید را راه اندازی کنید:

$ mkdir node-file-upload-api
$ cd node-file-upload-api
$ npm init -y
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

2. بسته های لازم را نصب کنید:

$ npm install express aws-sdk multer dotenv uuid
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

3. فایل برنامه را ایجاد کنید (app.js):

  • ایجاد یک app.js فایل
  • کد جاوا اسکریپت زیر را اضافه کنید
  • در اینجا ما در حال ایجاد یک تابع برای ارسال یک درخواست POST برای آپلود فایل ما و ایجاد یک URL presigned برای فایل آپلود شده هستیم.
// app.js
// Import the required packages
const express = require('express');
const multer = require('multer');
const AWS = require('aws-sdk');
const { v4: uuidv4 } = require('uuid');

// Load environment variables from a .env file
require('dotenv').config();

// Create an Express application
const app = express();

// Create an S3 instance with the specified region
const s3 = new AWS.S3({ region: process.env.AWS_REGION });

// Configure Multer to save uploaded files to the 'uploads/' directory
const upload = multer({ dest: 'uploads/' });

app.post('/upload', upload.single('file'), (req, res) => {
    // Get the uploaded file from the request
    const file = req.file;
    const fileKey = `${uuidv4()}-${file.originalname}`;

    const s3Params = {
        Bucket: process.env.S3_BUCKET,
        Key: fileKey,
        Body: require('fs').createReadStream(file.path), // Create a readable stream from the uploaded file
        ContentType: file.mimetype
    };

    s3.upload(s3Params, (err, data) => {
        if (err) {
            return res.status(500).send(err);
        }

        // Generate presigned URL
        const presignedUrlParams = {
            Bucket: process.env.S3_BUCKET,
            Key: fileKey,
            Expires: 60 * 60 // URL expiration time in seconds (e.g., 1 hour)
        };

        s3.getSignedUrl('getObject', presignedUrlParams, (err, presignedUrl) => {
            if (err) {
                return res.status(500).send(err);
            }

            res.status(200).send({
                message: 'File uploaded successfully',
                url: data.Location,
                presignedUrl: presignedUrl
            });
        });
    });
});

// Start the server on port 3000
app.listen(3000, () => {
    console.log('Server running on port 3000');
});
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

4. ایجاد یک .env فایل برای متغیرهای محیطی:

  • ایجاد یک .env فایل
  • اطلاعات زیر را اضافه کنید
AWS_REGION=us-east-1
S3_BUCKET=my-node-app-bucket-382c-c803-a96a-49f1
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • مطمئن شوید که نام سطل شما منحصر به فرد است. می‌توانید از Online UUID Generator برای ایجاد یک UUID منحصربه‌فرد برای اضافه کردن به نام استفاده کنید.

مرحله 3: قالب CloudFormation را ایجاد کنید

1. فایلی به نام ایجاد کنید s3-file-upload.yml و مطالب زیر را اضافه کنید

  • ایجاد یک s3-file-upload.yml فایل
  • کد زیر را اضافه کنید
AWSTemplateFormatVersion: "2010-09-09"

Resources:
  S3Bucket:
    Type: "AWS::S3::Bucket" # Defines an S3 bucket resource
    Properties:
      BucketName: !Sub "my-node-app-bucket-382c-c803-a96a-49f1" # Sets the bucket name
      PublicAccessBlockConfiguration: # Configures public access settings for the bucket
        BlockPublicAcls: true # Blocks public ACLs
        BlockPublicPolicy: false # Allows custom bucket policies
        IgnorePublicAcls: true # Ignores public ACLs
        RestrictPublicBuckets: true # Restricts public bucket access
      VersioningConfiguration:
        Status: Enabled # Enables versioning for the bucket

  S3BucketPolicy:
    Type: "AWS::S3::BucketPolicy" # Defines a bucket policy resource
    Properties:
      Bucket: !Ref S3Bucket # References the S3 bucket created above
      PolicyDocument:
        Version: "2012-10-17" # Specifies the version of the policy language
        Statement:
          - Effect: Allow # Allows the specified actions
            Principal: "*" # Applies to all principals (users)
            Action: "s3:GetObject" # Allows the GetObject action
            Resource: !Sub "${S3Bucket.Arn}/*" # Applies to all objects in the bucket
            Condition:
              Bool:
                aws:SecureTransport: "true" # Requires requests to use HTTPS
          - Effect: Allow # Allows the specified actions
            Principal:
              AWS: !Sub "arn:aws:iam::${AWS::AccountId}:role/MyAppRole" # Allows the IAM role to access the bucket
            Action: "s3:PutObject" # Allows the PutObject action
            Resource: !Sub "${S3Bucket.Arn}/*" # Applies to all objects in the bucket

  MyAppIAMRole:
    Type: AWS::IAM::Role # Defines an IAM Role resource
    Properties:
      RoleName: MyAppRole # Assigns a name to the IAM role
      AssumeRolePolicyDocument:
        Version: "2012-10-17" # Specifies the version of the policy language
        Statement:
          - Effect: Allow # Allows the following action
            Principal:
              Service: "ec2.amazonaws.com" # Specifies that the EC2 service can assume this role
            Action: "sts:AssumeRole" # Allows EC2 instances to assume the role
      Policies:
        - PolicyName: S3AccessPolicy # Names the inline policy for the role
          PolicyDocument:
            Version: "2012-10-17" # Specifies the version of the policy language
            Statement:
              - Effect: Allow # Allows the following actions
                Action: "s3:PutObject" # Grants permission to upload objects to S3
                Resource: !Sub "${S3Bucket.Arn}/*" # Applies to all objects in the specified S3 bucket
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • در قالب CloudFormation فوق، ما در حال ایجاد یک سطل S3 با نامی هستیم که شامل شناسه حساب AWS می شود تا آن را منحصر به فرد کند. تمام دسترسی های عمومی را مسدود می کند و نسخه سازی را فعال می کند. این الگو همچنین خط‌مشی اضافه می‌کند که به هر کسی اجازه می‌دهد اشیاء را از سطل بارگیری کند، اما فقط از طریق HTTPS برای انتقال امن داده‌ها.

مرحله 4: استقرار منابع AWS با CloudFormation

1. استقرار پشته:

  • ما اکنون پشته AWS CloudFormation خود را با استفاده از فایل قالبی که در بالا ایجاد کردیم، مستقر خواهیم کرد.
$ aws cloudformation deploy --template-file s3-file-upload.yml --stack-name S3FileUploadStack --capabilities CAPABILITY_NAMED_IAM
#Waiting for changeset to be created..
#Waiting for stack create/update to complete
#Successfully created/updated stack - S3FileUploadStack
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • در اینجا به تفکیک هر بخش می پردازیم:

aws cloudformation deploy: این دستور AWS CLI برای استقرار یک پشته CloudFormation است.
--template-file s3-file-upload.yml: مسیر فایل قالب CloudFormation (s3-file-upload.yml) را مشخص می کند که منابع و تنظیمات را تعریف می کند.
--stack-name S3FileUploadStack: نام پشته CloudFormation را روی S3FileUploadStack قرار می دهد.
--capabilities CAPABILITY_NAMED_IAM: تصدیق می‌کند که پشته به منابع IAM با نام‌های سفارشی نیاز دارد، که به استقرار اجازه می‌دهد نقش‌ها و خط‌مشی‌های IAM را ایجاد یا تغییر دهد.

2. ایجاد سطل S3 را تأیید کنید:

  • پس از استقرار، وارد کنسول AWS خود شوید و تأیید کنید که سطل S3 از پشته CloudFormation تهیه شده است.

مرحله 5: برنامه Node.js خود را اجرا کنید

  • تأیید کنید که متغیرهای محیطی را در فایل .env با نام سطل S3 درست تنظیم کرده اید.
  • برنامه را شروع کنید:
$ node app.js
#Server running on port 3000
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله 6: یک فایل آپلود کنید

1. از Postman یا cURL برای ارسال درخواست POST به آن استفاده کنید http://localhost:3000/upload با یک فایل

با استفاده از پستچی

  • یک درخواست POST جدید ایجاد کنید.
  • URL را روی http://localhost:3000/upload تنظیم کنید.
  • در برگه “Body”، “form-data” را انتخاب کنید، یک فایل کلیدی اضافه کنید و یک فایل را برای آپلود انتخاب کنید.
    توضیحات تصویر

با استفاده از Curl

$ curl -F "file=@/tmp/files/test-upload.png" http://localhost:3000/upload
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

2. آدرس فایل را در پاسخ دریافت کنید که نشان دهنده آپلود موفقیت آمیز است. پاسخ در قالب زیر خواهد بود.

{
    "message": "File uploaded successfully",
    "url": "https://my-node-app-bucket-382c-c803-a96a-49f1.s3.amazonaws.com/87587526-e70b-451d-a405-ceab366016a8-test-upload.png",
    "presignedUrl": "https://my-node-app-bucket-382c-c803-a96a-49f1.s3.amazonaws.com/87587526-e70b-451d-a405-ceab366016a8-test-upload.png?AWSAccessKeyId=AKIATA6LX4GWXV6MH53C&Expires=1736370100&Signature=66dKUQRW%2F47La3MPPngITEhFE%2FA%3D"
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نتیجه گیری

در خاتمه، تسلط بر آپلودهای امن فایل در AWS S3 در Node.js با Express و Multer فراتر از عملکردهای اولیه است – نیاز به تمرکز قوی روی امنیت دارد. با ادغام Multer برای مدیریت کارآمد فایل، استفاده از ویژگی‌های امنیتی قوی AWS S3 مانند خط‌مشی‌های سطل و نشانی‌های اینترنتی تعیین‌شده، و اجرای اتصالات HTTPS، اطمینان حاصل می‌کنیم که فایل‌های آپلود شده به‌طور ایمن مدیریت و قابل دسترسی هستند. این رویکرد نه تنها از داده‌های حساس محافظت می‌کند، بلکه به جلوگیری از دسترسی غیرمجاز و آسیب‌پذیری‌های احتمالی کمک می‌کند و آن را به یک راه‌حل مطمئن و امن برای برنامه‌های کاربردی وب مدرن تبدیل می‌کند.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا