本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
註冊前 Lambda 觸發程序
您可能想要在具有自助註冊選項的使用者集區中自訂註冊程序。預先註冊觸發程序的一些常見用途是執行新使用者的自訂分析和記錄、套用安全和治理標準,或將第三方 IdP 中的使用者連結至合併的使用者設定檔。您可能也有信任的使用者,不需要進行驗證和確認。
在 Amazon Cognito 註冊新的本機或聯合使用者之前,它會啟用預先註冊 Lambda 函數。在註冊程序中,您可以使用此函數,使用自訂邏輯分析登入事件,以及修改或拒絕新使用者。
註冊前 Lambda 流程
用戶端註冊流程
伺服器端註冊流程
請求中包含來自用戶端的驗證資料。此資料來自傳遞給使用者集區 SignUp 和 AdminCreateUser API方法ValidationData
的值。
註冊前 Lambda 觸發程序參數
Amazon Cognito 傳遞至此 Lambda 函數的請求,是以下參數和 Amazon Cognito 新增至所有請求的常用參數之組合。
- JSON
-
{
"request": {
"userAttributes": {
"string
": "string
",
. . .
},
"validationData": {
"string
": "string
",
. . .
},
"clientMetadata": {
"string
": "string
",
. . .
}
},
"response": {
"autoConfirmUser": "boolean
",
"autoVerifyPhone": "boolean
",
"autoVerifyEmail": "boolean
"
}
}
註冊前請求參數
- userAttributes
-
代表使用者屬性的一或多組名稱/值。屬性名稱是索引鍵。
- validationData
-
您的應用程式在建立新使用者的請求中傳遞給 Amazon Cognito 的一或多個鍵值對與使用者屬性資料。在 AdminCreateUser或 SignUpAPI請求的 ValidationData 參數中,將此資訊傳送至 Lambda 函數。
Amazon Cognito 不會將 ValidationData 您的資料設定為您建立之使用者的屬性。 ValidationData 是您為了預先註冊 Lambda 觸發而提供的臨時使用者資訊。
- clientMetadata
-
您可以做為 Lambda 函數的自訂輸入提供的一個或多個鍵值組,該函數是您用於註冊前觸發程序所指定。您可以在下列API動作中使用 參數, ClientMetadata將此資料傳遞至 Lambda 函數:AdminCreateUser、ForgotPassword、 AdminRespondToAuthChallenge和 SignUp。
註冊前回應參數
如果您想要自動確認使用者,可以在回應中將 autoConfirmUser
設定為 true
。您可以將 autoVerifyEmail
設定為 true
,以自動驗證使用者的電子郵件。您可以將 autoVerifyPhone
設定為 true
,以自動驗證使用者的電話號碼。
當 觸發預先註冊 Lambda 函數時autoVerifyPhone
,Amazon Cognito autoConfirmUser
會忽略回應參數 、 autoVerifyEmail
和 AdminCreateUser
API。
- autoConfirmUser
-
設定為 true
以自動確認使用者,否則設定為 false
。
- autoVerifyEmail
-
設定為 true
以設定為已驗證註冊使用者的電子郵件地址,否則設定為 false
。如果 autoVerifyEmail
設定為 true
,email
屬性必須包含有效的非 null 值。否則會發生錯誤,而且使用者將無法完成註冊。
如果選取 email
屬性做為別名,則在設定 autoVerifyEmail
時,將會為使用者的電子郵件地址建立別名。如果使用該電子郵件地址的別名已存在,則會將別名移至新使用者,而舊使用者的電子郵件地址會標記為未驗證。如需詳細資訊,請參閱自訂登入屬性。
- autoVerifyPhone
-
設定為 true
以設定為已驗證註冊使用者的電話號碼,否則設定為 false
。如果 autoVerifyPhone
設定為 true
,phone_number
屬性必須包含有效的非 null 值。否則會發生錯誤,而且使用者將無法完成註冊。
如果選取 phone_number
屬性做為別名,則在設定 autoVerifyPhone
時,將會為使用者的電話號碼建立別名。如果使用該電話號碼的別名已存在,則會將別名移至新使用者,而舊使用者的電話號碼會標記為未驗證。如需詳細資訊,請參閱自訂登入屬性。
註冊教學課程
註冊前 Lambda 函數會在使用者註冊之前觸發。請參閱這些適用於 JavaScript、Android 和 iOS 的 Amazon Cognito 註冊教學課程。
註冊前範例:自動確認來自已註冊網域的使用者
您可以使用這個註冊前 Lambda 觸發程序,新增自訂邏輯來驗證註冊您使用者集區的新使用者。這是示範如何註冊新使用者的範例 JavaScript 程式。在身分驗證期間,它會叫用註冊前 Lambda 觸發程序。
- JavaScript
-
var attributeList = [];
var dataEmail = {
Name: "email",
Value: "...", // your email here
};
var dataPhoneNumber = {
Name: "phone_number",
Value: "...", // your phone number here with +country code and no delimiters in front
};
var dataEmailDomain = {
Name: "custom:domain",
Value: "example.com",
};
var attributeEmail = new AmazonCognitoIdentity.CognitoUserAttribute(dataEmail);
var attributePhoneNumber = new AmazonCognitoIdentity.CognitoUserAttribute(
dataPhoneNumber
);
var attributeEmailDomain = new AmazonCognitoIdentity.CognitoUserAttribute(
dataEmailDomain
);
attributeList.push(attributeEmail);
attributeList.push(attributePhoneNumber);
attributeList.push(attributeEmailDomain);
var cognitoUser;
userPool.signUp(
"username",
"password",
attributeList,
null,
function (err, result) {
if (err) {
alert(err);
return;
}
cognitoUser = result.user;
console.log("user name is " + cognitoUser.getUsername());
}
);
這是在註冊之前,使用使用者集區註冊前 Lambda 觸發程序呼叫的範例 Lambda 觸發程序。它會使用自訂屬性 custom:domain,自動確認來自特定電子郵件網域的新使用者。不在自訂網域中的任何新使用者都會新增到這個使用者集區,但不會自動確認。
- Node.js
-
exports.handler = (event, context, callback) => {
// Set the user pool autoConfirmUser flag after validating the email domain
event.response.autoConfirmUser = false;
// Split the email address so we can compare domains
var address = event.request.userAttributes.email.split("@");
// This example uses a custom attribute "custom:domain"
if (event.request.userAttributes.hasOwnProperty("custom:domain")) {
if (event.request.userAttributes["custom:domain"] === address[1]) {
event.response.autoConfirmUser = true;
}
}
// Return to Amazon Cognito
callback(null, event);
};
- Python
-
def lambda_handler(event, context):
# It sets the user pool autoConfirmUser flag after validating the email domain
event['response']['autoConfirmUser'] = False
# Split the email address so we can compare domains
address = event['request']['userAttributes']['email'].split('@')
# This example uses a custom attribute 'custom:domain'
if 'custom:domain' in event['request']['userAttributes']:
if event['request']['userAttributes']['custom:domain'] == address[1]:
event['response']['autoConfirmUser'] = True
# Return to Amazon Cognito
return event
Amazon Cognito 會將事件資訊傳遞至您的 Lambda 函數。此函數會將相同事件物件傳回 Amazon Cognito,並在回應中附上任何變更。在 Lambda 主控台中,您可使用與 Lambda 觸發程序相關聯的資料來設定測試事件。下列是此程式碼範例的測試事件:
- JSON
-
{
"request": {
"userAttributes": {
"email": "testuser@example.com",
"custom:domain": "example.com"
}
},
"response": {}
}
註冊前範例:自動確認及自動驗證所有使用者
此範例會確認所有使用者並設定使用者的 email
和 phone_number
屬性以驗證屬性是否存在。此外,如果啟用別名,則當設定自動驗證時,將會為 phone_number
和 email
建立別名。
如果使用相同電話號碼的別名已存在,則會將別名移至新使用者,而舊使用者的 phone_number
會標記為未驗證。電子郵件地址也是一樣。為了防止這種情況發生,您可以使用使用者集區ListUsers API來查看是否存在已使用新使用者電話號碼或電子郵件地址作為別名的現有使用者。
- Node.js
-
const handler = async (event) => {
// Confirm the user
event.response.autoConfirmUser = true;
// Set the email as verified if it is in the request
if (Object.hasOwn(event.request.userAttributes, "email")) {
event.response.autoVerifyEmail = true;
}
// Set the phone number as verified if it is in the request
if (Object.hasOwn(event.request.userAttributes, "phone_number")) {
event.response.autoVerifyPhone = true;
}
return event;
};
export { handler };
- Python
-
def lambda_handler(event, context):
# Confirm the user
event['response']['autoConfirmUser'] = True
# Set the email as verified if it is in the request
if 'email' in event['request']['userAttributes']:
event['response']['autoVerifyEmail'] = True
# Set the phone number as verified if it is in the request
if 'phone_number' in event['request']['userAttributes']:
event['response']['autoVerifyPhone'] = True
# Return to Amazon Cognito
return event
Amazon Cognito 會將事件資訊傳遞至您的 Lambda 函數。此函數會將相同事件物件傳回 Amazon Cognito,並在回應中附上任何變更。在 Lambda 主控台中,您可使用與 Lambda 觸發程序相關聯的資料來設定測試事件。下列是此程式碼範例的測試事件:
- JSON
-
{
"request": {
"userAttributes": {
"email": "user@example.com",
"phone_number": "+12065550100"
}
},
"response": {}
}
註冊前範例:如果使用者名稱少於五個字元,則拒絕註冊
此範例會檢查註冊請求中的使用者名稱長度。如果使用者輸入的名稱長度少於五個字元,則範例會傳回錯誤。
- Node.js
-
exports.handler = (event, context, callback) => {
// Impose a condition that the minimum length of the username is 5 is imposed on all user pools.
if (event.userName.length < 5) {
var error = new Error("Cannot register users with username less than the minimum length of 5");
// Return error to Amazon Cognito
callback(error, event);
}
// Return to Amazon Cognito
callback(null, event);
};
- Python
-
def lambda_handler(event, context):
if len(event['userName']) < 5:
raise Exception("Cannot register users with username less than the minimum length of 5")
# Return to Amazon Cognito
return event
Amazon Cognito 會將事件資訊傳遞至您的 Lambda 函數。此函數會將相同事件物件傳回 Amazon Cognito,並在回應中附上任何變更。在 Lambda 主控台中,您可使用與 Lambda 觸發程序相關聯的資料來設定測試事件。下列是此程式碼範例的測試事件:
- JSON
-
{
"userName": "rroe",
"response": {}
}