如何使用 Amplify-android AWS 使用 lambda 函数从 Cognito 查询用户池

How to query user pool from cognito with lambda functions using Amplify-android AWS

我在 schema.graphql 上有这个函数签名,我可以使用它来调用从 Cognito 服务器检索用户列表的 lambda 函数吗?

type Query 
{
  echo(msg: String): String @function(name: "getUsers-${env}")
}

如何从 Android 调用它?

我需要阿波罗吗?

A​​mplify 文库够用吗?

基本上您不能使用模式直接从 Cognito Amazon 服务器查询用户。

在 Android 应用程序中,您必须创建和使用以下 Amplify 插件,您可以从此处阅读更多相关信息: https://docs.amplify.aws/start/q/integration/android

您必须按照此处所述创建 lambda 函数:

const AWS = require('aws-sdk');
const cognito = new AWS.CognitoIdentityServiceProvider({apiVersion: '2016-04-18', region: 'eu-central-1'});

exports.handler = async (event) => {
    // TODO implement
    let users = [];
    let roles = ['admin', 'user' ];

    try
    {
        // (let i=0, len=roles.length; i<len; i++) 
        //{
            //const role = roles[i];
            let more = true;
            let nextToken = '';
    
            while (more) 
            {
                let params = {
                  UserPoolId: "your pool id",
                  //GroupName: role,
                  Limit: 60
                };
                
                if (nextToken !== '')
                {
                    params.NextToken = nextToken;
                } 
                
                const rawUsers = await cognito.listUsers(params).promise();
                const mapUsers = rawUsers.Users.map(user => {
                
                    let atts = {};
        
                    for (const att of user.Attributes) 
                    {
                        atts[att.Name] = att.Value;
                    }
        
                    return {
                        username: user.Username,
                        name: atts.hasOwnProperty('name') ? atts.name : '',
                        email: atts.hasOwnProperty('email') ? atts.email : '',
                        status: user.UserStatus,
                        //role: role
                    };
              
                
                });
            
                users= users.concat(mapUsers);
                if (rawUsers.hasOwnProperty('NextToken')) {
                  nextToken = rawUsers.NextToken;
                } else {
                  more = false;
                }
                    }
            
            
       // }
        
        const response = {
            statusCode: 200,
        //  Uncomment below to enable CORS requests
        //  headers: {
        //      "Access-Control-Allow-Origin": "*"
        //  }, 
            body: JSON.stringify(users),
        };
        return response;
   
    }
    catch(e)
    {
        const response = {
            statusCode: 500,
        //  Uncomment below to enable CORS requests
        //  headers: {
        //      "Access-Control-Allow-Origin": "*"
        //  }, 
            body: e,
        };
        return response;
    }
};

然后创建 REST api: 使用终端 Amplify CLI 命令并将其连接到创建的 lambda 函数,包括“仅限经过身份验证的用户”。 运行:

amplify add api
C:\DOV_AWS>amplify api add
? Please select from one of the below mentioned services: REST
? Provide a friendly name for your resource to be used as a label for this category in the
 project: users
? Provide a path (e.g., /book/{isbn}):
C:\DOV_AWS>amplify api add
? Please select from one of the below mentioned services: REST
? Provide a friendly name for your resource to be used as a label for this category in the
 project: DOV
? Provide a path (e.g., /book/{isbn}): /users
? Choose a Lambda source Use a Lambda function already added in the current Amplify projec
t
? Choose the Lambda function to invoke by this path getUsers
? Restrict API access Yes
? Who should have access? Authenticated users only
? What kind of access do you want for Authenticated users? create, read, update, delete
? Do you want to add another path? No
Successfully added resource DOV locally

使用放大推送命令: 放大推送

为了在云端更新API

运行 在您的应用中添加以下代码以获取用户。


   RestOptions options = RestOptions.builder()
                        .addPath("/users")
                        .build();

                        Amplify.API.get("Users", options, response -> 
                        Log.i("MyAmplifyApp", " ! ! ! ! ! Data Respond ! ! ! ! !" 
                        + response.getData().asString()),
                        error -> Log.e("MyAmplifyApp", "GET failed", error)
   );

                                      

You must add permission rule for Cognito server in the lambda function in order to fetch the user data.

The authentication method will include IAM rule