【问题标题】:Auth0 impersonation deprecated.. What should I use instead?Auth0 模拟已弃用.. 我应该改用什么?
【发布时间】:2019-03-11 06:15:42
【问题描述】:

在我们的网站上,管理员应该能够以用户(客户端)的身份查看网站。我计划为此使用 Auth0,只是注意到他们的模拟功能已被弃用。

我可以强制 Redux 中的一些登录标志以允许管理员以用户身份查看,但是,为了从 API 获取任何用户数据,我从登录期间 Auth0 生成的访问令牌中获取用户 ID。因此 API 只会从当前登录用户的访问令牌中获取数据。

有没有人知道有什么方法可以冒充这个用户?我认为我通过从访问令牌解析用户 ID 以获取该用户的任何数据,对我的 API 实施了限制,如果我错了,请纠正我。

我能想到的唯一方法是,如果管理员“查看”用户,它可以在 API 调用中传递用户的 ID。在控制器中,我可以检查用户 ID 字段是否存在并使用它而不是当前登录的用户,但我认为传递用户 ID 不是一个好主意。也许我可以在每个请求上添加一个中间件,如果 API 调用中存在该用户 ID,我可以检查该用户的角色以确保它是验证请求的管理员。

你怎么看?对这种方法还有其他想法/批评吗?

谢谢!!

【问题讨论】:

  • 我想补充一下,如果您遇到了需要传递 UserId 的限制,您可以安全地使用 md5(sha1(userId)) 之类的东西对其进行哈希处理,以便普通人获胜不要读它。您可以在查询中使用它,例如 SELECT * FROM user WHERE MD5(SHA1(userId)) = ?。它很安全,对我有用。

标签: reactjs api access-token auth0 impersonation


【解决方案1】:

我认为您无需在 API 调用中传递 用户 ID 即可实现此目的,因为这样做并不安全。

如果您的管理员想要将网站视为您的客户。如果您想要 用户 ID 来获取用户数据。 然后您可以在 auth0 提供的名为 metadata 的字段中添加 user ID。 并使用规则在访问令牌中添加 元数据 字段。

所以基本上你只能像一般情况下那样从访问令牌中获取用户 ID

现在在您的控制器中检查访问令牌是否具有用户 ID,如果找到, 使用该 ID 获取其他数据。

按照这种方法,您不需要传递任何额外的数据,一切都将仅使用访问令牌来处理。

对于更安全的方法,在控制器中除了上述检查之外,您还可以检查角色以验证它是否具有 admin 角色。

用于在 auth0 中添加规则, 这是您需要使用的代码:

function (user, context, callback) {
// The currently requested scopes can be accessed as follows:
// context.request.query.scope.match(/\S+/g)
//add the following line in this function additionally.
context.accessToken['metadata'] = user.user_metadata;
callback(null, user, context);
}

【讨论】:

    【解决方案2】:

    模拟通常适用于非敏感数据。例如,您可以使用公共usernameemail address 以及管理员用户的会话来创建模拟会话。您的 API 可以从那里接收请求,验证aadmin-user-session-key 的权限,验证impersonatable-username,最后返回一个新的模拟会话。 示例请求:

    {
       session: '<admin-user-session-key>',
       username: '<impersonatable-username>'
    }
    

    【讨论】:

    • 我无法理解您试图解释的内容。我有一个带有后端的 SPA。流程是什么?
    • 1.管理员通过登录到您的后端成功检索会话 2. 管理员将其自己的会话 + 模拟用户的用户名发送到您的后端。带有为模拟用户签名的新会话的后端响应。
    • 我猜,你的提议是不可能的,因为他们使用 auth0 登录,所以后端无法响应新会话。会话由管理令牌的 auth0 管理。
    • > “我考虑过使用 Auth0。”他还没有使用 Auth0,对于这种特殊情况,我也不建议他这样做
    • 即使会话将由 auth0 管理。后端可以作为请求的代理从 auth0 请求会话。
    猜你喜欢
    • 1970-01-01
    • 2019-08-28
    • 2010-09-17
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    相关资源
    最近更新 更多