API desing – 可以从授权令牌中获取用户数据吗?

API desing – Is it ok to fetch user's data from auth token?

让我们考虑这个用例:

1) 我使用用户名和密码调用我的 API 登录端点,并获取我添加到 header 的每个连续请求中的 Auth 令牌,作为 Authorization: Bearer <token>.

2) 我调用 /current-user 没有参数的端点,只有授权 header。服务器使用令牌授权用户并从该令牌获取用户 ID。然后他在数据库中通过 id 找到用户,return这是数据。

我的问题是,这种方法是否不安全。我想知道,如果我是攻击者并使用随机生成的调用 /current-user 端点怎么办令牌。一旦我偶尔匹配到真实令牌,服务器就会 return 我其他用户的数据。

是否有必要将用户 ID 与令牌和调用请求一起存储在客户端上?例如。 /user?id=<stored user id> 授权 header 并摆脱 /current-user 端点?之后服务器上的某种 ACL 将确定使用的令牌是否允许访问具有传递的用户 ID 的用户。

(我也发现有 JWT 令牌,但我在那里看到了同样的问题。作为攻击者,我会设法猜测其他用户的令牌,服务器会 return 我他的数据)

出于安全目的,通常假设攻击者无论如何都知道用户 ID。例如,如果攻击者已经拥有或知道一个合法帐户,她可能能够猜测其他用户 ID 是如何分配的。

此外,如果您的令牌足够长且完全随机,则没有任何区别。

这样看:假设您的令牌长度为 n,您的用户 ID 长度为 m。如果没有用户 ID,攻击者必须猜测 n 个字符,如果包含用户 ID,她必须猜测 n+m 个字符。如果您的 n 足够高,则不需要那些额外的字符。请记住,如果您的用户 ID 不是完全随机的,则用户 ID 的 有效 长度可能比其表观长度短得多,因此添加的 m 实际上可能是真小

您可以使用数字签名的令牌吗?您基本上可以使用客户端(或用户)的私钥加密令牌,然后使用服务器的 public 密钥再次加密包和明文用户 ID。这样只有服务器才能解密包,一旦解密,它就知道用户是谁。然后它可以使用与该用户 ID 关联的 public 密钥解密包并获取令牌。

由于您没有提供太多关于应用程序和所需身份验证速度或您正在使用的技术的信息,因此很难提供更多信息。