人们常说计算机科学中最难的两个问题是缓存失效问题和命名。说实话,确实如此。确实很难。
命名事物之所以困难,是因为需要既清晰又简洁。变量、术语、函数或类的名字不应让人产生任何疑虑。如果你觉得一个术语可能有两种意思,那么它的命名就不恰当。
比如API密钥和令牌就是这种情况。前几天我和别人讨论时,发现这两个词被交替使用。大约两分钟后,我打断了对话并问:“你知道这两个词不一样吧?”
显然他们并不知道。结果,很多人无法区分API密钥和令牌。所以让我们来澄清一下。
定义是什么呢?我们可以通过如下定义来区分API密钥和令牌:
- API密钥 — 在调用API时由代码生成的值,用于标识和授权调用者身份。它主要用于程序化使用,并且通常是一长串字母和数字。
- 令牌 — 代表用户会话或特定权限的令牌,供用户在一定时间内使用。
这二者在创建方法上也通常有所不同。
- API密钥 — 一般通过用户界面创建一次,并在不进行更新的情况下保持不变。这些密钥可以被设置为在一段时间后过期。
- 令牌 — 在成功验证或登录后动态生成。通常具有较短的有效期,可以刷新以延长其有效时间。
谈到认证时,我们不能不提权限范围。权限范围指的是当使用提供的认证方法时,可以执行的功能部分。
- API 密钥 — 固定的权限集合,赋予应用程序功能的权限。拥有此密钥的人可以访问允许的资源。
- 令牌 — 限定特定个体可以访问的数据或功能。这可能会根据角色或其他业务需求而变化。更侧重于对数据的访问限制。
每种方法有多安全?如果密钥或令牌被泄露或被恶意用户得到,潜在的危害会有多大?
- API密钥 — 由于这些通常是长期有效的,并且不限制对数据的访问,因此如果被破解可能会造成严重后果。唯一的解决办法是撤销密钥。应用程序通常需要有良好的可观测性来识别被破解的密钥并追踪恶意用户。
- 令牌 — 设计时就考虑到了安全性。通常有效期很短且易于撤销。被泄露的令牌只能访问用户有权访问的数据,并且会在一段时间后自动失效。
那么你会选择使用其中一个而不是另一个是在什么时候呢?它们似乎在优缺点之间取得了不错的平衡。
- API密钥 — 用于服务器间通信,访问如天气API等公开数据,与第三方系统集成。
- Token — 用于用户认证,精细访问控制(FGAC),授予资源的临时访问权限等权限,浏览器访问及用户会话管理。
现在我们知道了两者之间的区别,接下来让我们看两个使用Momento JavaScript SDK的实际例子。
API钥我确实说过API密钥通常是通过用户界面发放的。所以,我这里没有代码示例可以分享。不过,以下是如何通过Momento控制台获取API密钥的步骤,作为用户来说。
您可以选择所需的权限,设置可选的过期时间,然后生成该API密钥。然后,您就可以立即在工作流中使用这个新生成的API密钥。
代币将这种情况与基于用户的“一次性令牌”进行对比,该令牌在成功登录后发放。我们可以举一个基于角色的例子,一个用户可以获取到 calendar-events 缓存数据的只读访问权限,但可以对该协作主题进行发布和订阅操作。
// 登录成功后执行
exports.handler = async (event) => {
const user = await loadUserMetadata(event.userId);
let token;
switch(user.role){
case 'data-entry':
token = await getDataEntryToken(user.tenantId);
break;
case 'admin':
token = await getAdminToken(user.tenantId);
break;
default:
throw new Error('角色无效');
}
return token;
};
const getDataEntryToken = async (tenantId) => {
const scope = {
permissions: [
{
role: 'readonly',
cache: 'calendar-events',
item: {
keyPrefix: tenantId
}
},
{
role: 'publishsubscribe',
cache: 'collaboration',
topic: `${tenantId}-events`
}
]
};
const response = await authClient.generateDisposableToken(scope, ExpiresIn.minutes(15));
return {
token: response.authToken,
expiresAt: response.expiresAt.toEpoch()
};
};
你可以看到,我们创建一个有效时间为15分钟的令牌,其权限仅设为readonly,并且只允许访问以用户所属的tenantId 开头的缓存数据。因此,我们不仅对功能进行了限制,还根据用户的属性限制了可访问的数据。
主要要点API密钥和令牌各有优缺点。一个并不比另一个更有优势。就像计算机科学中的其他事情一样,这取决于您的具体应用场景。在决定要实现哪种认证机制时,请考虑您的用户将如何使用您的应用程序。
如果是基于用户的网络会话?用令牌。也许你仅期望程序访问,不需要限定可用数据。用API密钥。你可以随时保存上面的参考表以供快速查阅。
不管走哪条路,都要记住数据安全最重要。数据泄露可能让你生意做不下去,所以一定要小心。安全第一。
如果你对我们如何开始使用Momento感兴趣,并需要帮助确定你的访问权限级别,你可以随时加入我们的Discord,直接向团队提问。如果你更喜欢阅读资料,_开发者文档_全天候在线供你查阅。
祝编程愉快!
共同学习,写下你的评论
评论加载中...
作者其他优质文章