如何在 api 调用中使用令牌对用户进行身份验证?
How to authenticate an user with token in an api call?
我正在使用 PlayFramework 开发 API,一些端点需要通过身份验证来保护。在这些请求中,客户端在 HTTP headers 中传递用户 ID 和身份验证令牌,然后服务器进行验证。
我将这个逻辑与注释一起使用,所以我只是将注释放在我想要保护的方法中。
所以我一直在使用这个逻辑,直到我意识到一个错误。假设我们有用户 A 和 B。如果用户 A 在 Headers 中发送其 ID 和身份验证令牌,但在 json body 中它向用户 B 发送信息,则用户 A 可以以用户 B 的名义呼叫。
所以我需要检查 headers 中传递的内容是否有意义,因为它在 json body 中传递(可能验证 ID 是否相同) .
我的疑问是如何实现这一点。我是否需要为我的方法创建不同的注释以接受不同类型的 json 并验证 header 是否相同?
我想放一些代码,但我认为这是一个更合乎逻辑的问题。
谢谢!
如果我理解你的问题,我会说这是授权问题。
Authentication versus Authorization
Authentication is the process of ascertaining that somebody really is who they claim to be.
Authorization refers to rules that determine who is allowed to do what. E.g. Adam may be authorized to create and delete databases, while Usama is only authorized to read.
我不熟悉 Play Framework,但它可能具有与其他流行框架相同的功能。
在您的情况下,您应该以某种方式确定允许用户更改某些资源。我不知道你有什么样的 API 或内容,所以我只需要建议一个解决方案。
我希望这个答案能帮助您继续前进并尝试一些可行的方法。如果我错过了一些关键信息,请多问。
假设我们有以下资源:
/user/1001/address
/user/1002/address
1001是用户A的ID。
1002是用户B的ID。
现在,如果用户 A 调用 /user/1002/address
并尝试 post 一些新数据,则不应被允许。所以现在我们有几个选择来授权该操作。
第一种方式
你说的用户ID是header的一部分。然后在您的操作中,在访问资源之前,您可以检查资源 URL user_id
是否与 header user_id
匹配。否则,不允许用户修改内容。
当然,我们可以有一个管理员用户应该能够做到这一点的用例。 Play Framework 可能有某种 role-based 访问控制 功能可以提供帮助。
这样的话,可能会出现安全问题。如果header包含用户A ID,调用者可以修改,伪装成用户B.
第二种方式
和第一个差不多。如果您的 JSON 内容中可以包含 user_id
,那么您可以尝试类似的逻辑。由于客户端可以更改内容等,同样的安全问题也会出现
第三种方式(我更喜欢这个)
如果你使用可以携带数据的令牌,那么你可以使用这个逻辑。我的意思是你有 JWT token 或类似的实现
使用该令牌,您无需在 header 中添加用户 ID。用户 ID 可以在令牌内。在服务端,可以从token读取内容。
现在,如果用户 A 调用资源 /user/1002/address
并尝试修改数据,应该不会再有问题了。例如,您可以从令牌中读取 user_id
并将其与 url 地址中的 user_id
进行比较。
客户端无法更改令牌内容,因为它是在服务器端生成的,并且只包含您想要的数据。
是的,我以前也遇到过这个问题,但解决这个问题的最好方法是你可以为每个用户令牌创建设置超时,然后授权将检查用户登录是否仍然是使用提供的令牌的用户,如果没有,则重置超时。希望它有很大帮助。
我正在使用 PlayFramework 开发 API,一些端点需要通过身份验证来保护。在这些请求中,客户端在 HTTP headers 中传递用户 ID 和身份验证令牌,然后服务器进行验证。
我将这个逻辑与注释一起使用,所以我只是将注释放在我想要保护的方法中。
所以我一直在使用这个逻辑,直到我意识到一个错误。假设我们有用户 A 和 B。如果用户 A 在 Headers 中发送其 ID 和身份验证令牌,但在 json body 中它向用户 B 发送信息,则用户 A 可以以用户 B 的名义呼叫。
所以我需要检查 headers 中传递的内容是否有意义,因为它在 json body 中传递(可能验证 ID 是否相同) .
我的疑问是如何实现这一点。我是否需要为我的方法创建不同的注释以接受不同类型的 json 并验证 header 是否相同?
我想放一些代码,但我认为这是一个更合乎逻辑的问题。
谢谢!
如果我理解你的问题,我会说这是授权问题。
Authentication versus Authorization
Authentication is the process of ascertaining that somebody really is who they claim to be.
Authorization refers to rules that determine who is allowed to do what. E.g. Adam may be authorized to create and delete databases, while Usama is only authorized to read.
我不熟悉 Play Framework,但它可能具有与其他流行框架相同的功能。
在您的情况下,您应该以某种方式确定允许用户更改某些资源。我不知道你有什么样的 API 或内容,所以我只需要建议一个解决方案。
我希望这个答案能帮助您继续前进并尝试一些可行的方法。如果我错过了一些关键信息,请多问。
假设我们有以下资源:
/user/1001/address
/user/1002/address
1001是用户A的ID。 1002是用户B的ID。
现在,如果用户 A 调用 /user/1002/address
并尝试 post 一些新数据,则不应被允许。所以现在我们有几个选择来授权该操作。
第一种方式
你说的用户ID是header的一部分。然后在您的操作中,在访问资源之前,您可以检查资源 URL user_id
是否与 header user_id
匹配。否则,不允许用户修改内容。
当然,我们可以有一个管理员用户应该能够做到这一点的用例。 Play Framework 可能有某种 role-based 访问控制 功能可以提供帮助。
这样的话,可能会出现安全问题。如果header包含用户A ID,调用者可以修改,伪装成用户B.
第二种方式
和第一个差不多。如果您的 JSON 内容中可以包含 user_id
,那么您可以尝试类似的逻辑。由于客户端可以更改内容等,同样的安全问题也会出现
第三种方式(我更喜欢这个)
如果你使用可以携带数据的令牌,那么你可以使用这个逻辑。我的意思是你有 JWT token 或类似的实现
使用该令牌,您无需在 header 中添加用户 ID。用户 ID 可以在令牌内。在服务端,可以从token读取内容。
现在,如果用户 A 调用资源 /user/1002/address
并尝试修改数据,应该不会再有问题了。例如,您可以从令牌中读取 user_id
并将其与 url 地址中的 user_id
进行比较。
客户端无法更改令牌内容,因为它是在服务器端生成的,并且只包含您想要的数据。
是的,我以前也遇到过这个问题,但解决这个问题的最好方法是你可以为每个用户令牌创建设置超时,然后授权将检查用户登录是否仍然是使用提供的令牌的用户,如果没有,则重置超时。希望它有很大帮助。