使用 REST api 的 Guid 令牌而不是用户名/密码的基本身份验证

Posted

技术标签:

【中文标题】使用 REST api 的 Guid 令牌而不是用户名/密码的基本身份验证【英文标题】:Basic Authentication with a Guid token for REST api instead of username/password 【发布时间】:2012-08-18 15:20:17 【问题描述】:

概述

我正在使用 PhoneGap 和 REST API 为后端开发一个移动应用程序。 REST API 不会被第三方开发人员使用,而是特定于应用程序,因此不需要实现 oAuth。因此,我计划在用户输入他们的用户名/密码来访问 API 资源时使用基本身份验证。所有 API 通信都将使用 SSL。

使用令牌的基本身份验证

我宁愿在第一次登录请求时验证用户名/密码并返回 GUID 令牌,而不是让应用程序存储用户名/密码并将其与每个请求一起发送到 API。客户端存储此 GUID 令牌,并通过 Authorization 标头将令牌与每个请求一起发送回 API,如下所示:

授权:基本 e1d9753f-a508-46cc-a428-1787595d63e4

在服务器端,用户名/GUID 组合将与设备设置一起存储在服务器上,并带有过期日期。这将允许跟踪用户登录的设备数量,并在 Guid 到期后使会话到期。

这种方法听起来合理且安全吗?

【问题讨论】:

【参考方案1】:

一般的“使用令牌进行身份验证”方法非常好,但您不应该尝试让基本身份验证以不同于预期的方式工作(毕竟它是一个已定义的标准)。您应该使用自己的标头进行身份验证。您可以在此处找到对此类场景的非常好的描述:

Making your ASP.NET Web API’s secure

【讨论】:

换句话说,我可以对第一个登录请求使用基本身份验证,然后让客户端发送一个自定义标头“X-Auth-Token:e1d9753f-a508-46cc-a428-1787595d63e4”请求? 并且不要在自定义标题名称中使用 X,这已被弃用。 tools.ietf.org/html/draft-ietf-appsawg-xdash-05 @tpeczek 如果我们将 guid 令牌作为 json 对象而不是在某些标头中发送,并且在接收采取行动参数而不是标头时会怎样。这种方法有任何问题吗?我是问这个问题,因为 androidios 客户端也使用 api 以及 angular web。 @Dragon 如果我的理解正确,我的问题是那些不能包含内容的请求(例如 GET)。您将无法将令牌作为有效负载的一部分传递。 @tpeczek no no 我的意思是如果我们在参数中传递令牌,即 Get api/Product?token=abc。如果是 Post api/Product 和对象中的令牌。在这两种情况下,我们都没有在标头中传递令牌。抱歉解释不好。【参考方案2】:

您根本不需要创建自定义标头或身份验证方案。

Bearer 身份验证方案专为您的用例而设计:

Authorization: Bearer e1d9753f-a508-46cc-a428-1787595d63e4

Basic认证必须如下:

Authorization: Basic base64EncodedUsernameAndPassword

其中base64EncodedUsernameAndPassword 等于输出:

base_64_encode(username + ':' + raw_password)

如果尾随文本值不是上述精确算法,请勿使用Basic

如果您只想在方案名称后添加任何值,请使用 Bearer 方案 - 这就是它的发明目的。

警告

虽然您可以使用简单的 GUID/UUID 作为令牌,但这并不是真正的安全令牌。考虑改用JWT。 JWT 可以进行数字签名并分配一个 TTL,以便只有设置它的服务器才能 a) 创建它并验证其真实性 b) 确保它的使用时间不会超过允许的时间。虽然这可能适用于基于 GUID 存储的数据,但 JWT 方法不需要服务器状态 - 因此它可以更好地扩展 - 并完成同样的事情。

【讨论】:

我认为对于最后的特定场景,jwt 和 guid 都只是一个令牌,例如假设我们没有在令牌中存储任何敏感信息,无论是 jwt 还是 guid 令牌,那么还有什么额外的好处jwt 将提供而不是 guid 令牌。

以上是关于使用 REST api 的 Guid 令牌而不是用户名/密码的基本身份验证的主要内容,如果未能解决你的问题,请参考以下文章

Django REST Framework - API 身份验证 - 授权应用程序而不是用户

REST API 身份验证令牌

显式打印 CSRF 令牌字段而不是 form_rest(form)?

Sharepoint 授权令牌在 REST api 中的使用

如果每个测试用例的标题需要新的令牌,如何使用Postman Collection Runner自动进行Rest apis测试

REST API 没有根据标头中的 Passport JWT 令牌更改用户?