不建议使用Auth0模拟。我应该改用什么?

时间:2018-10-05 17:30:54

标签: reactjs api access-token auth0 impersonation

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

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

有人知道有任何方式模仿用户吗?我认为我已经通过从访问令牌中解析用户ID来获取该用户的任何数据来对我的API施加限制,如果我错了,请更正我。

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

您怎么看?关于此方法还有其他想法/批评吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

如果您的管理员想以客户身份查看网站。另外,如果您要用户ID 来获取用户数据。 然后,您可以在auth0提供的名为元数据的字段中添加用户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);
}