使用 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】:您根本不需要创建自定义标头或身份验证方案。
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 令牌。【参考方案2】:一般的“使用令牌进行身份验证”方法非常好,但您不应该尝试让基本身份验证以不同于预期的方式工作(毕竟它是一个已定义的标准)。您应该使用自己的标头进行身份验证。您可以在此处找到对此类场景的非常好的描述:
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 对象而不是在某些标头中发送,并且在接收采取行动参数而不是标头时会怎样。这种方法有任何问题吗?我是问这个问题,因为 android 和 ios 客户端也使用 api 以及 angular web。 @Dragon 如果我的理解正确,我的问题是那些不能包含内容的请求(例如 GET)。您将无法将令牌作为有效负载的一部分传递。 @tpeczek no no 我的意思是如果我们在参数中传递令牌,即 Get api/Product?token=abc。如果是 Post api/Product 和对象中的令牌。在这两种情况下,我们都没有在标头中传递令牌。抱歉解释不好。以上是关于使用 REST api 的 Guid 令牌而不是用户名/密码的基本身份验证的主要内容,如果未能解决你的问题,请参考以下文章
Django REST Framework - API 身份验证 - 授权应用程序而不是用户
显式打印 CSRF 令牌字段而不是 form_rest(form)?
Sharepoint 授权令牌在 REST api 中的使用
如果每个测试用例的标题需要新的令牌,如何使用Postman Collection Runner自动进行Rest apis测试