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

bad*_*mar 31 authentication rest oauth asp.net-web-api

概观

我正在使用带有REST API的PhoneGap为后端开发移动应用程序.REST API不会被第三方开发人员使用,但将是特定于应用程序的,因此不需要实现oAuth.因此,我打算使用基本身份验证,在用户输入用户名/密码以访问API资源.所有API通信都将在SSL上.

令牌的基本身份验证

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

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

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

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

Les*_*ood 28

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

Bearer认证方案正是专为您的使用情况:

Authorization: Bearer e1d9753f-a508-46cc-a428-1787595d63e4
Run Code Online (Sandbox Code Playgroud)

Basic身份验证必须如下:

Authorization: Basic base64EncodedUsernameAndPassword
Run Code Online (Sandbox Code Playgroud)

where base64EncodedUsernameAndPassword等于输出:

base_64_encode(username + ':' + raw_password)
Run Code Online (Sandbox Code Playgroud)

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

如果你只想在方案名称之后放置你想要的任何值,请使用该Bearer方案 - 这就是它的发明.

警告

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

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

tpe*_*zek 16

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

  • 并且不要在自定义标头名称中使用X,这已被弃用.http://tools.ietf.org/html/draft-ietf-appsawg-xdash-05 (6认同)