如何在api调用中使用令牌对用户进行身份验证?

时间:2019-01-16 01:05:46

标签: java authentication playframework logic api-design

我正在使用PlayFramework开发API,并且某些端点需要通过身份验证进行保护。在这些要求中,客户端将HTTP标头传递给用户ID和auth令牌,然后服务器进行验证。

我将这种逻辑与注释一起使用,因此我只是将注释放入要保护的方法中。

所以我一直使用这种逻辑,直到我发现一个错误。假设我们有用户A和B。如果用户A在标头中发送其id和auth令牌,但是在json主体中它发送了用户B信息,则用户A可以用户B的名义进行呼叫。

因此,我需要检查在标头中传递的内容是否与在JSON正文中传递的内容有意义(可能验证ID是否相同)。

我的疑问是如何实现这一目标。我需要为我的方法创建不同的注释以接受不同种类的json并验证标头是否相同吗?

我努力介绍一些代码,但我认为这是一个更合理的问题。

谢谢!

2 个答案:

答案 0 :(得分:1)

如果我了解您的问题,我会说这是授权问题。

  

Authentication versus Authorization

     

身份验证是确定某人确实是他们声称的身份的过程。

     

授权是指确定允许谁执行操作的规则。例如。 Adam可能被授权创建和删除数据库,而Usama仅被授权读取。

我不熟悉Play框架,但它可能具有与其他流行框架相同的功能。

在您的情况下,您应该以某种方式确定允许用户更改某些资源。我不知道您拥有哪种API或内容,所以我只需要提出一个解决方案即可。

我希望这个答案可以帮助您继续前进,并尝试一些可行的方法。如果我错过了一些关键信息,请问更多。

假设我们拥有以下资源:

/user/1001/address
/user/1002/address

1001是用户A的ID。 1002是用户B的ID。

现在,如果用户A呼叫/user/1002/address并尝试发布一些新数据,则不应允许该数据。因此,现在我们有几种选择可以授权该操作。

第一种方式

您说用户ID是标题的一部分。然后,在操作中,在访问资源之前,您可以检查资源URL user_id是否与标头user_id相匹配。如果不是,则不允许用户修改内容。

当然,我们可以有一个用例,管理员用户应该可以这样做。 Play Framework可能具有某种基于角色的访问控制功能,可以提供帮助。

通过这种方式,可能会出现安全问题。如果标题包含用户A ID ,则呼叫者可以对其进行修改,并假装为用户B

第二种方式

几乎与第一个相似。如果您的JSON内容中可以包含user_id,则可以尝试类似的逻辑。由于客户端可以更改内容等,因此也会出现相同的安全问题。

第三种方式(我更喜欢)

如果您使用可以承载数据的令牌,则可以使用此逻辑。我的意思是您有JWT token或类似的实现

使用该令牌,您无需在标题中添加用户ID。用户ID可以在令牌内。在服务器端,您可以从令牌中读取内容。

现在,如果用户A调用资源/user/1002/address并尝试修改数据,则不应再发布它。例如,您可以仅从令牌中读取user_id并将其与URL地址中的user_id进行比较。

客户端无法更改令牌内容,因为令牌内容是在服务器端生成的,并且仅包含所需的数据。

答案 1 :(得分:0)

是的,我之前也遇到过问题,但是解决此问题的最佳方法是您可以为每个用户令牌创建set Timeout,然后auth将检查用户是否仍使用提供的令牌登录了该用户,然后重置如果没有超时的话。希望对您有帮助。