Traffine I/O

Bahasa Indonesia

2022-10-16

Cara menggunakan AWS Cognito

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

https://docs.aws.amazon.com/cognito/latest/developerguide/what-is-amazon-cognito.html
https://aws.amazon.com/cognito/pricing/?nc1=h_ls
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cognito_user_pool
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/cognito-idp.html

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!