Floci 本地 Cognito 模拟实战:用户池、OIDC 授权与 JWT 验证完全指南

发布时间:2026/9/20 13:21:15
Floci 本地 Cognito 模拟实战:用户池、OIDC 授权与 JWT 验证完全指南 【免费下载链接】flociLight, fluffy, and always free - The AWS Local Emulator alternative项目地址https://gitcode.com/gh_mirrors/fl/floci点击查看免费下载Floci 的 Cognito 服务在本地完整复刻 AWS Cognito Identity Providercognito-idp的 JSON 1.1 协议支持用户池、App Client、资源服务器、身份提供者、用户与组管理并提供/.well-known发现端点、JWKS 端点与一套模拟器友好的 OAuth 令牌端点让本地开发环境可以像调用真实 AWS 一样创建池、签发和验证 RS256 签名的 Cognito 风格令牌。阅读本文后你将掌握如何通过 AWS CLI 完成用户池全生命周期管理、如何利用floci:*保留标签控制资源 ID 与客户端密钥、如何走通 client-credentials 与 OIDC 授权码两条登录链路以及如何在本地用 Discovery/JWKS 校验 Floci 签发的 JWT。服务协议与接入方式Floci 的 Cognito 服务遵循 AWS 的 JSON 1.1 协议接入方式协议JSON 1.1X-Amz-Target: AWSCognitoIdentityProviderService.*端点POST http://localhost:4566/这意味着所有 AWS SDK 与awsCLI 只需把 endpoint 指向 Floci 即可使用无需修改调用代码。从源码看服务入口由 CognitoService.java 承担并围绕 8 张存储表组织状态cognito-pools.json、cognito-clients.json、cognito-resource-servers.json、cognito-domains.json、cognito-identity-providers.json、cognito-users.json、cognito-groups.json、cognito-revoked-tokens.json见构造器中storageFactory.create(...)的调用。Floci 提供用户池粒度的 Discovery 与 JWKS 端点以及一个宽松的 OAuth 令牌端点本地客户端可以基于 RS256 签名密钥自行铸造并验证 Cognito 风格的 access token端点说明GET /{userPoolId}/.well-known/openid-configurationOpenID Discovery 文档GET /{userPoolId}/.well-known/jwks.json用于 JWT 校验的 JSON Web Key SetGET /cognito-idp/oauth2/authorizeOIDC 授权码流程起始端点GET /cognito-idp/oauth2/idpresponseOIDC 提供方回调端点POST /cognito-idp/oauth2/tokenOAuth 授权码兑换与 client-credentials 令牌端点Discovery 与 JWKS 端点的实现位于 CognitoWellKnownController.javaJWKS 返回由用户池签名密钥导出的 RSA 公钥ktyRSA、algRS256、usesig。注意其用户池 ID 路径参数被约束为正则[^/_]_[^/]——真实 Cognito 的用户池 ID 一定形如us-east-1_AbC123XyZ区域前缀 _ 随机后缀而 S3 桶名禁止下划线因此用_作为判别符可以避免与 S3 的/.well-known/对象键路由冲突。通过floci:*保留标签控制创建行为Floci 在CreateUserPool时支持通过用户池标签仅创建时生效覆盖若干默认值这些键定义在 ReservedTags.java 中floci:override-id固定结果中的UserPool.Id。因为固定的 ID 由调用方指定所以可以被复用——这是 AWS 永远不会做的AWS 的池 ID 从不复用。因此DeleteUserPool会删除该池拥有的一切用户、组、App Client、资源服务器、已吊销令牌记录与未使用的验证码这样在同一 ID 上重建的池将以空状态启动而不是继承被删池的密码哈希与客户端密钥。源码层面CognitoService.java 的deleteUserPool首先拒绝删除仍配置了域名hosted UI/自定义域名的池抛出与 AWS API 参考文档一致的InvalidParameterException: User pool cannot be deleted. It has a domain configured that should be deleted first.随后按{poolId}::前缀级联清理 groupStore、userStore、resourceServerStore、clientStore并按revoked:{poolId}:前缀清理吊销令牌记录同时校验记录自身携带的userPoolId归属避免前缀误伤 ID 以该字符串开头的其他池最后清理验证码与 identity provider 后删除池本身。floci:override-cognito-client-id取值分三种模式use-name直接用客户端名称作为 client IDappend-to-name:-somestring在客户端名称后追加字符串作为 client IDprepend-to-name:somestring-在客户端名称前拼接字符串作为 client ID。对应实现在clientIdFor()CognitoService.java三种模式都不命中时回退为UUID.randomUUID()去掉连字符后取前 26 位。getClientIdOverride()会先校验模式取值非法模式直接抛InvalidParameterException。floci:override-cognito-client-secret为在该用户池中创建的所有 App Client 设置密钥。createUserPoolClient在GenerateSecrettrue时会优先使用该覆盖值空字符串会被拒绝否则随机生成见 CognitoService.java。这些保留标签由ReservedTags统一管理stripReservedTags()在创建和更新路径上都会把floci:*标签从存储与返回的UserPoolTags中剥离因此这个标签命名空间只是一个仅输入的控制通道永远不会作为用户可见元数据持久化。校验规则包括值不能为空、不能含空白与控制字符override-id还不能包含/、?、#。独立的TagResource会拒绝保留的floci:*键而ListTagsForResource与UntagResource操作的是持久化的用户池标签映射。此外凡是给定用户池 ID 无法解析的 Action都会返回与线上服务一致的ResourceNotFoundException错误文案为User pool poolId does not exist.这样本地依赖 Cognito 错误文本做匹配的工具链行为与云端保持一致。支持的 Action 全景Floci 覆盖了 Cognito 用户池体系的主要控制面与数据面操作下面按类别逐一说明。用户池User PoolsAction说明CreateUserPool创建本地用户池应用来自标签的受支持floci:*创建时覆盖项DescribeUserPool返回存储的用户池配置ListUserPools列出请求区域下可见的本地用户池UpdateUserPool更新可变的用户池设置与持久化标签DeleteUserPool删除用户池及其全部归属资源用户、组、App Client、资源服务器、身份提供者、已吊销令牌与验证码仍配置域名时以InvalidParameterException拒绝GetUserPoolMfaConfig返回用户池的 MFA 模式配置后返回其软件令牌设置SetUserPoolMfaConfig设置MfaConfigurationOFF/ON/OPTIONAL与SoftwareTokenMfaConfigurationMFA 配置遵循与线上服务一致的校验语义缺省MfaConfiguration视为OFF关闭 MFA 会一并丢弃因子配置OFF与 software-token、email 或 SMS 因子并存会被拒绝ON/OPTIONAL却没有这三种因子之一也会被拒绝——两种校验都是看成员是否存在而不是其Enabled值。WebAuthnConfiguration像在 AWS 中一样独立于这两条规则。SMS、email 与 WebAuthn 配置会被校验但不存储Floci 无法投递这些因子保留配置会暗示其并不具备的能力。用户池标签User Pool TagsAction说明TagResource向用户池添加用户可见标签并拒绝保留的floci:*标签键UntagResource从用户池的持久化标签映射中移除标签ListTagsForResource返回持久化的用户池标签用户池客户端User Pool ClientsAction说明CreateUserPoolClient为用户池创建 App Client支持可选的生成密钥处理DescribeUserPoolClient返回存储的 App Client 配置ListUserPoolClients列出用户池的 App ClientDeleteUserPoolClient从用户池删除 App ClientCreateUserPoolClient的完整校验与默认行为见 CognitoService.javaSupportedIdentityProviders为空时默认写入COGNITOEnableTokenRevocation缺省为true生成密钥时记录clientId--epochMillis形式的密钥版本条目便于后续轮换。资源服务器Resource ServersAction说明CreateResourceServer为用户池注册资源服务器与 scopeDescribeResourceServer返回已注册的资源服务器ListResourceServers列出用户池的资源服务器UpdateResourceServer更新资源服务器的名称与 scopeDeleteResourceServer从用户池删除资源服务器身份提供者Identity ProvidersAction说明CreateIdentityProvider在用户池上注册联合身份提供者DescribeIdentityProvider返回已注册的身份提供者ListIdentityProviders以 name/type/date 摘要形式列出用户池的提供者UpdateIdentityProvider更新提供者的详情、属性映射或标识符DeleteIdentityProvider删除身份提供者提供者可用于通用的 OIDC 授权码登录。Floci 将 AWS 形态的/oauth2/authorize与/oauth2/idpresponse端点路由到配置的本地 OIDC 提供者交换返回的 code供给或协调联合用户并为已注册的 callback 签发 Cognito 授权码。该流程仅支持ProviderTypeOIDCFloci 不提供内置 hosted UI也不实现 Google、Facebook、Login with Amazon、SignInWithApple 等社交提供者。由于不向第三方发起调用这里存在两处有意的 AWS 分歧ProviderDetails无创建时校验。AWS 在处理CreateIdentityProvider时会解析 OIDC 提供者的oidc_issuerdiscovery 文档不可达时拒绝调用Floci 将ProviderDetails原样存储、不发任何出站请求因此也不强制各提供者类型必填的键。不注入提供者默认值。AWS 会向 OIDC 提供者的存储详情中注入如attributes_url_add_attributes之类的键Floci 只返回调用方提供的字段。AttributeMapping与IdpIdentifiers遵循 AWS 的更新语义请求省略的成员保持不变显式传入空 map/list 才是清空。IdpIdentifiers只在请求提供时被CreateIdentityProvider/UpdateIdentityProvider回显无论存储值如何而DescribeIdentityProvider总是返回它。用户池域名User Pool DomainsAction说明CreateUserPoolDomain创建 Cognito 前缀域名给定CustomDomainConfig.CertificateArn时创建自定义域名。与 AWS 一致证书必须存在于 us-east-1 的 ACM 中且状态为ISSUED域名在证书的InUseBy下列出直到被删除DescribeUserPoolDomain返回域名描述自定义域名包含CloudFrontDistributionUpdateUserPoolDomain原地替换自定义域名的证书或更改托管登录版本域名保留其CloudFrontDistributionInUseBy条目转移到新证书DeleteUserPoolDomain从用户池删除域名自定义域名用CustomDomainConfig创建的域名会在该主机上应答 OAuth 端点与 AWS 一致POST https://auth.example.localhost.floci.io/oauth2/token GET https://auth.example.localhost.floci.io/oauth2/userInfo请求按Host头匹配因此该名称必须能解析到 Floci任何*.localhost.floci.io都可以HTTPS 场景还需启用 TLS。域名会锁定其用户池与创建它的账号因为这些请求不携带 AWS 凭证来自其他池的client_id以invalid_client拒绝其他池签发的 access token 以invalid_token拒绝。域名在所有账号间全局唯一与 AWS 一致。池的openid-configuration在存在自定义域名时会通告自定义域名 URL。前缀域名prefix.auth.region.amazoncognito.com会被存储但不路由——该主机名永远不会到达 Floci。/login与/logout不在任何主机上提供服务。启用 TLS 时自定义域名设置了CustomDomainConfig一经创建就会被加入 Floci 的服务端证书因此https://domain无需重启即可验证可接受的证书后缀见 TLS 配置说明。前缀域名在 AWS 上由amazoncognito.com提供服务而非 Floci因此保持原样不动。自定义域名的路由逻辑在 CognitoCustomDomainFilter.java 中实现这是一个PreMatching容器请求过滤器拦截/oauth2/*路径按HostHTTP/2 无 Host 头时回退到请求 URI 的 authority查找自定义域名命中后把路径重写为/cognito-idp/oauth2/*并通过请求属性注入池 ID 与锁定账号POOL_PROPERTY与PINNED_ACCOUNT_PROPERTY。属性而非请求头的方式防止调用方伪造且在过滤器与处理器之间域名被删除时处理器不会错误放行。日志投递Log DeliveryAction说明SetLogDeliveryConfiguration替换用户池的日志投递配置GetLogDeliveryConfiguration返回用户池的日志投递配置LogLevel接受ERROR或INFOEventSource接受userNotification或userAuthEvents。LogConfigurations最多 2 条且同一事件源在全部条目中只能出现一次。每条必须命名一个目标CloudWatchLogsConfiguration、FirehoseConfiguration或S3Configuration缺失目标的请求会被拒绝与 AWS 一致。Set是整表替换而非合并因此空的LogConfigurations即清空Get总是返回该成员未配置时为[]。长度与枚举校验在查找用户池之前执行因此针对不存在池的超长或畸形请求报告的是请求本身的问题而不是ResourceNotFoundException并且所有违规会在同一条消息中一次性报出。Floci 只存储配置、从不向目标投递任何日志日志组、投递流或桶不会被写入也不要求存在。还有两处有意的分歧无定价层级门槛。AWS 会以FeatureUnavailableInTierException拒绝ESSENTIALS层级池上的userAuthEventsFloci 无论UserPoolTier如何都接受两种事件源。无目标校验。AWS 会校验传入的 ARNFloci 按原样存储。管理员用户管理Admin User ManagementAction说明AdminCreateUser在用户池中创建用户或重新发送初始设置AdminGetUser返回用户的存储属性与状态AdminDeleteUser从用户池删除用户AdminSetUserPassword设置用户密码与永久密码状态AdminUpdateUserAttributes更新用户池中用户的属性AdminLinkProviderForUser将外部 IdP 身份链接到现有用户的identities属性用户操作User OperationsAction说明SignUp为 App Client 创建自助注册用户ConfirmSignUp确认待处理的自主注册GetUser返回已认证 access-token 用户的属性GetUserAttributeVerificationCode为已认证用户的 email 或 phone_number 属性签发验证码VerifyUserAttribute用签发的验证码验证 email 或 phone_number 属性UpdateUserAttributes更新已认证 access-token 用户的属性ChangePassword修改已认证用户的密码ForgotPassword启动本地忘记密码流程ConfirmForgotPassword通过设置替代密码完成忘记密码流程认证AuthenticationAction说明InitiateAuth通过受支持的用户密码与 SRP 风格流程认证 App Client 用户AdminInitiateAuth为用户池用户启动管理认证流程RespondToAuthChallenge响应受支持的 Cognito 认证挑战SRPUSER_SRP_AUTH流程的服务端实现在 CognitoSrpHelper.java 中实现 Cognito 使用的Caldera 变体——RFC 5054 的 3072 位素数 N、g 2、k SHA-256(N || pad(g))、x SHA-256(salt || SHA-256(poolName username : password))会话密钥用info Caldera Derived Key的 HKDF 派生。源码注释特别强调k的字节布局必须与 Amplify 客户端的getBytesFromHex(getPaddedHex(N) getPaddedHex(g))完全一致即 N 与 g 的最小二进制补码表示否则客户端 S 值发散、PASSWORD_VERIFIER签名永远不匹配——这正是本地 SRP 登录能跑通的关键细节。用户列表User ListingAction说明ListUsers列出用户池中存储的用户用户属性更新验证CreateUserPool、UpdateUserPool、DescribeUserPool均支持UserAttributeUpdateSettings.AttributesRequireVerificationBeforeUpdate用于email和phone_number。对于列入该设置的属性UpdateUserAttributes在新值待验证期间保留现有的已验证值与登录别名它向待验证目的地发送验证码并在CodeDeliveryDetailsList中返回对应条目。成功的VerifyUserAttribute会提升待验证值、切换别名并把对应的*_verified属性置为true。未设置该选项时UpdateUserAttributes立即替换值并把对应*_verified属性置为false直到验证成功。验证码仍会发送到替换值但 Cognito 不再保留或暴露旧值对于别名属性旧别名被立即移除替换值只有在验证成功后才能用于登录。错误或过期的验证码不会提升待验证值也不会改变其验证状态。组GroupsAction说明CreateGroup在用户池中创建组GetGroup返回用户池组UpdateGroup更新用户池组的存储设置ListGroups列出用户池中的组ListUsersInGroup列出组内的用户DeleteGroup从用户池删除组AdminAddUserToGroup将用户加入组AdminRemoveUserFromGroup将用户移出组AdminListGroupsForUser列出分配给用户的组托管登录品牌Managed Login BrandingAction说明CreateManagedLoginBranding为 App Client 创建品牌DescribeManagedLoginBranding按 ID 返回品牌DescribeManagedLoginBrandingByClient返回挂在 App Client 上的品牌UpdateManagedLoginBranding更新品牌的设置、资产或 provided-values 标志DeleteManagedLoginBranding从 App Client 删除品牌CreateManagedLoginBranding必须指定UseCognitoProvidedValues或Settings之一两者皆缺被拒绝。每个 App Client 只能有一个品牌对同一 client 的第二次创建以ManagedLoginBrandingExistsException拒绝。ManagedLoginBrandingId必须是 v4 UUID格式错误会在查找前被拒绝与 AWS 一致。Assets在创建和更新时最多 40 条。调用方未提供Settings时响应中省略该成员而Assets总是返回更新时省略的成员保持不变。资产数量与品牌 ID 校验在查找池、client 或品牌之前执行因此针对不存在资源的超量请求报告的是请求问题而非ResourceNotFoundException同时违反两项的更新在同一条消息中报告资产列表在前。品牌是 hosted UI 的展示内容而 Floci 不提供 hosted UI所以品牌被存储与返回而非渲染。由此产生三处分歧Settings原样存储。AWS 会按深度 schema 校验未知属性以Invalid settings provided. Validation errors: [{property: $.components...., errorType: UnknownProperty}]拒绝该 schema 未公开因此 Floci 接受任意对象。类型错误的Settings返回客户端错误。AWS 对这种输入返回InternalErrorException与 500Floci 返回SerializationException: Unexpected field type——这是 AWS 对类型错误的Assets的返回方式。复刻别人的 500 不如保持一致。不兑现ReturnMergedResources。在 AWS 上它会把 Cognito 自身的默认设置与资产合并进响应8 个已配置资产时返回 38 个复刻这需要 Cognito 的默认语料因此 Floci 无论该标志如何都返回存储的品牌。Well-Known 与 OAuth 端点OAuth 端点既支持浏览器风格的 OIDC 授权码登录也支持模拟器友好的 client-credentials 流程GET /cognito-idp/oauth2/authorize校验 App Client 与 callback然后用不透明 state 与 nonce 重定向到配置的提供者。GET /cognito-idp/oauth2/idpresponse消费提供者 state交换提供者 code并以一次性 Cognito 授权码重定向回已注册 callback。POST /cognito-idp/oauth2/token一次性兑换该授权码或为grant_typeclient_credentials签发机器令牌。端点控制器实现在 CognitoOAuthController.javaauthorize校验response_typecode、client 存在、AllowedOAuthFlowsUserPoolClienttrue且允许code流程、redirect_uri已注册随后委托CognitoFederationService发起联合授权自定义域名场景下还会校验请求所落池与 client 归属池一致不一致返回invalid_client。POST /cognito-idp/oauth2/token刻意做成模拟器友好而非完整的 Cognito 对等实现要求存在有效的client_id。client_id/client_secret可从表单体或 Basic auth 获取。client-credentials 要求以GenerateSecrettrue创建的机密型 App Client。授权码兑换会校验 client、callback URI 与一次性 code 的绑定关系。要求AllowedOAuthFlowsUserPoolClienttrue且AllowedOAuthFlows[client_credentials]。不要求Cognito 域名。client-credentials 只返回access_token、token_type、expires_in授权码兑换返回 Cognito 的 access、ID 与 refresh token 集合。校验请求的 OAuth scope 与 App Client 的AllowedOAuthScopes及池注册的资源服务器 scope。在/{userPoolId}/.well-known/openid-configuration中通告带前缀的令牌端点池有自定义域名时通告https://domain/oauth2/token见上文自定义域名。登录标识UsernameAttributes对于以UsernameAttributes创建的用户池例如--username-attributes emailFloci 遵循真实 Cognito 语义AdminCreateUser/SignUp接受 email或手机号作为登录值但规范的Username是自动生成的、不可变的、等于sub的 UUID。提交的 email 作为可变别名属性存储。ListUsers、AdminGetUser与 Lambda 触发器的event.userName都报告UUID而非 emailemail 位于email属性与event.request.userAttributes.email中。登录按当前email 别名或UUID 解析。SECRET_HASH针对发送的精确USERNAME值校验Base64(HMAC-SHA256(USERNAME clientId, clientSecret))。在CUSTOM_AUTH/SRP 流程中ChallengeParameters.USERNAME回显UUID与真实 AWS 一致该轮RespondToAuthChallenge的SECRET_HASH按当轮发送的USERNAME校验。该USERNAME必须仍能解析到会话的用户——UUID 或其任一当前别名——指向其他用户的值以NotAuthorizedException拒绝。AdminUpdateUserAttributes可以修改 email之后新 email 可登录、旧 email 失败而Username/sub保持不变。AdminCreateUser上的重复 email/phone传入别名未验证时抛UsernameExistsException已验证email_verifiedtrue时抛AliasExistsException传ForceAliasCreationtrue可将已验证别名从前所有者迁移。在AdminUpdateUserAttributes上改到已占用别名抛AliasExistsException。没有UsernameAttributes的池经典池以及使用AliasAttributes的池保持你提交的字面Username原样不变。令牌声明Token claimsFloci 复刻 AWS 的 access-token / ID-token 分工Access tokensub、usernameUUID、scopeAPI 登录时为aws.cognito.signin.user.admin、client_id、cognito:groups、jti/origin_jti。不携带cognito:username或email等用户属性。ID tokensub、cognito:username、aud以及可读的用户属性email、email_verified、phone_number、custom:*等。属性声明按 App Client 的ReadAttributes过滤未设置/空列表表示全部属性可读。未找到类错误ResourceNotFoundException、UserNotFoundException返回 HTTP400与 Cognito JSON 协议一致。配置项变量默认值说明FLOCI_SERVICES_COGNITO_ENABLEDtrue启用或禁用该服务端到端示例以下示例用awsCLI 走通用户池、App Client、资源服务器、用户、认证、组与 OAuth 令牌的完整链路export AWS_ENDPOINT_URLhttp://localhost:4566 # Create a user pool POOL_ID$(aws cognito-idp create-user-pool \ --pool-name MyApp \ --query UserPool.Id --output text \ --endpoint-url $AWS_ENDPOINT_URL) # Create an app client CLIENT_ID$(aws cognito-idp create-user-pool-client \ --user-pool-id $POOL_ID \ --client-name my-client \ --generate-secret \ --allowed-o-auth-flows-user-pool-client \ --allowed-o-auth-flows client_credentials \ --allowed-o-auth-scopes notes/read notes/write \ --query UserPoolClient.ClientId --output text \ --endpoint-url $AWS_ENDPOINT_URL) # Retrieve the generated client secret CLIENT_SECRET$(aws cognito-idp describe-user-pool-client \ --user-pool-id $POOL_ID \ --client-id $CLIENT_ID \ --query UserPoolClient.ClientSecret --output text \ --endpoint-url $AWS_ENDPOINT_URL) # Register a resource server and scopes aws cognito-idp create-resource-server \ --user-pool-id $POOL_ID \ --identifier notes \ --name Notes API \ --scopes ScopeNameread,ScopeDescriptionRead notes ScopeNamewrite,ScopeDescriptionWrite notes \ --endpoint-url $AWS_ENDPOINT_URL # Create a user aws cognito-idp admin-create-user \ --user-pool-id $POOL_ID \ --username aliceexample.com \ --temporary-password Temp1234! \ --endpoint-url $AWS_ENDPOINT_URL # Set a permanent password aws cognito-idp admin-set-user-password \ --user-pool-id $POOL_ID \ --username aliceexample.com \ --password Perm1234! \ --permanent \ --endpoint-url $AWS_ENDPOINT_URL # Authenticate aws cognito-idp initiate-auth \ --auth-flow USER_PASSWORD_AUTH \ --client-id $CLIENT_ID \ --auth-parameters USERNAMEaliceexample.com,PASSWORDPerm1234! \ --endpoint-url $AWS_ENDPOINT_URL # Create a group aws cognito-idp create-group \ --user-pool-id $POOL_ID \ --group-name admin \ --description Admin group \ --endpoint-url $AWS_ENDPOINT_URL # Add user to group aws cognito-idp admin-add-user-to-group \ --user-pool-id $POOL_ID \ --group-name admin \ --username aliceexample.com \ --endpoint-url $AWS_ENDPOINT_URL # List groups for user aws cognito-idp admin-list-groups-for-user \ --user-pool-id $POOL_ID \ --username aliceexample.com \ --endpoint-url $AWS_ENDPOINT_URL # Fetch the pool discovery document curl -s $AWS_ENDPOINT_URL/$POOL_ID/.well-known/openid-configuration # Get a machine access token from the OAuth endpoint curl -s \ -X POST $AWS_ENDPOINT_URL/cognito-idp/oauth2/token \ -H Content-Type: application/x-www-form-urlencoded \ -u $CLIENT_ID:$CLIENT_SECRET \ --data-urlencode grant_typeclient_credentials \ --data-urlencode scopenotes/read notes/write如果想用floci:*保留标签固定资源 ID只需在create-user-pool时传入--tags Keyfloci:override-id,Valueus-east-1_MyFixedPool这类参数即可标签仅创建时生效且会被从持久化与返回的标签中剥离。JWT 验证Floci 签发的令牌可以用 Discovery 与 JWKS 端点验证http://localhost:4566/$POOL_ID/.well-known/openid-configurationhttp://localhost:4566/$POOL_ID/.well-known/jwks.json令牌在已认证用户属于一个或多个组时以 JSON 数组形式携带cognito:groups声明。Cognito 认证流程与 OAuth 令牌端点签发的令牌其iss使用模拟器基础 URL 加用户池 IDhttp://localhost:4566/$POOL_ID这使得 issuer、Discovery 文档、JWKS URL 与令牌端点在本地 JWT 校验场景下内部自洽同时支持 LocalStack 风格的机密型客户端与资源服务器背书的 scope。相关实现与测试线索想深入源码与行为契约的读者可以按以下线索继续探索服务核心CognitoService.java用户池/客户端/资源服务器/域/组/令牌签发的全量实现保留标签ReservedTags.javafloci:*命名空间的提取、校验与剥离OAuth 端点CognitoOAuthController.java、CognitoFederationService.javaDiscovery/JWKSCognitoWellKnownController.java自定义域名路由CognitoCustomDomainFilter.javaSRP 服务端实现CognitoSrpHelper.java验证码与消息投递VerificationCodeService.java、CognitoMessageDispatcher.java集成测试覆盖src/test/java/io/github/hectorvent/floci/services/cognito/下的CognitoIntegrationTest.java、CognitoDeleteUserPoolCascadeIntegrationTest.java级联删除、CognitoCustomDomainOAuthContractIntegrationTest.java自定义域名 OAuth 契约、CognitoAliasUsernameIntegrationTest.javaUsernameAttributes语义、CognitoOAuthTokenIntegrationTest.javaOAuth 令牌、CognitoSetUserPoolMfaConfigIntegrationTest.javaMFA 校验、CognitoManagedLoginBrandingIntegrationTest.java品牌存储等可用于验证文中描述的各项行为。赞分享【免费下载链接】flociLight, fluffy, and always free - The AWS Local Emulator alternative项目地址https://gitcode.com/gh_mirrors/fl/floci点击查看免费下载相关推荐NorthwindTraders身份认证与授权OIDC与JWT的完整实现NorthwindTraders身份认证与授权OIDC与JWT的完整实现 在现代Web应用开发中 身份认证与授权 是保障系统安全的核心要素。Northwin后端前端示例工程Headlamp 接入 EKS 与 Cognito OIDC 认证从用户池配置到 Helm 部署完整实战Headlamp 接入 EKS 与 Cognito OIDC 认证从用户池配置到 Helm 部署完整实战 导读 本文是一份端到端实战指南讲解如何以 AWS云原生开发工具Floci 的 Amazon Cognito Identity 模拟实现身份池管理面 API 全解析Floci 的 Amazon Cognito Identity 模拟实现身份池管理面 API 全解析 导读 本文围绕 floci 开源仓库中 cognitoi上一篇tsdown root 选项详解掌控输出目录结构映射让入口路径与产物一一对应下一篇ShutterLinux平台上一站式截图解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询