Как запросить пул пользователей из когнито с помощью лямбда-функций с помощью Amplify-android AWS
У меня есть эта сигнатура функции на schema.graphql, могу ли я использовать ее для вызова лямбда-функции, которая извлекает список пользователей с сервера Cognito?
type Query
{
echo(msg: String): String @function(name: "getUsers-${env}")
}
Как мне его вызвать с Android?
Нужен ли мне Аполлон?
Достаточно ли библиотеки Amplify?
1 ответ
По сути, вы не можете привлекать пользователей с сервера Cognito Amazon напрямую, используя схему.
В приложении Android вы должны создать и использовать следующие плагины Amplify, вы можете узнать больше об этом здесь:https://docs.amplify.aws/start/q/integration/android
Вы должны создать лямбда-функцию, как описано здесь:
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 и подключите его к лямбда-функции, которая была создана, включая "Только аутентифицированные пользователи". Бежать:
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
Используйте команду ampify push:ampify push
Чтобы обновить 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)
);
Вы должны добавить правило разрешений для сервера Cognito в лямбда-функцию, чтобы получать данные пользователя.
Метод аутентификации будет включать правило IAM