RESTful API数据库身份验证,哪个动词?

时间:2016-05-25 10:23:18

标签: api rest authentication

我需要API调用来验证登录。我们有一个带有用户表的数据库,我们正在构建一个前端,中间有一个API。前端从用户获取用户名和密码,我们需要使用API​​对数据库进行身份验证。

所以我们有:

  1. 请求对用户进行身份验证
  2. 回复以表明是否已通过身份验证
  3. 请求

    我猜这个请求应该是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。

2 个答案:

答案 0 :(得分:0)

REST中的身份验证概述

在REST API中,当访问需要身份验证的受保护资源时,每个请求都必须包含要经过适当身份验证/授权的所有必需数据。身份验证数据(凭据)应属于标准HTTP Authorization标头:

  

4.2. Authorization

     

Authorization标头字段允许用户代理进行身份验证   本身与原始服务器 - 通常,但不一定,后   收到401(未经授权)回复。它的价值包括   包含用户身份验证信息的凭据   被请求资源领域的代理。

Authorization = credentials
     

[...]

请注意,此HTTP标头的名称为 unfortunate ,因为它带有身份验证数据而不是授权。无论如何,这是在HTTP协议中发送凭据的标准标头。

REST应用程序应该是无状态的,因此服务器端不能存储会话状态。相反,会话状态必须由客户端完全处理,如Roy T. Fielding的dissertation about REST中所定义:

  

5.1.3 Stateless

     

[...]从客户端到服务器的每个请求必须包含理解请求所需的所有信息,并且不能利用服务器上任何存储的上下文。因此,会话状态完全保留在客户端上。 [...]

因此,与您使用的动词无关,如果您正在对受保护资源执行请求,则该请求应包含身份验证数据。

基本身份验证

保护REST API的常用方法是使用Basic Authentication Scheme

  

2. The 'Basic' Authentication Scheme

     

基本身份验证方案基于客户端的模型   需要使用每个用户ID和密码进行身份验证   保护空间(“领域”)。 [...]服务器只有在可以验证时才会为请求提供服务   应用于保护空间的用户标识和密码   请求的资源。

     

[...]

     

要获得授权,客户

     
      
  1. 从用户

  2. 获取用户ID和密码   
  3. 通过连接user-id(单个)来构造用户传递   冒号(“:”)字符和密码

  4.   
  5. 将用户传递编码为八位字节序列,

  6.   
  7. 并通过编码此八位字节序列来获取基本凭证   将Base64用于US-ASCII characters

  8. 的序列         

    [...]

         

    如果用户代理希望发送用户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有效负载以及更多信息。