Estoy usando la biblioteca de AWS Amplify para registrarme y realizar la autenticación para un proyecto de AppSync. Esto usa Cognito. Sin embargo, cuando un nuevo usuario se registra a través de Amplify/Cognito, el nuevo usuario no se asigna a ningún grupo específico en el grupo de cognito. Estoy usando el componente de orden superior Amplify para iniciar sesión/registrarse.
import { withAuthenticator } from 'aws-amplify-react';que envuelvo sobre un componente
class Authenticator extends React.Component { //... basically empty component, only exists so I can wrap it w/ the HOC } export default withAuthenticator(Authenticator)Amplify está configurado en index.js
import config from './aws-exports'; import Amplify from 'aws-amplify'; Amplify.configure(config);AWS Mobile Hub CLI generó automáticamente aws-exports.js. Parece...
const awsmobile = { 'aws_app_analytics': 'enable', 'aws_cognito_identity_pool_id': 'us-west-2:XXX', 'aws_cognito_region': 'us-west-2', 'aws_content_delivery': 'enable', 'aws_content_delivery_bucket': 'flashcards-hosting-mobilehub-XXX', 'aws_content_delivery_bucket_region': 'us-west-2', 'aws_content_delivery_cloudfront': 'enable', 'aws_content_delivery_cloudfront_domain': 'XXX.cloudfront.net', 'aws_mandatory_sign_in': 'enable', 'aws_mobile_analytics_app_id': 'XXX', 'aws_mobile_analytics_app_region': 'us-east-1', 'aws_project_id': 'XXX', 'aws_project_name': 'flash-cards', 'aws_project_region': 'us-west-2', 'aws_resource_name_prefix': 'flashcards-mobilehub-XXX', 'aws_sign_in_enabled': 'enable', 'aws_user_pools': 'enable', 'aws_user_pools_id': 'us-west-2_XXX', 'aws_user_pools_mfa_type': 'OFF', 'aws_user_pools_web_client_id': 'XXX', } export default awsmobile;Lo tengo funcionando. Como mencionó Vladamir en los comentarios, esto debe hacerse del lado del servidor, en un disparador lambda posterior a la confirmación. Aquí está la función lambda.
'use strict'; var AWS = require('aws-sdk'); module.exports.addUserToGroup = (event, context, callback) => { // console.log("howdy!",event); var cognitoidentityserviceprovider = new AWS.CognitoIdentityServiceProvider(); var params = { GroupName: 'users', //The name of the group in you cognito user pool that you want to add the user to UserPoolId: event.userPoolId, Username: event.userName }; //some minimal checks to make sure the user was properly confirmed if(! (event.request.userAttributes["cognito:user_status"]==="CONFIRMED" && event.request.userAttributes.email_verified==="true") ) callback("User was not properly confirmed and/or email not verified") cognitoidentityserviceprovider.adminAddUserToGroup(params, function(err, data) { if (err) { callback(err) // an error occurred } callback(null, event); // successful response }); };También deberá establecer la política para el rol de la función lambda. En la consola de IAM, busque el rol para esta lambda y agregue esta política en línea. Esto le da a la lambda las llaves del castillo para todo cognito, así que haz que el tuyo sea más restrictivo.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "cognito-identity:*" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "cognito-sync:*" ], "Resource": "*" }, { //this might be the only one you really need "Effect": "Allow", "Action": [ "cognito-idp:*" ], "Resource": "*" } ] }Cognito no sabrá a qué grupo debe pertenecer un usuario recién registrado. Tiene que programar (o manualmente) asignar al usuario a un grupo específico. Una vez que su código coloca al usuario en un grupo específico, el token de ID de JWT contendrá una lista de todos los grupos relevantes/roles de IAM de los que forma parte este usuario.
Más información sobre grupos aquí .
AWS Amplify ha agregado soporte para agregar usuarios a grupos usando amplificar cli. Los detalles se proporcionan aquí https://aws.amazon.com/blogs/mobile/amplify-framework-adds-supports-for-aws-lambda-triggers-in-auth-and-storage-categories/
Además, este artículo explica un poco más de detalles https://medium.com/@dantasfiles/multi-tenant-aws-amplify-method-2-cognito-groups-38b40ace2e9e
Al pasar el nombre del grupo del lado del cliente a su función lamda, puede usar el objeto clientMetadata del parámetro de activación Lambda posterior a la confirmación como se muestra a continuación.
await Auth.signUp({ username: this.email, password: this.password, attributes: { given_name: this.firstname, family_name: this.lastname }, clientMetadata: { key: value } })Si está utilizando la interfaz de usuario de autenticación amplificada lista para usar, debe personalizarla con el componente Autenticador y escribir su propio componente para registrarse o ConfirmSignUp preferible (por favor, verifique si puede pasar clientMetadata desde allí)
Dentro de la función lamda, puede obtener un nombre de grupo pasado como este
event.request.clientMetadata.groupName