
示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载导读本指南基于 aws-doc-sdk-examples 仓库中sap-abap/services/cgp/目录下的示例代码完整讲解如何在 SAP ABAP 环境中通过 AWS SDK for SAP ABAP 调用 Amazon Cognito Identity Provider用户身份池服务实现用户列表查询、管理员登录、软件 TokenTOTPMFA 绑定与校验、以及 MFA Challenge 应答等核心操作。读完本指南你将掌握list_users、start_sign_in、get_mfa_secret、verify_mfa、respond_to_mfa_challenge五个 API 动作的 ABAP 实现细节、底层调用链与对应的单元测试方案可以直接在真实 SAP 系统中落地一套“管理员登录 软件 Token 二次认证”的完整流程。背景Cognito Identity Provider 与 SDK for SAP ABAPAmazon Cognito Identity Provider用户身份池负责 Web 与移动应用的用户认证和授权提供注册、登录、密码管理、MFA多因素认证等开箱即用的能力。对于需要与 SAP 系统集成认证流程的企业场景SDK for SAP ABAP 提供了对应的 Cognito 服务接口。在仓库中Cognito 相关的全部示例代码集中在 sap-abap/services/cgp 目录包含以下文件文件作用README.md服务示例概览、前置条件与运行说明#awsex#cl_cgp_actions.clas.abap核心示例类/awsex/cl_cgp_actions的接口定义与全部方法实现#awsex#cl_cgp_actions.clas.testclasses.abapABAP 单元测试类含测试资源用户池/客户端/测试用户的创建与清理#awsex#cl_cgp_actions.clas.xml类元数据abapGit 格式声明WITH_UNIT_TESTS启用测试package.devc.xml包描述Package for Cognito identity provider从 类元数据 可以看到该类名称为Cognito-identity-provider Code Example位于 AWS 示例代码命名空间/AWSEX/见 sap-abap/#awsex#.nspc.xml。前置条件与运行方式账户与 SDK 配置根据 sap-abap/README.md 的说明运行本示例前需要满足拥有 AWS 账户并按 AWS SDK for SAP ABAP 全局设置指南 配置好默认凭证credentials与 AWS Region代码示例可通过SE24Class Builder在 ABAP 系统中逐条执行建议对代码授予最低权限least privilege仅授予完成任务所需的最小权限集。关于费用的重要提示原文档在「⚠ Important」一节中明确提示运行本代码可能产生 AWS 账户费用详情参见 AWS Pricing 与 Free Tier运行单元测试同样可能产生费用示例代码并未在全部 AWS 区域测试过部分服务仅在特定区域可用。会话与客户端的标准初始化模式所有示例方法在开头都使用同一套初始化模板——创建 AWS 会话并获取 Cognito 服务客户端CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE ZCODE_DEMO. DATA(lo_session) /aws1/cl_rt_session_awscreate( cv_pfl ). DATA(lo_cgp) /aws1/cl_cgp_factorycreate( lo_session ).这段代码有两个关键点ProfileZCODE_DEMO/aws1/cl_rt_session_awscreate使用 AWS SDK for SAP ABAP 中定义的全局设置 Profile/aws1/rt_profile_id创建会话该 Profile 绑定默认凭证与区域工厂方法Factory/aws1/cl_cgp_factorycreate是 SDK 生成的服务工厂传入会话对象即可获得类型为/aws1/if_cgp的 Cognito 服务客户端接口后续所有 API 调用listusers、admininitiateauth等都经由该客户端发起。五个单动作Single Actions代码示例详解原文档列出的五个动作覆盖了 Cognito 用户管理与认证生命周期每个方法在源码中都标注了snippet-start/snippet-end边界便于文档系统提取代码片段。1. list_users列出用户池中的用户对应 Cognito 的ListUsersAPI方法定义于 源码第 74-98 行 snippet-start:[cgp.abapv1.list_users] TRY. DATA(lo_result) lo_cgp-listusers( iv_userpoolid iv_user_pool_id ). ot_users lo_result-get_users( ). MESSAGE |Found { lines( ot_users ) } users in the pool.| TYPE I. CATCH /aws1/cx_cgpresourcenotfoundex INTO DATA(lo_ex). MESSAGE |User pool { iv_user_pool_id } not found.| TYPE E. CATCH /aws1/cx_cgpnotauthorizedex INTO DATA(lo_auth_ex). MESSAGE Not authorized to list users. TYPE E. ENDTRY. snippet-end:[cgp.abapv1.list_users]要点说明入参iv_user_pool_id的类型是 SDK 生成的数据类型/aws1/cgpuserpoolidtype即 Cognito UserPoolId返回值ot_users的类型为/aws1/cl_cgpusertypett_userslisttype即用户对象列表调用get_users( )从响应对象中取出用户集合异常处理是本示例的重要部分用户池不存在时捕获/aws1/cx_cgpresourcenotfoundex权限不足时捕获/aws1/cx_cgpnotauthorizedex。所有方法统一向上抛出 SDK 通用异常/aws1/cx_rt_generic方法签名在 接口定义第 16-17 行 中声明。2. start_sign_in管理员登录AdminInitiateAuth对应 Cognito 的AdminInitiateAuthAPI在服务端以管理员身份直接发起认证无需用户端 SRP 运算是服务端集成场景中最常用的登录入口。源码见 第 101-150 行。方法接收用户池 ID、客户端 ID、用户名、密码以及可选的iv_secret_hashApp Client 启用客户端密钥时必需 snippet-start:[cgp.abapv1.start_sign_in] TRY. Set up authentication parameters DATA(lt_auth_params) VALUE /aws1/cl_cgpauthparamstype_wtt_authparameterstype( ( VALUE /aws1/cl_cgpauthparamstype_wts_authparameterstype_maprow( key USERNAME value NEW /aws1/cl_cgpauthparamstype_w( iv_user_name ) ) ) ( VALUE /aws1/cl_cgpauthparamstype_wts_authparameterstype_maprow( key PASSWORD value NEW /aws1/cl_cgpauthparamstype_w( iv_password ) ) ) ). Add SECRET_HASH if provided IF iv_secret_hash IS NOT INITIAL. INSERT VALUE #( key SECRET_HASH value NEW /aws1/cl_cgpauthparamstype_w( iv_secret_hash ) ) INTO TABLE lt_auth_params. ENDIF. oo_result lo_cgp-admininitiateauth( iv_userpoolid iv_user_pool_id iv_clientid iv_client_id iv_authflow ADMIN_USER_PASSWORD_AUTH it_authparameters lt_auth_params ). DATA(lv_challenge) oo_result-get_challengename( ). IF lv_challenge IS INITIAL. MESSAGE User successfully signed in. TYPE I. ELSE. MESSAGE |Authentication challenge required: { lv_challenge }.| TYPE I. ENDIF. CATCH /aws1/cx_cgpusernotfoundex INTO DATA(lo_user_ex). MESSAGE |User { iv_user_name } not found.| TYPE E. CATCH /aws1/cx_cgpnotauthorizedex INTO DATA(lo_auth_ex). MESSAGE Not authorized. Check credentials. TYPE E. ENDTRY. snippet-end:[cgp.abapv1.start_sign_in]实现细节与设计意图认证流固定为ADMIN_USER_PASSWORD_AUTH这是 Admin 系列认证中直接以用户名密码认证的流程要求用户池客户端必须显式启用该 auth flow测试代码中使用ALLOW_ADMIN_USER_PASSWORD_AUTH认证参数以KEY VALUE的 map 结构构建用户名、密码以 Cognito 约定的参数名USERNAME、PASSWORD传入SECRET_HASH仅在传入时追加体现对 App Client 密钥配置的兼容处理挑战Challenge判定是核心逻辑调用get_challengename( )判断返回值。为空表示登录成功可进一步通过get_authenticationresult( )获取 AccessToken / RefreshToken非空则说明需要走挑战流程常见的挑战名包括MFA_SETUP首次需要绑定 MFA、SOFTWARE_TOKEN_MFA需要输入动态验证码、NEW_PASSWORD_REQUIRED首次登录强制改密等。这正是整个示例类设计成“登录 → MFA”两步流程的原因。3. get_mfa_secret获取软件 Token MFA 密钥AssociateSoftwareToken对应 Cognito 的AssociateSoftwareTokenAPI用于为用户初始化 TOTP 软件令牌认证。该方法要求登录后处于 MFA 设置会话中即前一步start_sign_in返回MFA_SETUP挑战时携带的 Session。源码见 第 153-177 行 snippet-start:[cgp.abapv1.get_mfa_secret] TRY. DATA(lo_result) lo_cgp-associatesoftwaretoken( iv_session iv_session ). ov_secret_code lo_result-get_secretcode( ). MESSAGE MFA secret code generated successfully. TYPE I. CATCH /aws1/cx_cgpresourcenotfoundex INTO DATA(lo_ex). MESSAGE Session not found or expired. TYPE E. CATCH /aws1/cx_cgpnotauthorizedex INTO DATA(lo_auth_ex). MESSAGE Not authorized to associate software token. TYPE E. ENDTRY. snippet-end:[cgp.abapv1.get_mfa_secret]关键点入参iv_session类型为/aws1/cgpsessiontype即登录响应中返回的会话标识会话过期或无效时会抛出/aws1/cx_cgpresourcenotfoundex返回的ov_secret_code类型/aws1/cgpsecretcodetype是 TOTP 密钥种子需要下发给用户的 Authenticator App如 Google Authenticator生成 6 位动态码这是 MFA 绑定流程的第一步拿到密钥后通常还需配合二维码下发并在用户扫描后调用verify_mfa完成激活。4. verify_mfa校验软件 TokenVerifySoftwareToken对应 Cognito 的VerifySoftwareTokenAPI用用户 Authenticator App 生成的动态验证码激活软件 Token MFA。源码见 第 180-209 行 snippet-start:[cgp.abapv1.verify_mfa] TRY. DATA(lo_result) lo_cgp-verifysoftwaretoken( iv_session iv_session iv_usercode iv_user_code ). ov_status lo_result-get_status( ). IF ov_status SUCCESS. MESSAGE MFA token verified successfully. TYPE I. ELSE. MESSAGE |MFA verification status: { ov_status }.| TYPE I. ENDIF. CATCH /aws1/cx_cgpcodemismatchex INTO DATA(lo_code_ex). MESSAGE Invalid MFA code provided. TYPE E. CATCH /aws1/cx_cgpenbsoftwaretokmf00 INTO DATA(lo_enabled_ex). MESSAGE Software token MFA is already enabled. TYPE E. ENDTRY. snippet-end:[cgp.abapv1.verify_mfa]要点入参iv_user_code类型为/aws1/cgpsoftwaretokmfauserc00用户输入的 6 位动态码通过get_status( )获取校验结果SUCCESS表示软件 Token MFA 已成功激活并绑定到用户异常覆盖两个典型失败场景/aws1/cx_cgpcodemismatchex验证码不匹配与/aws1/cx_cgpenbsoftwaretokmf00软件 Token MFA 已启用重复激活。5. respond_to_mfa_challenge应答 MFA ChallengeAdminRespondToAuthChallenge对应 Cognito 的AdminRespondToAuthChallengeAPI在登录返回SOFTWARE_TOKEN_MFA挑战后提交用户名与动态验证码完成二次认证从而换取最终的认证结果。源码见 第 212-267 行 snippet-start:[cgp.abapv1.respond_to_mfa_challenge] TRY. Build challenge responses DATA(lt_challenge_responses) VALUE /aws1/cl_cgpchallengerspstyp00tt_challengeresponsestype( ( VALUE /aws1/cl_cgpchallengerspstyp00ts_challengerspstype_maprow( key USERNAME value NEW /aws1/cl_cgpchallengerspstyp00( iv_user_name ) ) ) ( VALUE /aws1/cl_cgpchallengerspstyp00ts_challengerspstype_maprow( key SOFTWARE_TOKEN_MFA_CODE value NEW /aws1/cl_cgpchallengerspstyp00( iv_mfa_code ) ) ) ). Add SECRET_HASH if provided IF iv_secret_hash IS NOT INITIAL. INSERT VALUE #( key SECRET_HASH value NEW /aws1/cl_cgpchallengerspstyp00( iv_secret_hash ) ) INTO TABLE lt_challenge_responses. ENDIF. DATA(lo_result) lo_cgp-adminrespondtoauthchallenge( iv_userpoolid iv_user_pool_id iv_clientid iv_client_id iv_challengename SOFTWARE_TOKEN_MFA it_challengeresponses lt_challenge_responses iv_session iv_session ). oo_auth_result lo_result-get_authenticationresult( ). IF oo_auth_result IS BOUND. MESSAGE MFA challenge completed successfully. TYPE I. ELSE. Another challenge might be required DATA(lv_next_challenge) lo_result-get_challengename( ). MESSAGE |Additional challenge required: { lv_next_challenge }.| TYPE I. ENDIF. CATCH /aws1/cx_cgpcodemismatchex INTO DATA(lo_code_ex). MESSAGE Invalid MFA code provided. TYPE E. CATCH /aws1/cx_cgpexpiredcodeex INTO DATA(lo_expired_ex). MESSAGE MFA code has expired. TYPE E. CATCH /aws1/cx_cgpnotauthorizedex INTO DATA(lo_auth_ex). MESSAGE Not authorized. Check MFA configuration. TYPE E. ENDTRY. snippet-end:[cgp.abapv1.respond_to_mfa_challenge]实现细节挑战响应Challenge Responses的构建与登录参数结构类似以 map 形式传入USERNAME与SOFTWARE_TOKEN_MFA_CODE并按需追加SECRET_HASH挑战名显式指定为SOFTWARE_TOKEN_MFA即本次应答针对软件 Token 二次认证挑战调用get_authenticationresult( )判断认证结果返回对象已绑定说明 MFA 应答成功、挑战闭环未绑定则说明仍需继续处理后续挑战调用get_challengename( )获取下一个挑战名用于循环处理多级挑战异常处理覆盖三种典型失败验证码错误/aws1/cx_cgpcodemismatchex、验证码过期/aws1/cx_cgpexpiredcodeex、权限不足/aws1/cx_cgpnotauthorizedex。从源码看完整认证工作流登录 软件 Token MFA将上述五个方法按顺序串联可以推断出一条完整的服务端认证流程这也是示例类与测试类共同支撑的核心场景准备阶段确保用户池客户端显式启用了ALLOW_ADMIN_USER_PASSWORD_AUTH、ALLOW_REFRESH_TOKEN_AUTH等认证流测试代码中通过createuserpoolclient的it_explicitauthflows参数设置见 测试源码第 81-89 行管理员登录调用start_sign_in发起ADMIN_USER_PASSWORD_AUTH返回挑战名为空 → 登录成功获取认证结果返回MFA_SETUP→ 用户尚未绑定 MFA进入步骤 3返回SOFTWARE_TOKEN_MFA→ 用户已绑定 MFA直接进入步骤 5获取密钥调用get_mfa_secretAssociateSoftwareToken拿到 TOTP 密钥种子下发给用户 Authenticator App激活 MFA用户输入 App 生成的动态码后调用verify_mfaVerifySoftwareToken完成绑定激活状态返回SUCCESS应答挑战调用respond_to_mfa_challengeAdminRespondToAuthChallenge挑战名SOFTWARE_TOKEN_MFA提交动态码换取AuthenticationResult包含 AccessToken / RefreshToken / IdToken。这一设计在 测试类 中得到完整验证test_get_mfa_secret先通过setuserpoolmfaconfig将池级 MFA 配置设为OPTIONAL并启用软件 Token见 测试源码第 270-274 行再触发MFA_SETUP挑战后取密钥test_respond_to_mfa_challenge则在SOFTWARE_TOKEN_MFA挑战下提交验证码。单元测试DANGEROUS 级别的真实资源测试测试类/awsex/cl_cgp_actions的本地测试类ltc_awsex_cl_cgp_actions见 测试源码覆盖全部五个方法采用FOR TESTING DURATION LONG RISK LEVEL DANGEROUS声明——这意味着测试会真实创建并删除 AWS 资源仅应在合适的测试 AWS 账户中运行与 sap-abap/README.md 中的提示一致。测试基础设施的搭建本身也是绝佳的集成示例值得重点说明资源准备class_setup测试开始时动态创建独立资源并缓存为类级数据创建用户池调用createuserpool指定删除保护为INACTIVE并打上convert_testtrue标签见 测试源码第 67-74 行——该标签是仓库统一的测试资源标记约定即使清理失败也能通过标签人工识别残留资源创建用户池客户端调用createuserpoolclient显式启用ALLOW_ADMIN_USER_PASSWORD_AUTH、ALLOW_REFRESH_TOKEN_AUTH、ALLOW_USER_SRP_AUTH三种认证流生成测试用户凭据用户名、邮箱、密码均拼接随机字符串/awsex/cl_utilsget_random_string( )避免命名冲突等待就绪wait_seconds( 10 )等待用户池完全就绪后再执行用例。测试用户创建辅助方法create_test_user见 测试源码第 449-479 行演示了用户生命周期管理的完整套路ao_cgp-admincreateuser( iv_userpoolid av_user_pool_id iv_username iv_username iv_temporarypassword iv_password it_userattributes VALUE /aws1/cl_cgpattributetypett_attributelisttype( ( NEW /aws1/cl_cgpattributetype( iv_name email iv_value iv_email ) ) ( NEW /aws1/cl_cgpattributetype( iv_name email_verified iv_value true ) ) ) iv_messageaction SUPPRESS ). Set permanent password ao_cgp-adminsetuserpassword( iv_userpoolid av_user_pool_id iv_username iv_username iv_password iv_password iv_permanent abap_true ).即先AdminCreateUser创建用户携带email、email_verifiedtrue属性messageaction SUPPRESS抑制通知邮件再AdminSetUserPassword将临时密码设为永久密码使测试用户立即可用于登录。资源清理class_teardown清理顺序与创建顺序严格相反见 测试源码第 111-157 行列出用户池内全部用户逐个admindeleteuserdeleteuserpoolclient删除客户端等待 2 秒后deleteuserpool删除用户池若删除失败提示通过convert_test标签人工清理。每个测试用例的断言策略也很有参考价值test_list_users断言用户列表非空且包含刚创建的用户test_verify_mfa与test_respond_to_mfa_challenge有意使用无效验证码000000通过捕获/aws1/cx_cgpcodemismatchex验证方法正确拒绝了错误输入避免在测试中真正依赖外部 Authenticator 生成动态码。运行与后续阅读每个示例方法均可在 ABAP 系统的SE24Class Builder中直接执行相关说明见 sap-abap/README.md单元测试的运行说明参见 sap-abap/README.md#Tests运行前请确认所在账户为合适的测试环境类元数据确认该类启用单元测试WITH_UNIT_TESTS仓库根目录还提供了 SAP ABAP 服务的命名空间与包定义sap-abap/#awsex#.nspc.xml、sap-abap/services/cgp/package.devc.xml。总结/awsex/cl_cgp_actions示例类以五个精炼的 single action 完整覆盖了 Cognito 服务端认证的核心操作面用户列举ListUsers、管理员登录AdminInitiateAuth、软件 Token 绑定AssociateSoftwareToken/VerifySoftwareToken与挑战应答AdminRespondToAuthChallenge并以 DANGEROUS 级别的 ABAP 单元测试演示了用户池、客户端、用户的真实创建与清理。无论是要在 SAP 与 AWS 之间搭建 SSO 登录还是需要为既有登录链路增加 TOTP 二次认证这套代码都可以作为直接的参考模板落地复用。Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.SPDX-License-Identifier: Apache-2.0赞分享示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载相关推荐使用 AWS SDK for JavaScript (v3) 实战 Amazon Cognito Identity Provider用户池认证、MFA 与 Lambda 触发器使用 AWS SDK for JavaScript v3 实战 Amazon Cognito Identity Provider用户池认证、MFA 与 Lam示例工程教程后端使用 AWS SDK for C 实现 Amazon Cognito 用户注册与 MFA 认证实战指南使用 AWS SDK for C 实现 Amazon Cognito 用户注册与 MFA 认证实战指南 导读 本文以 AWS Code Examples 仓示例工程教程后端使用 AWS SDK for .NET 实现 Amazon Cognito 用户注册与 MFA 多因素认证使用 AWS SDK for .NET 实现 Amazon Cognito 用户注册与 MFA 多因素认证 本文基于 dotnetv3/Cognito/READ示例工程教程后端上一篇qmcdump终极指南3分钟解锁QQ音乐加密音频下一篇5分钟掌握QQ音乐加密音频自由转换qmcdump完全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考