AWS Amplify 'currentUserCredentials()' 返回意外的身份验证值,错误?

Posted

技术标签:

【中文标题】AWS Amplify \'currentUserCredentials()\' 返回意外的身份验证值,错误?【英文标题】:AWS Amplify 'currentUserCredentials()' returns unexpected authenticated value, bug?AWS Amplify 'currentUserCredentials()' 返回意外的身份验证值,错误? 【发布时间】:2021-05-17 14:07:13 【问题描述】:

在 Auth.signIn() 之后调用 Auth.currentUserCredentials() 时,我获得了有效的有效凭据,但对于未经身份验证的用户,为什么?

代码:

   async signIn( dispatch, state ,  email, password ) 

  try 
    const user = await Auth.signIn(email, password);
    console.log("User state after login")
    const userCredentialsAfterLogin = await Auth.currentUserCredentials();
    console.log(userCredentialsAfterLogin)

   catch (error) 
    console.log("error")
    console.log(error)
    return
  
  await dispatch('fetchUser')
,

预期行为:

使用有效用户登录后,Auth.currentUserCredentials() 应返回一组经过身份验证的凭据。

实际行为:

Auth.currentUserCredentials() 返回未经身份验证的用户,身份验证属性设置为 false 和 400 错误,“ResourceNotFoundException: IdentityPool 'eu-west-1:62dab5ed-5a84-4064 -a7a2-87d1d0df511b'

系统:

身份验证流类型:“USER_SRP_AUTH” 版本:“aws-amplify”:“^3.3.14”,“aws-amplify-vue”:“^2.1.4”,放大版本 4.42.0

配置


  "authSelections": "userPoolOnly",
  "resourceName": "testapp89e81d50",
  "serviceType": "imported",
  "region": "eu-west-1"

【问题讨论】:

【参考方案1】:

我了解您的来源,老实说,我无法真正向您展示清晰的文档来准确说明为什么这不起作用。关于 Cognito 和 Amplify 的 AWS 文档很难拼凑起来,因为 Amplify 框架在底层仍然使用旧库(“amazon-cognito-identity-js”),而 Cognito 是两个连接登录的名称 - IAM 和注册/登录即服务产品。如果操作正确,Cognito 在安全性方面非常强大且坚如磐石,但设置起来有点麻烦。

有一些文档,例如Amplify Auth here 的 API 文档。您可以在那里看到 currentCredentials / currentUserCredentials 为您提供了一些object,其中包含一个“identitiId”。在 Amplify Auth 框架中,凭证是指 AWS IAM 凭证,该凭证是指 Cognito 身份。

您似乎正在使用 Amplify 使用电子邮件/密码登录到 Cognito 用户池。 Cognito 用户池可以连接到 Cognito 识别池,以“交换”Cognito JWT 令牌以获得可用于使用 AWS 资源的某些凭证(IAM 凭证)。不过,正常的登录/注册流程不需要这样做。

那么,问题是:你想要什么?

    您是否想了解当前登录的 Cognito 用户池用户,例如他的电子邮件、JWT 令牌和存储在 JWT 令牌中的其他字段?使用“currentUserInfo”或“currentUserSession”

    您真的想要一些 IAM 凭证来调用 AWS 资源吗?确保创建 Cognito 用户池并将其与 Cognito 身份池连接,并在前端设置中配置身份池 ID。如果你这样做了,你应该可以使用“currentCredentials”。

【讨论】:

嗨,布拉姆,感谢您的详细回复。我可能需要再读一遍才能完全消化。也许我误解了一些基本原理。关于我想做的事。我有两件事。第一个是确定用户是否登录,第二个是获取用于与服务器或 API 交互的 JWT。即也许 Auth.currentAuthenticatedUser()? 我测试了以下“const user = await Auth.currentAuthenticatedUser()”,但我仍然得到一个空白会话。我导入了我的 UserPool,可能设置不正确。 我刚刚使用我的 AWS Config 更新了 OP。查看值“userPoolOnly”并尝试理解您的第 2 点。 'Auth.signIn' 的结果是什么? 貌似配置了身份池,其实没有。仔细检查您的配置,看看您是否设置了一些应该是身份池的属性。如果您没有身份池,则此属性应为空/未设置。

以上是关于AWS Amplify 'currentUserCredentials()' 返回意外的身份验证值,错误?的主要内容,如果未能解决你的问题,请参考以下文章

AWS Amplify and React - 找不到模块:无法解析“@aws-amplify/analytics”

使用 Amplify 集成构建 AWS Amplify React 应用程序时总是缺少 aws-exports.js

Android-Amplify:使用 Amplify 向/从 AWS S3 上传/下载文件

如何将 AWS Amplify 控制台中的现有应用程序与 AWS Amplify CLI 连接?

aws-amplify-react Connect 首先返回未定义的数据

使用 Auth0 进行 aws-amplify