Apa itu AWS Cognito
Amazon Cognito adalah layanan yang disediakan oleh AWS yang memungkinkan Anda untuk mengimplementasikan otentikasi pengguna di web dan aplikasi seluler Anda. Cognito mendukung otentikasi, otorisasi, dan manajemen pengguna, yang memungkinkan pengguna untuk masuk dengan nama pengguna dan kata sandi, atau login sosial melalui pihak ketiga seperti Google, Apple, dan lainnya.
Fitur Cognito
Amazon Cognito memiliki dua komponen utama: kolam pengguna dan kolam identitas.
Kolam Pengguna
Cogito adalah layanan yang dikelola sepenuhnya, sehingga dapat diimplementasikan tanpa kesadaran infrastruktur. Cogito adalah layanan yang dikelola sepenuhnya, sehingga dapat diimplementasikan tanpa kesadaran infrastruktur. User pool menyediakan fungsi-fungsi berikut
- Layanan daftar dan masuk
- UI web bawaan yang dapat disesuaikan untuk pengguna masuk
- Masuk sosial dengan Facebook, Google, Login with Amazon, dan Masuk dengan Apple, dan melalui penyedia identitas SAML dan OIDC dari kolam pengguna Anda
- Manajemen direktori pengguna dan profil pengguna
- Fitur keamanan seperti autentikasi multi-faktor (MFA), pemeriksaan kredensial yang dikompromikan, perlindungan pengambilalihan akun, dan verifikasi telepon dan email
- Alur kerja yang disesuaikan dan migrasi pengguna melalui pemicu AWS Lambda
Kolam Identitas
Identity Pools adalah tambahan untuk kolam pengguna Amazon Cognito dan memberikan "otorisasi" untuk setiap layanan AWS, seperti Amazon S3 dan DynamoDB, saat bekerja dengan penyedia identitas eksternal. Pengguna dapat memperoleh kredensial AWS sementara untuk mengakses layanan AWS lainnya, dan kolam identitas mendukung pengguna tamu anonim dan penyedia identitas berikut yang dapat digunakan untuk mengautentikasi pengguna kolam identitas
- Kolam pengguna Amazon Cognito
- Masuk sosial dengan Facebook, Google, Login with Amazon, dan Masuk dengan Apple
- Penyedia OpenID Connect (OIDC)
- Penyedia identitas SAML
- Identitas diautentikasi developer
Perhatikan bahwa kolam identitas harus digabungkan dengan kolam pengguna untuk menyimpan informasi profil pengguna.
Perbedaan antara kolam pengguna dan kolam identitas
Perbedaannya adalah bahwa user pool menangani "otentikasi" sementara identity pool menangani "otorisasi". Otentikasi adalah proses menentukan siapa pengguna yang mengakses. Otorisasi, di sisi lain, adalah proses menentukan apakah pengguna diizinkan untuk menggunakan layanan setelah otentikasi.
Harga Cognito
AWS Cognito mengenakan biaya berdasarkan pengguna aktif bulanan (MAU). Jika pendaftaran, masuk, pembaruan token, perubahan kata sandi, atau operasi lain terjadi selama sebulan, pengguna dihitung sebagai MAU. Namun, kolam pengguna Cognito memiliki jatah gratis 50.000 MAU per bulan. Di bawah ini adalah struktur harga untuk wilayah Tokyo.
Tingkat Harga (MAU) | Harga per MAU |
---|---|
50.001-100.000 (setelah 50.000 tingkat gratis) | 0.0055USD |
900.000 berikutnya | 0.0046USD |
9.000.000 berikutnya | 0.00325USD |
Lebih dari 10.000.000 | 0.0025USD |
Kode implementasi Cognito
Berikut adalah kode untuk membangun bagian infrastruktur Cognito dengan Terraform dan bagian logika dengan Python. Kali ini, kita akan membuat Cognito tanpa atribut khusus, masuk dengan alamat email dan kata sandi.
Infrastruktur di Terraform
Kode untuk terraform adalah sebagai berikut
resource "aws_cognito_user_pool" "main" {
name = "cognito-demo-pool"
username_attributes = ["email"]
username_configuration {
case_sensitive = true
}
auto_verified_attributes = ["email"]
password_policy {
minimum_length = 8
require_lowercase = false
require_uppercase = false
require_numbers = false
require_symbols = false
temporary_password_validity_days = 7
}
mfa_configuration = "OFF"
admin_create_user_config {
allow_admin_create_user_only = false
}
account_recovery_setting {
recovery_mechanism {
name = "verified_email"
priority = 1
}
}
}
resource "aws_cognito_user_pool_domain" "main" {
domain = "cognito-demo-pool"
user_pool_id = aws_cognito_user_pool.main.id
}
resource "aws_cognito_user_pool_client" "main" {
name = "cognito-demo-pool-client"
user_pool_id = aws_cognito_user_pool.main.id
generate_secret = false
explicit_auth_flows = [
"ALLOW_USER_PASSWORD_AUTH",
"ALLOW_USER_SRP_AUTH",
"ALLOW_REFRESH_TOKEN_AUTH"
]
prevent_user_existence_errors = "ENABLED"
}
Logika dalam Python
Untuk mengimplementasikan logika dalam Python, Anda perlu menginstal library yang disebut boto3.
$ pip install boto3
Kemudian, buat klien Cognito dengan yang berikut ini di awal kode sumber
import boto3
sess = boto3.Session()
client = sess.client(
"cognito-idp",
region_name="ap-northeast-1",
)
Buat Pengguna Baru
Buat pengguna baru. Kata sandi sementara akan dikirim ke alamat email.
def admin_create_user(email: str):
user_attributes = [
{"Name": "email_verified", "Value": "true"},
{"Name": "email", "Value": email},
]
client.admin_create_user(
UserPoolId=POOL_ID,
Username=email,
UserAttributes=user_attributes,
ForceAliasCreation=False,
DesiredDeliveryMediums=["EMAIL"],
)
Masuk
Membuat pengguna baru. Jika ini adalah pertama kalinya masuk, sesi akan dikembalikan, jika tidak, token akan dikembalikan untuk otentikasi.
def user_password_auth(email: str, password: str):
resp = client.initiate_auth(
ClientId=CLIENT_ID,
AuthFlow="USER_PASSWORD_AUTH",
AuthParameters={"USERNAME": email, "PASSWORD": password},
)
if bool(resp["ChallengeParameters"]):
return {"session": resp["Session"]}
else:
return {
"id_token": resp["AuthenticationResult"]["IdToken"],
"access_token": resp["AuthenticationResult"]["AccessToken"],
"refresh_token": resp["AuthenticationResult"]["RefreshToken"],
}
Ubah kata sandi saat pertama kali masuk
Masuk dengan sesi dan kata sandi baru saat pertama kali Anda masuk. Token akan dikembalikan.
def new_password_required(email: str, new_password: str, session: str):
resp = client.respond_to_auth_challenge(
ClientId=CLIENT_ID,
Session=session,
ChallengeName="NEW_PASSWORD_REQUIRED",
ChallengeResponses={"USERNAME": email, "NEW_PASSWORD": new_password},
)
return {
"id_token": resp["AuthenticationResult"]["IdToken"],
"access_token": resp["AuthenticationResult"]["AccessToken"],
"refresh_token": resp["AuthenticationResult"]["RefreshToken"],
}
Menerbitkan kembali Token dari Refresh Token
Menerbitkan kembali akses dan token identitas dari token penyegaran.
def refresh_token_auth(refresh_token: str):
resp = client.initiate_auth(
ClientId=CLIENT_ID,
AuthFlow="REFRESH_TOKEN_AUTH",
AuthParameters={"REFRESH_TOKEN": refresh_token},
)
return {
"id_token": resp["AuthenticationResult"]["IdToken"],
"access_token": resp["AuthenticationResult"]["AccessToken"],
}
Ubah Kata Sandi
Ubah kata sandi.
def change_password(password: str, new_password: str, access_token: str):
"""Change password"""
client.change_password(
PreviousPassword=password,
ProposedPassword=new_password,
AccessToken=access_token,
)
Kirim kode konfirmasi untuk mengubah kata sandi
Kode konfirmasi akan dikirim ke alamat email Anda untuk mengatur ulang kata sandi Anda.
def forgot_password(email: str) -> None:
client.forgot_password(
ClientId=CLIENT_ID,
Username=email
)
Atur Ulang Kata Sandi
Tetapkan kata sandi baru menggunakan kode konfirmasi.
def confirm_forgot_password(email: str, password: str, code: str) -> None:
client.confirm_forgot_password(
ClientId=CLIENT_ID,
Username=email,
Password=password,
ConfirmationCode=code
)
Referensi