Mendapatkan nama pengguna kumpulan pengguna cognito dari kumpulan identitas cognito identitas ID

10

Saya menggunakan Kelompok Pengguna AWS Congito untuk manajemen akun dengan Kelompok Identitas Cognito yang menjadikan Kelompok Pengguna ini sebagai Penyedia Identitas. Saya menggunakan ini untuk mengontrol akses ke API melalui API Gateway yang mengirimkan permintaan ke Lambda. Lambda saya diimplementasikan dengan Java 8 menggunakan Micronaut. Semua ini bekerja dengan baik.

Di Lambda, saya mendapatkan nama dari Principaldalam HttpRequest:

  protected String resolveUser( HttpRequest request ){
    String ret = null;

    Optional<Principal> principal = request.getUserPrincipal();
    if( principal.isPresent() ){
      ret = principal.get().getName();
    }

    if( ret == null || ret.length() == 0 ){
      ret = "unknown";
    }
    return ret;
  }

Apa yang akan muncul kembali dalam nama string dari Cognito identityId. Sesuatu seperti ini:

us-east-1: xxxxe650-53f4-4cba-b553-5dff42bexxxx

Saya ingin mencatat login pengguna yang sebenarnya atau setidaknya memiliki beberapa cara untuk mengubah identitas ID ke login saat diperlukan.

The LookupDeveloperIdentity API panggilan tampaknya menjadi cara yang tepat untuk pergi tentang ini, tapi saya tidak dapat mendapatkannya bekerja.

Mencoba melakukan ini dengan Java dan AWS Java SDK 2:

  protected String loadUsername( String user ){
    String ret = "unknown:"+user;
    CognitoIdentityClient cognito = CognitoIdentityClient.create();

    LookupDeveloperIdentityRequest request = LookupDeveloperIdentityRequest.builder()
      .identityPoolId( identityPoolId )
      .identityId( user )
      .build();
    LookupDeveloperIdentityResponse response = cognito.lookupDeveloperIdentity( request );
    List<String> identifiers = response.developerUserIdentifierList();
    if( identifiers != null && identifiers.size() > 0 ){
      ret = identifiers.get( 0 );
    }

    return ret;    
  }

melempar pengecualian

software.amazon.awssdk.services.cognitoidentity.model.NotAuthorizedException: Anda tidak memiliki akses ke identitas ini (Layanan: CognitoIdentity, Kode Status: 400, ID Permintaan: 64e36646-612b-4985-91d1-82aca770XXXX)

Mencoba melakukan ini melalui CLI menghasilkan hasil yang serupa:

aws pencarian identitas-identitas-pengembang-identitas - identitas-id us-east-1: xxxxe650-53f4-4cba-b553-5dff42bexxxx --identity-pool-id us-east-1: xxxx0aa1-89f9-4418-be04- 7e83c838xxxx --max-results = 10

Terjadi kesalahan (NotAuthorizedException) saat memanggil operasi LookupDeveloperIdentity: Anda tidak memiliki akses ke identitas ini

Saya telah memastikan kebijakan IAM yang berlaku harus dapat menangani ini, dan ketika saya mencobanya dengan peran yang tidak memiliki kebijakan ini, saya mendapatkan kesalahan yang berbeda.

    {
        "Effect": "Allow",
        "Action": [
            "cognito-identity:LookupDeveloperIdentity"
        ],
        "Resource": [
            "arn:aws:cognito-identity:us-east-1:##########:identitypool/us-east-1:xxxx0aa1-89f9-4418-be04-7e83c838xxxx"
        ]
    }

Jadi pertanyaannya bermuara pada:

  • Apakah ini cara terbaik untuk mendapatkan nama pengguna kumpulan dari id kumpulan identitas?
    • Jika ya - apa yang saya lakukan salah?
    • Jika tidak - apa cara yang lebih baik untuk melakukan ini?
Tawanan
sumber
Bisakah Anda mencoba docs.aws.amazon.com/cognitoidentity/latest/APIReference/… yang merekomendasikan pendekatan untuk operasi bervolume lebih tinggi. Are you sure you are using the credentials from the account which owns the identity pool you are requesting lookupDeveloperIdentity for?- forums.aws.amazon.com/thread.jspa?threadID=231354 Bagi saya sepertinya izin pengguna, bukan masalah peran IAM.
Jan Garaj
Saya mencobanya juga, dan mendapat pesan kesalahan yang sama. Saya yakin saya menggunakan kredensial dari akun yang memiliki kumpulan identitas - operasi lain di kumpulan itu berfungsi dengan baik. Tampaknya menjadi izin pengguna ... aneh ... tetapi jika demikian, saya ingin tahu cara mendapatkan izin pengguna untuk server.
Tahanan

Jawaban:

6

Pendekatan alternatif

Untuk mengambil id pengguna Pool User pengguna Anda dapat mengambil di lambda Anda:

authProvider = event.requestContext.identity.cognitoAuthenticationProvider;

Ini akan mengembalikan string yang akan menyertakan ID pengguna User Pool pengguna dan akan terlihat seperti:

cognito-idp.us-east-1.amazonaws.com/us-east-1_xxxxxxxxx,cognito-idp.us-east-1.amazonaws.com/us-east-1_aaaaaaaaa:CognitoSignIn:qqqqqqqq-1111-2222-3333-rrrrrrrrrrrr

Di mana us-east-1_aaaaaaaaa adalah id Pool Pengguna dan qqqqqqqq-1111-2222-3333-rrrrrrrrrrrrrr adalah User Pool User Id. Anda kemudian dapat memisahkan string dan mengekstrak ID pengguna.

Perhatikan bahwa info ini akan berbeda tergantung pada penyedia otentikasi yang Anda gunakan.

Kemudian jika Anda memerlukan nama pengguna dan bukan ID pengguna, Anda dapat mengekstraknya langsung dari kelompok pengguna dengan mendapatkan detail yang sesuai untuk ID pengguna tersebut.

Referensi

https://serverless-stack.com/chapters/mapping-cognito-identity-id-and-user-pool-id.html

Xanthos Symeou
sumber
Diterima (terlambat, tapi senang Anda mendapat rep bonus), bahkan dokumentasi di halaman itu mengatakan: "Sementara proses di bawah ini tidak didokumentasikan" Berharap ada cara terdokumentasi yang sebenarnya untuk melakukan ini.
Tahanan