InfoQ技术大会双节活动折上折,限时特惠,满10000-1000>> 了解详情
写点什么

利用 Amazon Cognito,安全地验证用户名

2019 年 10 月 02 日

利用 Amazon Cognito,安全地验证用户名

本博文由 AWS 社区精英 Larry Ogrodnek 特约发表。Larry 是一名独立顾问,他在 AWS 主要负责云架构、开发运营、无服务器和通用软件开发方面的业务。他总是愿意随时随地谈论 AWS,他热爱开发,也乐于帮助其他开发人员。


您的系统是如何识别用户? 通过用户名? 或者电子邮件地址? 用户的唯一性对您而言重要吗?


您可能会跟我一样惊讶地发现在 Amazon Cognito 中,用户名和电子邮件地址都是区分大小写的。如此一来,“JohnSmith”就跟“johnsmith”不同,同样,跟“jOhNSmiTh”也有区别。 电子邮件地址也是如此 – SMTP RFC 中还特别说明,用户“smith”和“Smith”可能会拥有不同的邮箱。这真的太不可思议了!


我最近为 Amazon Cognito 添加了自定义注册验证。在这篇博文中,我将为大家介绍具体的实施方法。


关于唯一性的问题

确定唯一性比处理区分大小写的问题还要困难许多。跟许多人一样,我也收到过与国际化域名同义词攻击有关的电子邮件。一个注册域名是“example.com”的网站,实际上使用的是西里尔字母“a”,其试图以此冒充合法网站并收集信息。同样类型的攻击也可以发生在用户名称注册阶段。如果我不设置检查,那么就可能会有人在我的网站上冒充另一个用户。


您保留名称了吗?

我的应用程序中存在用户生成的消息或内容吗? 除了处理唯一性之外,我可能还想保留某些名称(使其不会被注册)。例如,如果我在 user.myapp.commyapp.com/user.com 上有可供用户编辑的信息,但是如果有人注册了“signup”、“faq”或“support”这样的用户名怎么办? 要是他们注册了“billing”呢?


恶意用户有可能冒充我的站点并用以发动攻击。拥有任何类型的收件箱或进行消息收发的用户,也可能受到类似的攻击。除了保留用户名之外,我还会将用户内容划分到其各自的域中,以避免混淆。我记得 2013 年,在 GitHub 将用户页面从 github.com 移动到 github.io 时,也遇到了类似的问题。


James Bennet 在他的精彩博文 Let’s talk about usernames 中详细描述了这些问题。James 描述了在他的 django-registration 应用程序中执行的验证类型。


与 Amazon Cognito 集成

好的,现在您应该对这些问题已经有了更多的了解,那么我该如何利用 Amazon Cognito 来解决这些问题呢?


我的运气还算不错,因为现在我可以通过 Amazon Cognito 使用 AWS Lambda 触发器自定义大部分身份验证工作流程。


在添加用户名或电子邮件验证时,我可以植入预先注册的 Lambda 触发器,然后通过这个触发器执行自定义验证,以及接受或拒绝注册请求。



需要注意的是,我并不能对请求作出修改。要执行任何类型的大小写或名称标准化(例如,强制使用小写),都必须在客户端上进行。我只能验证该过程是在 Lambda 函数中完成的。如果以后可以修改请求,那么将会非常方便。


要声明注册无效,我需要做的就是从 Lambda 函数返回一个错误。在 Python 中,这就和抛出异常一样简单。如果验证通过,则只返回事件,该事件中已经包含了通用成功响应所需的字段。我还可以选择自动验证部分字段。


要强制前端发送标准化的小写用户名,我只需要使用以下代码:


def run(event, context):  user = event[‘userName’]  if not user.isLower():    raise Exception(“Username must be lowercase”)  return event
复制代码


添加唯一的约束和保留

我已经从 django-registration 中提取了验证验证结果,并将其输入到名为 username_validator 的 Python 模块中,以使 Lambda 能够更轻松地执行这些类型的唯一性验证:


pip install username-validator
复制代码


除了检测容易混淆的同形符号外,其还包含一组标准的保留名称,如“www”、“admin”、“root”、“security”和“robots.txt”等等。您可以针对特定应用程序提供额外的保留项,也可以执行单独的检查。


为了添加额外的验证和自定义保留项,我将函数进行了如下更新:


from username_validator import UsernameValidator
MY_RESERVED = [ "larry", "aws", "reinvent"]
validator = UsernameValidator(additional_names=MY_RESERVED)
def run(event, context): user = event['userName']
if not user.islower(): raise Exception("Username must be lowercase")
validator.validate_all(user)
return event
复制代码


