Xác thực Website React
Generator Xác thực Website React thêm xác thực vào website React của bạn bằng cách sử dụng Amazon Cognito.
Generator này cấu hình cơ sở hạ tầng CDK hoặc Terraform để tạo Cognito User Pool và Identity Pool liên quan, cũng như một hosted UI để xử lý các luồng đăng nhập người dùng, và tích hợp nó với website React của bạn.
Cách sử dụng
Phần tiêu đề “Cách sử dụng”Thêm Xác thực vào Website React của bạn
Phần tiêu đề “Thêm Xác thực vào Website React của bạn”Bạn có thể thêm xác thực vào website React của mình theo hai cách:
pnpm nx g @aws/nx-plugin:ts#website#authyarn nx g @aws/nx-plugin:ts#website#authnpx nx g @aws/nx-plugin:ts#website#authbunx nx g @aws/nx-plugin:ts#website#authBạn cũng có thể thực hiện chạy thử để xem những tệp nào sẽ bị thay đổi
pnpm nx g @aws/nx-plugin:ts#website#auth --dry-runyarn nx g @aws/nx-plugin:ts#website#auth --dry-runnpx nx g @aws/nx-plugin:ts#website#auth --dry-runbunx nx g @aws/nx-plugin:ts#website#auth --dry-run- Cài đặt Nx Console VSCode Plugin nếu bạn chưa cài đặt
- Mở Nx Console trong VSCode
- Nhấp
Generate (UI)trong phần "Common Nx Commands" - Tìm kiếm
@aws/nx-plugin - ts#website#auth - Điền các tham số bắt buộc
- Nhấp
Generate
Tùy chọn
Phần tiêu đề “Tùy chọn”| Tham số | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
| project Bắt buộc | string | - | Thư mục gốc của website. |
| cognitoDomain | string | - | Tiền tố domain Cognito sẽ sử dụng. Nếu bỏ qua, giá trị sẽ được lấy từ npm scope và tên dự án website. |
| allowSignup | boolean | Có cho phép tự đăng ký hay không | |
| iac | inherit | cdk | terraform | inherit | Nhà cung cấp IaC ưa thích. Mặc định giá trị này được kế thừa từ lựa chọn ban đầu của bạn. |
| preferInstallDependencies | boolean | true | Có nên cài đặt các dependencies sau khi generator chạy hay không. Đặt thành false để hoãn việc cài đặt khi chạy nhiều generator liên tiếp (việc cài đặt vẫn sẽ chạy nếu cần thiết để các generator tiếp theo có thể tính toán Nx project graph); cài đặt một lần vào cuối. |
Kết quả của Generator
Phần tiêu đề “Kết quả của Generator”Bạn sẽ tìm thấy các thay đổi sau trong website React của mình:
Thư mụcsrc
Thư mụccomponents
Thư mụcCognitoAuth
- index.tsx Main authentication component
- main.tsx Updated to instrument the CognitoAuth component
Cơ sở hạ tầng
Phần tiêu đề “Cơ sở hạ tầng”Vì generator này cung cấp infrastructure as code dựa trên iac bạn đã chọn, nó sẽ tạo một dự án trong packages/common bao gồm các CDK constructs hoặc Terraform modules liên quan.
Dự án infrastructure as code chung được cấu trúc như sau:
Thư mụcpackages/common/constructs
Thư mụcsrc
Thư mụcapp/ Constructs for infrastructure specific to a project/generator
- …
Thư mụccore/ Generic constructs which are reused by constructs in
app- …
- index.ts Entry point exporting constructs from
app
- project.json Project build targets and configuration
Thư mụcpackages/common/terraform
Thư mụcsrc
Thư mụcapp/ Terraform modules for infrastructure specific to a project/generator
- …
Thư mụccore/ Generic modules which are reused by modules in
app- …
- project.json Project build targets and configuration
Bạn cũng sẽ tìm thấy mã cơ sở hạ tầng sau được tạo dựa trên iac bạn đã chọn:
Thư mụcpackages/common/constructs/src
Thư mụccore
- user-identity.ts Construct which defines the user pool and identity pool
Thư mụcpackages/common/terraform/src
Thư mụccore
Thư mụcuser-identity
- main.tf Module wrapper for the identity configuration
Thư mụcidentity
- identity.tf Core identity infrastructure including Cognito User Pool and Identity Pool
Thư mụcadd-callback-url
- add-callback-url.tf Module for adding callback URLs to existing user pool clients
Kiến trúc
Phần tiêu đề “Kiến trúc”Generator này thêm một Amazon Cognito user pool (để đăng nhập) và một identity pool (để liên kết người dùng đã đăng nhập với thông tin xác thực IAM có phạm vi) vào kiến trúc static-website hiện có:
Bảo vệ khỏi mối đe dọa
Phần tiêu đề “Bảo vệ khỏi mối đe dọa”User Pool được tạo trên gói tính năng Plus của Cognito với bảo vệ khỏi mối đe dọa được đặt ở chế độ AUDIT cho xác thực tiêu chuẩn. Ở chế độ kiểm toán, Cognito gán một mức độ rủi ro cho mỗi lần đăng nhập và ghi lại đánh giá vào CloudWatch mà không chặn người dùng.
Sau khi bạn đã quan sát các đánh giá rủi ro cho người dùng của mình, bạn có thể chuyển sang chế độ thực thi đầy đủ chức năng để tự động phản hồi hoạt động rủi ro (ví dụ: yêu cầu MFA hoặc chặn đăng nhập):
Đặt standardThreatProtectionMode thành StandardThreatProtectionMode.FULL_FUNCTION trong packages/common/constructs/src/core/user-identity.ts.
Đặt advanced_security_mode thành ENFORCED trong khối user_pool_add_ons trong packages/common/terraform/src/core/user-identity/identity/identity.tf.
Xác thực đa yếu tố (MFA)
Phần tiêu đề “Xác thực đa yếu tố (MFA)”Theo mặc định, người dùng phải cấu hình MFA (mã SMS hoặc mật khẩu một lần dựa trên thời gian) trước khi họ có thể đăng nhập. Bạn có thể làm cho MFA là tùy chọn, tắt hoàn toàn hoặc hạn chế các phương thức yếu tố thứ hai có sẵn:
import { Mfa } from 'aws-cdk-lib/aws-cognito';
new UserIdentity(this, 'Identity', { mfa: Mfa.OPTIONAL, mfaSecondFactor: { sms: false, otp: true },});mfa chấp nhận Mfa.OFF / Mfa.OPTIONAL / Mfa.REQUIRED. mfaSecondFactor.sms và mfaSecondFactor.otp bật hoặc tắt từng phương thức yếu tố thứ hai một cách độc lập; chúng không có hiệu lực khi mfa là Mfa.OFF. Đặt mfa: Mfa.REQUIRED với cả hai phương thức bị vô hiệu hóa sẽ bị từ chối tại thời điểm synth, vì không ai có thể hoàn thành đăng nhập.
module "user_identity" { source = "../../common/terraform/src/core/user-identity"
mfa = "OPTIONAL" mfa_second_factor_sms = false mfa_second_factor_otp = true}mfa chấp nhận "OFF" / "OPTIONAL" / "ON". mfa_second_factor_sms và mfa_second_factor_otp bật hoặc tắt từng phương thức yếu tố thứ hai một cách độc lập; chúng không có hiệu lực khi mfa là "OFF".
Web Application Firewall (WAF)
Phần tiêu đề “Web Application Firewall (WAF)”Theo mặc định, User Pool được liên kết với một AWS WAFv2 Web ACL sử dụng các nhóm quy tắc được quản lý AWSManagedRulesCommonRuleSet và AWSManagedRulesKnownBadInputsRuleSet. Bạn có thể vô hiệu hóa điều này nếu muốn quản lý Web ACL của riêng mình hoặc không yêu cầu:
new UserIdentity(this, 'Identity', { enableWaf: false });module "user_identity" { source = "../../common/terraform/src/core/user-identity"
enable_waf = false}Sử dụng Cơ sở hạ tầng
Phần tiêu đề “Sử dụng Cơ sở hạ tầng”Bạn sẽ cần thêm cơ sở hạ tầng user identity vào stack của mình, khai báo nó trước website:
import { Stack } from 'aws-cdk-lib';import { Construct } from 'constructs';import { MyWebsite, UserIdentity } from '@my-scope/common-constructs';
export class ApplicationStack extends Stack { constructor(scope: Construct, id: string) { super(scope, id);
new UserIdentity(this, 'Identity');
new MyWebsite(this, 'MyWebsite'); }}Construct UserIdentity tự động thêm Runtime Configuration cần thiết để đảm bảo rằng website của bạn có thể trỏ đến Cognito User Pool chính xác để xác thực.
Bạn sẽ cần thêm module user identity và đảm bảo website của bạn phụ thuộc vào nó:
# Deploy user identity first to add to runtime configmodule "user_identity" { source = "../../common/terraform/src/core/user-identity"}
# Deploy website after identity to include runtime configmodule "my_website" { source = "../../common/terraform/src/app/static-websites/my-website"
providers = { aws.us_east_1 = aws.us_east_1 }
# Ensure identity is deployed first to add to runtime config depends_on = [module.user_identity]}Module user identity tự động thêm Runtime Configuration cần thiết để đảm bảo rằng website của bạn có thể trỏ đến Cognito User Pool chính xác để xác thực.
Cấp quyền truy cập cho Người dùng đã xác thực
Phần tiêu đề “Cấp quyền truy cập cho Người dùng đã xác thực”Để cấp cho người dùng đã xác thực quyền truy cập để thực hiện các hành động nhất định, chẳng hạn như cấp quyền gọi API, bạn có thể thêm các câu lệnh chính sách IAM vào vai trò đã xác thực của identity pool:
import { Stack } from 'aws-cdk-lib';import { Construct } from 'constructs';import { MyWebsite, UserIdentity, MyApi } from '@my-scope/common-constructs';
export class ApplicationStack extends Stack { constructor(scope: Construct, id: string) { super(scope, id);
const identity = new UserIdentity(this, 'Identity'); const api = new MyApi(this, 'MyApi', { integrations: MyApi.defaultIntegrations(this).build(), });
api.grantInvokeAccess(identity.identityPool.authenticatedRole);
new MyWebsite(this, 'MyWebsite'); }}module "user_identity" { source = "../../common/terraform/src/core/user-identity"}
module "asset_bucket" { source = "../../common/terraform/src/core/asset-bucket"}
module "my_api" { source = "../../common/terraform/src/app/apis/my-api"
asset_bucket_name = module.asset_bucket.bucket_name}
# Add permissions for authenticated users to invoke Fast APIresource "aws_iam_role_policy" "authenticated_fast_api_invoke" { name = "authenticated-user-invoke-my-api" role = module.user_identity.authenticated_role_name
policy = jsonencode({ Version = "2012-10-17" Statement = [ { Effect = "Allow" Action = [ "execute-api:Invoke" ] Resource = "${module.my_api.api_execution_arn}/*" } ] })}