我需要API调用来验证登录。我们有一个带有用户表的数据库,我们正在构建一个前端,中间有一个API。前端从用户获取用户名和密码,我们需要使用API对数据库进行身份验证。
所以我们有:
我猜这个请求应该是GET
,因为POST
用于创建,而PUT
用于更新,我们都没有这样做。
我们需要将用户名和密码发送到服务器,因为我们正在使用GET
,所以我说我们只能使用查询字符串参数或标头来发送数据。?
我认为查询字符串参数不适用于密码等,因此会留下请求的标题:
GET https://my-local-api-server/authenticate HTTP/1.1
username: my.username
password: mypassword
这是一个正确的RESTful请求,将数据发送到服务器进行身份验证吗?
对于响应,我们应该只使用响应状态代码(200或401),还是应该发送包含身份验证请求结果的JSON。?
{
"authenticated": true,
"error": ""
}
或
{
"authenticated": false,
"error": "Some error message..."
}
哪个是正确的RESTful响应..?或者它应该是......?
更新
我的问题不是很好,所以我需要澄清一下。
我不应该在上面的示例中使用公共URL,这实际上是本地服务器和本地API,永远不会在外部使用,并且只会在内部由其他本地应用程序使用。如果这种情况发生变化,我们可以重新审视我们正在做的事情。
我认为由于不清楚我正在进行的身份验证,我对此感到困惑。我正在针对数据库验证用户(真实世界的人)。我没有验证API的用法。
我们要编写的应用程序都是内部的,无需进行身份验证即可使用API。没有API密钥等。
所以...我正在接受一个真实世界的人,并检查他们是否应该访问我们的应用程序,我不会检查我们的应用是否可以访问API。
答案 0 :(得分:0)
在REST API中,当访问需要身份验证的受保护资源时,每个请求都必须包含要经过适当身份验证/授权的所有必需数据。身份验证数据(凭据)应属于标准HTTP Authorization
标头:
Authorization
标头字段允许用户代理进行身份验证 本身与原始服务器 - 通常,但不一定,后 收到401
(未经授权)回复。它的价值包括 包含用户身份验证信息的凭据 被请求资源领域的代理。Authorization = credentials
[...]
请注意,此HTTP标头的名称为 unfortunate ,因为它带有身份验证数据而不是授权。无论如何,这是在HTTP协议中发送凭据的标准标头。
REST应用程序应该是无状态的,因此服务器端不能存储会话状态。相反,会话状态必须由客户端完全处理,如Roy T. Fielding的dissertation about REST中所定义:
[...]从客户端到服务器的每个请求必须包含理解请求所需的所有信息,并且不能利用服务器上任何存储的上下文。因此,会话状态完全保留在客户端上。 [...]
因此,与您使用的动词无关,如果您正在对受保护资源执行请求,则该请求应包含身份验证数据。
保护REST API的常用方法是使用Basic Authentication Scheme:
2. The 'Basic' Authentication Scheme
基本身份验证方案基于客户端的模型 需要使用每个用户ID和密码进行身份验证 保护空间(“领域”)。 [...]服务器只有在可以验证时才会为请求提供服务 应用于保护空间的用户标识和密码 请求的资源。
[...]
要获得授权,客户
- 获取用户ID和密码
从用户
通过连接user-id(单个)来构造用户传递 冒号(“:”)字符和密码
将用户传递编码为八位字节序列,
- 的序列 醇>
并通过编码此八位字节序列来获取基本凭证 将Base64用于US-ASCII characters。
[...]
如果用户代理希望发送用户ID“Aladdin”和密码 “打开芝麻”,它将使用以下标题字段:
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
[...]
正在发生的另一种方法是基于令牌的身份验证。在这种方法中,您基本上交换客户端必须在每个请求中发送的令牌的硬凭证(用户名和密码)。在此方法中,您可以使用POST
执行身份验证,在请求有效负载中发送凭据:
POST /api/authentication HTTP/1.1
Host: example.com
Content-Type: application/json
{
"username": "username",
"password": "password"
}
如果身份验证成功,请在响应有效内容中返回200
状态代码和令牌:
HTTP/1.1 200 OK
Content-Type: application/json
{
"authenticationToken": "<token goes here>"
}
否则,如果凭据无效,请返回401
。
请注意,令牌是用于验证后续请求的凭据,这一点很重要。因此,令牌也应该在Authorization
标题中发送:
Authorization: Bearer <token goes here>
答案 1 :(得分:0)
通过HTTP向API发送用户名和密码的最标准方法是使用Basic Auth标头。
对于响应,您绝对应该使用正确的HTTP状态代码(例如Forbidden),但您仍然可以在正文中包含一个JSON有效负载以及更多信息。