现在,如果我将 Lambda 函数挂载到 Amazon Cognito 用户池作为预先注册的触发器,然后尝试注册“aws”,将会看到 400 错误页面。我还有一些可以包含在注册表单中的文本:



其他属性(包括电子邮件(如果使用过))也将可以在事件 [‘request’][‘userAttributes’]} 下使用。例如:


{ "request": {    "userAttributes": {"name": "larry", "email": "larry@example.com" }  }}
复制代码


那么接下来呢?


我可以用同样的方法验证其他属性。或者,我可以添加其他自定义验证,方法则是添加其他检查并引发异常,如果失败,则会显示自定义消息。


在本文中,我讨论了考虑身份和唯一性的重要性,并演示了如何在 Amazon Cognito 中针对用户注册添加额外的验证。


现在您应该了解了如何使用自定义 Lambda 函数控制注册验证。建议您查看其他用户的池工作流程自定义,这些自定义可以通过 Lambda 触发器实现。


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/safely-validating-usernames-with-amazon-cognito/


2019 年 10 月 02 日 17:28358
用户头像

发布了 1297 篇内容, 共 40.3 次阅读, 收获喜欢 42 次。

关注

欲了解 AWS 的更多信息,请访问【AWS 技术专区】

评论

发布
暂无评论
发现更多内容

软件教练说:性能优化与性能设计,“相亲相爱”的一对

华为云开发者社区

架构 性能优化 设计 程序 软件教练

14天1000+大集群滚动升级,银行柜台竟然毫无感觉

华为云开发者社区

大数据 金融 FusionInsight 华为云 集群

数字货币将如何改变日常生活

CECBC区块链专委会

数字货币

jdk8 String和StringBuilder对象创建所在位置

ilovealt

Java string StringBuilder

Soul 源码阅读 06|Nacos 同步数据分析

哼干嘛

【Node.js】事件触发器 - 基础篇

学习委员

Node 28天写作

30+程序员竞争力从哪里来?

我心依然

程序员 竞争力

蚂蚁金服二面被血虐,鬼知道面试的我经历了什么?

Java架构之路

Java 程序员 架构 面试 编程语言

谁,是产品的利益相关方?

不离

极客大学认识产品经理 极客大学产品经理训练营 跟着二爷学产品

老外程序员的Java性能优化方式是什么?JVM调优策略+工具+技巧

Java架构追梦

Java 学习 架构 面试 jvm调优

全网最全:Java9全部新特性一览

程序员小毕

Java 编程 程序员 架构 JVM

团队建设,凝聚人心打胜战

一笑

管理 团队建设 28天写作

苹果设备电池及充电周期

张老蔫

28天写作

区块链人才能力评价测试机构亮相

CECBC区块链专委会

区块链人才

NeoKylin-Server-5.0离线部署etcd+flannel集群,实现docker容器跨主机网络通信

星河寒水

Docker etcd flannel 麒麟操作系统 离线部署

Java学习笔记整理:Spring+tomcat+Kafka+多线程面试笔记

Java架构之路

Java 程序员 架构 面试 编程语言

架构解读丨Volcano作业资源预留设计原理

华为云开发者社区

批处理 Volcano 资源预留 作业资源预留

区块链真正的价值即将“引爆”行业应用

CECBC区块链专委会

区块链金融

面试官问:ZooKeeper是强一致的吗?怎么实现的?

云流

Java 编程 程序员 面试 分布式

提词器来了 | 视频号28天(23)

赵新龙

28天写作

两种端到端通用目标检测方法

华为云开发者社区

训练 目标检测 端到端 DETR DeFCN

localStorage和sessionStorage本地存储

魔王哪吒

html html5 面试 前端 html/css

融资融券两融系统搭建开发

v16629866266

架构师训练营第 2 期 第 7 周 作业一

老坛酸菜

架构师训练营第2期

奇葩java迭代器笔试题,做对算你厉害

田维常

迭代器模式

浅说 SQLite 的许可证模式

Justin

开源 版权保护 28天写作

不做负面情绪的奴隶,活成自己的小太阳

Ian哥

28天写作

真狠!涵盖了Netty+Spark+Hadoop+分布式五部分!讲的清清楚楚!

996小迁

redis hadoop 架构 面试 Netty

阿里一线架构师甩出“源码阅读指南”,从源码到实战,一键搞定

比伯

Java 编程 程序员 架构 计算机

Elasticsearch 是分布式文件存储么 ?

escray

elastic 七日更 28天写作 死磕Elasticsearch 60天通过Elastic认证考试

产业互联网业务与团队的思考

陈俊

利用 Amazon Cognito,安全地验证用户名-InfoQ