33

概述

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

使用令牌的基本身份验证

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

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

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

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

4

2 回答 2

31

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

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 方法不需要服务器状态——因此它可以更好地扩展——并完成同样的事情。

于 2015-03-15T00:11:36.810 回答
16

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

于 2012-08-23T07:32:51.330 回答