Lambda 如何在不使用 AWS Cognito 的情况下对网站用户进行授权?

How can Lambda authorize website users without using AWS Cognito?

我们正在开发一个在线课程网站。
每门课程都有音频和文本(无视频)。
课程音频文件存储在 S3 中并通过 CloudFront 传送。

每门课程有固定的低价,
因此用户只有在登录并购买后才能访问课程音频文件

我们已经实现了注册、登录、用户激活电子邮件功能等。

每次授权用户想要播放音频文件时,
浏览器向 CDN 发送请求以传送该音频文件。

问题是这样的:
一旦 CDN 将音频文件传送给授权用户,
该用户可以右键单击我们网站的音频播放器,select“检查”,
复制粘贴 CDN URL,在社交媒体上分享 URL,
其他任何人都可以收听该音频文件

所以我们要添加 Lambda@edge 函数,
检查每个传入请求以查看
生成的这个请求是真正授权的。
如果 Lambda 授权,CDN 将传送音频文件。
如果 Lambda 拒绝,CDN 将提供“授权错误”。

-1-
我们不想将 AWS Cognito 与 JWT 一起使用,因为
集成此服务意味着我们将需要
扔掉我们所有的注册/登录相关代码和
使用 Cognito 重新实现整个逻辑。

-2-
添加 AWS WAF 并将其配置为仅接受来自我们网站的请求
通过检查 HTTP Refer header 是不安全的,很容易被黑客攻击。

那么,Lambda@Edge 函数如何才能只接受来自我们网站授权用户的请求,并拒绝来自其他访问音频文件 CDN link 的用户的所有请求?

Lambda 能否直接与我们的站点数据库通信,询问我们用户是否获得授权,并根据我们的响应,authorize/decline 音频文件请求?

我们的站点和 Lambda 之间是否有任何可以使用的简单标记化技术?

所以我目前实施 Lamba 授权者的方式是我们有一个 on-prem 安全 API 来发布 JWT。

所以授权者使用签名密钥验证 JWT 并确保它没有过期等。这对用户进行了身份验证,所以我知道用户是谁。然后我让授权方回拨 on-prem 安全 API 到 return 声明。

为此,您的授权方需要连接到一个 VPC,一个连接到您的 on-prem 环境的私有子网。

我无法完全理解您当前的系统如何处理身份验证,也许是在 cookie 中?无论哪种方式,自定义授权方都可以使用基于令牌的方式,因此您可以传入不记名令牌 JWT,也可以使用请求参数来完成。

来自 AWS 文档: 请求 parameter-based Lambda 授权方(也称为 REQUEST 授权方)以 headers、查询字符串参数、stageVariables 和 $context 变量的组合接收调用方的身份。

因此,如果您不想使用我都没有使用的 Cognito 或 JWT,我在这里可以看到的唯一其他选项是请求参数。