Lấy tên người dùng nhóm người dùng cognito từ danh tính nhóm nhận dạng cognito


10

Tôi đang sử dụng Nhóm người dùng AWS Congito để quản lý tài khoản với Nhóm nhận dạng Cognito có Nhóm người dùng này làm Nhà cung cấp nhận dạng. Tôi đang sử dụng điều này để kiểm soát quyền truy cập vào API thông qua API Gateway gửi yêu cầu đến Lambda. Lambda của tôi được triển khai với Java 8 bằng Micronaut. Tất cả điều này đang hoạt động tốt.

Trong Lambda, tôi nhận được tên từ Principaltrong 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;
  }

Điều gì đang quay trở lại trong tên chuỗi của nhận dạng Cognito. Một cái gì đó như thế này:

us-đông-1: xxxxe650-53f4-4cba-b553-5dff42bexxxx

Tôi muốn đăng nhập thông tin đăng nhập người dùng thực tế hoặc ít nhất có một số cách để chuyển đổi nhận dạng sang đăng nhập khi cần.

Cuộc gọi API của LookDeveloperIdentity dường như là cách phù hợp để thực hiện điều này, nhưng tôi không thể làm cho nó hoạt động được.

Cố gắng thực hiện điều này với Java và 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;    
  }

ném một ngoại lệ

software.amazon.awssdk.service.cognitoidentity.model.NotAuthorizedException: Bạn không có quyền truy cập vào danh tính này (Dịch vụ: CognitoIdentity, Mã trạng thái: 400, ID yêu cầu: 64e36646-612b-4985-91d1-82

Cố gắng thực hiện điều này thông qua CLI tạo ra kết quả tương tự:

aws cognito-nhận dạng tra cứu-nhà phát triển-nhận dạng --identity-id us-East-1: xxxxe650-53f4-4cba-b553-5dff42bexxxx --identity-pool-id us-East-1: xxxx0aa1-89f9-4418 7e83c838xxxx --max-results = 10

Đã xảy ra lỗi (NotAuthorizedException) khi gọi thao tác Tra cứuDeveloperIdentity: Bạn không có quyền truy cập vào danh tính này

Tôi đã đảm bảo chính sách IAM tại chỗ sẽ có thể xử lý việc này và khi tôi thử nó với vai trò không có chính sách này, tôi gặp một lỗi khác

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

Vì vậy, các câu hỏi sôi lên:

  • Đây có phải là cách tốt nhất để lấy tên người dùng nhóm người dùng từ id nhóm nhận dạng?
    • Nếu đó là - tôi đang làm gì không đúng?
    • Nếu nó không phải là - cách tốt hơn để làm điều này là gì?

Bạn có thể thử docs.aws.amazon.com/cognitoidentity/latest/APIReference/ đá mà phương pháp được đề xuất cho các hoạt động khối lượng cao hơn. Are you sure you are using the credentials from the account which owns the identity pool you are requesting lookupDeveloperIdentity for?- forum.aws.amazon.com/thread.jspa?threadID=231354 Đối với tôi, nó trông giống như sự cho phép của người dùng, không phải là vấn đề vai trò của IAM.
Jan Garaj

Tôi cũng đã thử điều đó và nhận được thông báo lỗi tương tự. Tôi chắc chắn rằng tôi đang sử dụng thông tin đăng nhập từ tài khoản sở hữu nhóm nhận dạng - các hoạt động khác trên nhóm hoạt động tốt. Đó là quyền của người dùng có vẻ ... kỳ quặc ... nhưng nếu vậy, tôi rất muốn biết làm thế nào để có được quyền của người dùng cho máy chủ.
Tù nhân

Câu trả lời:


6

Cách tiếp cận khác

Để truy xuất id người dùng Nhóm người dùng, bạn có thể truy xuất trong lambda của mình:

authProvider = event.requestContext.identity.cognitoAuthenticationProvider;

Điều này sẽ trả về một chuỗi sẽ bao gồm ID người dùng nhóm người dùng và nó sẽ trông giống như:

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

Trong đó us-East-1_aaaaaaaaa là Id nhóm người dùng và qqqqqqqq-1111-2222-3333-rrrrrrrrrrr là Id người dùng nhóm người dùng. Sau đó, bạn có thể tách chuỗi và trích xuất ID người dùng.

Lưu ý rằng những thông tin này sẽ khác nhau tùy thuộc vào nhà cung cấp xác thực bạn đang sử dụng.

Sau đó, nếu bạn cần tên người dùng thay vì ID người dùng, bạn có thể trích xuất nó trực tiếp từ nhóm người dùng bằng cách lấy các chi tiết phù hợp cho ID người dùng cụ thể đó.

Tài liệu tham khảo

https://serverless-stack.com/ch chương / mapping-cognito-idity-id-and-user -pool-id.html


Được chấp nhận (muộn màng, nhưng rất vui vì bạn đã nhận được đại diện tiền thưởng), ngay cả tài liệu trên trang đó cũng nói: "Trong khi quy trình dưới đây không được ghi lại" Ước gì có một cách thực sự được làm tài liệu để làm điều này.
Tù nhân
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.