我正在使用 AWS Amplify 创建一个网站平台,该平台主要用作其注册用户的目录,具有与业务领域相关的各种属性。该平台的两个主要的用户将被注册用户和正常的未经验证的用户谁就能名单,并根据他们的属性,如注册用户筛选location
,age
等注册用户将被设置在会员区全部属性。
一些属性存储在 Cognito 中,例如name
和address
并且使用 Amplify Authentication设置。这些是我希望通过 Amplify GraphQL功能进行查询和变异的字段。
我可以看到使用@auth
指令可以实现很酷的授权模式。
是否可以利用 GraphQL 转换,以便我可以创建一个模型模式,其中一些字段链接到 Cognito 用户池,而另一些字段在 GraphQL 模式中定义,以便它们可查询和可变?事实上,我想为注册用户提供更新除电子邮件之外的所有字段的功能。或者,我可以将 Amplify 支持的某些服务组合在一起以实现相同的目标?
我是 AWS Serveless 生态系统的新手,到目前为止,它一直令人兴奋!
amazon-web-services aws-cloudformation amazon-cognito graphql aws-amplify
我使用 AWS Cognito SDK 创建了一个 .net Core API,通过将凭证发布到我的 API 并将 JWT 返回到一个简单的客户端应用程序(纯 HTML/TypeScript)来对用户进行身份验证和授权。该请求包含用户名和密码。
...
var response = await cognito.AdminInitiateAuthAsync(request);
return Ok(response.AuthenticationResult.AccessToken);
Run Code Online (Sandbox Code Playgroud)
对比
return Ok(response.AuthenticationResult.IdToken);
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是理解为什么有 ID 令牌和访问令牌。我能够使用 [Authorize] 属性保护控制器端点。客户端应用程序使用带有 Bearer {token} 的 Authorization 标头。
在我的 Startup.cs 中,我能够AddAuthentication
验证 ID 令牌的签名、发行者、受众和生命周期。但是,我读到 ID 令牌包含有关用户身份的声明,但不包含有关用户授权组的声明。如果我将访问令牌发送给我的客户端并尝试将其发送回我的 API,我将获得未授权。也许我没有正确验证令牌,但我仍然不明白为什么有两种不同类型的令牌。访问令牌更适合用于根据令牌包含的声明创建不同的身份验证策略。
我理解 JWT 的工作方式是,一旦客户端获得令牌,它就会存储它并将其用于对 API 的所有请求。我不明白这应该如何与两个令牌一起使用。
这是我尝试验证访问令牌的方式:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>{
options.TokenValidationParameters = new TokenValidationParameters
{
IssuerSigningKeyResolver = (s, securityToken, identifier, parameters) =>
{
// get JsonWebKeySet from AWS
var json = new WebClient().DownloadString(parameters.ValidIssuer + "/.well-known/jwks.json"); …
Run Code Online (Sandbox Code Playgroud) 我有一个正在进行的 flutter 项目,它将使用 AWS 作为后端服务。首先,我尝试使用 AWS Cognito 完成用户身份验证。我想为用户提供通过 Google 登录的选项。所以我需要在用户池中设置社交身份提供者。在 console.developers.google.com 上设置控制台时,我们必须选择它是 Android 应用程序还是 iOS 应用程序(以及网络服务器或网站等...)由于 Flutter 是一个跨平台框架应用程序将被两个平台使用。所以我的问题是我是否必须为 android 和 iOS 设置两次谷歌注册。如果我再次这样做,则会引发另一个问题。如何在 Cognito 的一个应用程序客户端中为两个平台应用两个不同的客户端 ID。AWS 和 Google 的文档对这些问题没有帮助/明确。
google-authentication amazon-web-services oauth-2.0 amazon-cognito flutter
我正在测试从 Angular 到 Cognito 用户池的 AWS Amplify,如下所示:
https://docs.amplify.aws/lib/restapi/getting-started/q/platform/js
Angular 应用程序已成功编译,但在 Chrome 控制台中抛出异常:
index.js:43 Uncaught ReferenceError: global is not defined
at Object../node_modules/buffer/index.js (index.js:43)
at __webpack_require__ (bootstrap:84)
at Module../node_modules/amazon-cognito-identity-js/es/AuthenticationHelper.js (AuthenticationHelper.js:1)
at __webpack_require__ (bootstrap:84)
at Module../node_modules/amazon-cognito-identity-js/es/index.js (index.js:1)
at __webpack_require__ (bootstrap:84)
at Module../node_modules/@aws-amplify/auth/lib-esm/Auth.js (Auth.js:1)
at __webpack_require__ (bootstrap:84)
at Module../node_modules/@aws-amplify/auth/lib-esm/index.js (index.js:1)
at __webpack_require__ (bootstrap:84)
Run Code Online (Sandbox Code Playgroud)
有什么想法吗?
我正在使用 AWS CLI 启用仅具有 TOTP MFA(无 SMS)的 MFA 用户池。
aws cognito-idp set-user-pool-mfa-config --user-pool-id xxxx_xxxx --mfa-configuration 可选 --software-token-mfa-configuration Enabled=true
{
"SoftwareTokenMfaConfiguration": {
"Enabled": true
},
"MfaConfiguration": "OPTIONAL"
}
Run Code Online (Sandbox Code Playgroud)
看起来还行吧?但是当我尝试设置用户首选项时,我不断收到此错误:
调用 AdminSetUserMFAPreference 操作时发生错误 (InvalidParameterException):用户尚未设置软件令牌 mfa
命令: aws cognito-idp admin-set-user-mfa-preference --user-pool-id xxxx_xxxx --username username@email.com --software-token-mfa-settings Enabled=true
尝试使用 admin-set-user-preference 也不起作用: aws cognito-idp admin-set-user-settings --user-pool-id us-xxxx-xxxx--username username@email.com --mfa -option DeliveryMedium=EMAIL
调用 AdminSetUserSettings 操作时发生错误 (InvalidParameterException):当前仅支持 phone_number 属性作为 MFA 选项。
我错过了什么?它是否需要文档中未提及的额外配置?
首先,您需要为用户获取 ACCESS_TOKEN 并继续启动 TOTP 过程:
aws cognito-idp associate-software-token --access-token ACCESS_TOKEN
(这将生成一个您可以在 Google Authenticator 中使用的唯一代码)
使用从 …
我正在尝试使用 AWS CDK 创建一个与现有 AWS 资源相关联的新 lambda,这些资源不是使用 CDK 创建的并且属于不同堆栈的一部分。
我可以使用 CDK 从已经存在的用户池中触发我的 lambda 吗?我已使用以下方法将用户池导入到我的新堆栈中:
const userPool = UserPool.fromUserPoolArn(this, 'poolName, 'arn:aws:cognito-idp:eu-west-1:1234567890:userpool/poolName')
但是,这给了我一个IUserPool
没有addTrigger
方法的方法。有没有办法将其转换为 aUserPool
以便能够触发 lambda(因为我可以看到它UserPool
具有该addTrigger
方法)?
我已经看到,例如可以使用 CDK 授予我的新 lambda 读取/写入现有 DynamoDB 表的权限。而且我不太明白这里的区别:DynamoDB 是一个现有的 AWS 资源,我正在使用 CDK 将其导入新堆栈,然后允许我的新 lambda 对其进行修改。Cognito 用户池也是一个现有的 AWS 资源,我可以在 CDK 中导入它,但似乎我无法修改它?为什么?
我一直在使用启用 MFA 的 Python、Django 和 Boto3 创建 AWS Cognito 流。
我的身份验证流程如下:
initial_auth : 在 django rest 端点上调用
response = client.initiate_auth(
ClientId=settings.AWS_COGNITO_CLIENT_ID,
AuthFlow='USER_PASSWORD_AUTH',
AuthParameters={
'USERNAME': email,
'SECRET_HASH': get_secret_hash(email),
'PASSWORD': password,
}
)
if "ChallengeName" in response:
data["mfa"] = True
data["session"] = response["Session"]
Run Code Online (Sandbox Code Playgroud)
response_to_auth_challenge : 在单独的 django rest 端点上调用
response = client.respond_to_auth_challenge(
ClientId=settings.AWS_COGNITO_CLIENT_ID,
ChallengeName='SMS_MFA',
Session=session,
ChallengeResponses={
'USERNAME': email,
'SMS_MFA_CODE': code,
'SECRET_HASH': get_secret_hash(email),
}
)
Run Code Online (Sandbox Code Playgroud)
基于这篇文章,我想实现确认设备,以便在下次登录时跳过 MFA。因此,在响应身份验证挑战后,我有以下代码:
device_key = response['AuthenticationResult']['NewDeviceMetadata']['DeviceKey']
device_group_key = response['AuthenticationResult']['NewDeviceMetadata']['DeviceGroupKey']
device_password, device_secret_verifier_config = generate_hash_device(device_group_key, device_key)
device = client.confirm_device( …
Run Code Online (Sandbox Code Playgroud) 使用联合身份提供商登录时,有没有一种方法可以通过 federatedSignIn 调用添加自定义属性,以便我们可以将它们映射到 Cognito 用户池的自定义属性内。我有以下场景:
网站: https: //www.example.com/invite/:用户名-> google/facebook 登录(federatedSignIn 调用在此处) -> 返回我的应用程序(cognito 返回经过身份验证的用户信息)。
我想跟踪邀请链接中存在的用户名,并将其设置为用户池中用户的自定义属性。
这可以通过联合登录实现吗?
谢谢
我们使用 vertx oauth2 组件来使用 oauth2 授权代码授予来实现 cognito 登录。我们可以使用现有的 API 来实现该场景。但 vertx 期望其 oauth2 配置中的令牌内省路径。否则,无法询问 Cognito 向资源服务器提供的令牌是否正确。无论如何,我们在 cognito 文档上找不到任何关于令牌内省上下文路径是什么的信息。
OAuth2ClientOptions oAuth2ClientOptions = new OAuth2ClientOptions()
.setClientID("***************************")
.setIntrospectionPath("") //what should goes here
.setClientSecret("********************")
.setSite("*****************")
.setTokenPath("/oauth2/token")
.setAuthorizationPath("/oauth2/authorize")
.setFlow(OAuth2FlowType.AUTH_CODE)
Run Code Online (Sandbox Code Playgroud) 在应用程序中,我尝试使用单独的按钮分别链接到 Amazon Cognito 用户池托管 UI 的注册和登录页面,但到目前为止我只能链接到登录页面。
我正在使用npm 中的AWS Amplify 包,我的代码可能如下所示:
import { Auth } from "aws-amplify";
//...
function openSignIn() {
Auth.federatedSignIn();
}
function openSignUp() {
// ???
}
Run Code Online (Sandbox Code Playgroud)
我没有找到任何federatedSignUp()
可以接受相关选项的函数。
注册页面的 URL 为:
<domain>/signup?redirect_uri=<redirect_uri>&response_type=<response_typ>&client_id=<client_id>&identity_provider=<identity_provider>&scopes=<scopes>&state=<state>
Run Code Online (Sandbox Code Playgroud)
虽然我知道所有参数的值,但我不知道参数的值state
,这使得很难在锚标记中立即使用它,即使我不喜欢这个解决方案。
有没有适当/优雅的解决方案?
javascript amazon-web-services amplifyjs amazon-cognito aws-amplify
amazon-cognito ×10
aws-amplify ×4
oauth-2.0 ×2
amplifyjs ×1
angular ×1
api ×1
asp.net-core ×1
aws-cdk ×1
aws-lambda ×1
boto3 ×1
django ×1
flutter ×1
graphql ×1
javascript ×1
multi-factor-authentication ×1
python-3.x ×1
totp ×1
vert.x ×1