【问题标题】:Saving Amazon Cognito user credentials without local storage在没有本地存储的情况下保存 Amazon Cognito 用户凭证
【发布时间】:2018-02-16 06:39:08
【问题描述】:

我正在使用 Amazon Cognito 为带有 Javascript 开发工具包的网站进行用户登录,该开发工具包使用本地存储来保存用于自动登录等用途的用户凭证。从计算机上的本地文件运行时,这不起作用。

在本地运行网站时,是否可以指示 Javascript SDK 通过其他方式而不是本地存储来保存用户凭据?

我看到了有关更改存储对象的参考资料,但我找不到任何有关如何实际实施自定义存储解决方案的示例。 https://github.com/aws/amazon-cognito-identity-js/pull/363

【问题讨论】:

  • 我知道这不一定能回答您的问题,但为什么不提供一个轻量级服务器来通过localhost 在本地为站点提供服务呢?您的应用程序通常会由最终用户下载并直接从文件运行吗? 听起来您需要此文件进行测试和开发,通过localhost 提供文件将更符合您最终用户的体验。
  • 感谢您的建议。问题是 HTML 文件在本地存储不可用的 Adob​​e 扩展中提供,但如果您使用 Safari 等浏览器加载本地文件,则会遇到同样的问题。

标签: javascript amazon-cognito


【解决方案1】:

回答您的确切问题

pull request you linked 中所示,您现在可以指定一个Storage 对象供池使用。根据 MDN,有两个内置存储对象:localStoragesessionStorage。您也许可以按原样使用sessionStorage(我还没有尝试过)。它会在页面重新加载后继续存在,但在页面/选项卡关闭时会被清除。新标签获得一个新的sessionStorage 对象。

let pool = new CognitoUserPool({ 
  UserPoolId, 
  ClientId, 
  storage: window.sessionStorage 
});

如果这不起作用,您需要构建一个实现Storage API 的对象。这很简单,不需要做太多事情。总共有 5 种方法,大多数可以用简单的Object 1:1 映射

Storage.key(int n); // Return the Nth key
Storage.getItem(string key) // return the value for given key
Storage.setItem(string key, string value) // store a value at key
Storage.removeItem(string key) // remove the value for key
Storage.clear() // delete all values

这是一个 NPM 包,它在 memory 中实现了 Storage API。缺点是页面刷新会清除它。

source code 可以看出,这并不是很复杂。

然而

在我看来,更好的选择是使用一个非常简单的服务器,如 serveWeb Server for Chrome 通过 http 提供文件,以便 localStorage(和页面的许多其他部分)像你一样工作期待。

【讨论】:

  • 感谢您的精彩回答!这几乎可行,但 Cognito 只调用我的 getItem 函数。一旦我登录并调用setDeviceStatusRemembered,它就不会调用我的任何其他自定义存储功能,如setItem 来存储凭据。我还缺少另一个步骤吗?
  • @BerryBlue 我刚刚对github.com/aws/amazon-cognito-identity-js 源代码进行了一些挖掘,并且可以在创建 CognitoUserPool 对象时传递存储对象。这看起来很重要,因为 pool.storage 引用被复制到用户对象。更令人着迷的是,它已经内置了内存存储回退。 github.com/aws/amazon-cognito-identity-js/blob/master/src/… 它的要点是try window.localStorage on failure, use memory storage。这就引出了一个问题,为什么这对你的情况不起作用?
  • @BerryBlue 在哪里可以尝试将存储对象作为 CognitoUserPool 初始化的一部分传递?
  • 我再次查看了AWS SDK code 中的存储助手,并注意到它只是调用 setItem 和 removeItem 来测试window.localStorage 是否是一个可行的选项。它实际上并不检查函数是否工作,只是检查它们不会引发错误。您是否在您的 Adob​​e Extension 中进行了任何测试以查看 localStorage 的哪些部分不起作用?是window.localStorage === undefined?还是已定义但不起作用?不确定您使用的是什么扩展,因此无法轻松测试自己。
猜你喜欢
  • 1970-01-01
  • 2011-12-13
  • 2018-03-05
  • 2021-06-16
  • 2018-08-29
  • 1970-01-01
  • 1970-01-01
  • 2020-12-11
  • 2021-10-24
相关资源
最近更新 更多