具有电话号码验证要求的RESTful身份验证

时间:2014-10-15 07:13:27

标签: rest authentication restful-authentication rest-security

如果使用必须验证的电话号码进行身份验证,如何处理RESTful身份验证?

例如,让我们说用户想要登录。用户会点击一个带有电话号码的端点,然后将一条短信排队,然后发送到该电话号码进行验证。

理论上,两个端点可能如下所示:

身份验证[POST / users / authentication]

使用电话号码查找或创建用户,返回该用户,并将文本消息排入队列以发送到指定的电话号码(延迟)。

  • 请求(application / json)

    {
        "phone_number": "4151111111"
    }
    
  • 回复200(application / json)

    {
        "id": "85165292-8cce-42a3-960a-ffbc7dac987b",
        "name": "James",
        "avatar_url": null,
        "phone_number": 4151111111
    }
    

组验证

用户提供在短信中发送的验证码,以验证请求验证的用户是否有效。

验证[POST / users / {id} / verification]

  • 请求(application / json)

    {
        "phone_number_verification_code": "1234"
    }
    
  • 回复200(application / json)

    {
        "id": "85165292-8cce-42a3-960a-ffbc7dac987b",
        "name": "James",
        "avatar_url": null,
        "phone_number": 4151111111,
        "auth_token": "ff6828134dd6b2d288qcb8f381b0657c"
    }
    

以RESTful方式进行此验证的惯用方法是什么?动词是否正确?端点名称是否正确?我错过了什么吗?

1 个答案:

答案 0 :(得分:3)

问题中缺少一些信息。资源“用户”是否已在服务器上创建,是否只是要验证电话号码?

假设'是'。以下计划对我来说很好看: -

<强>验证

请求

POST /users/<uid>/phones
{
  “phone”: “4151111111”
}

添加新资源时应使用响应201(已创建)。在这种情况下,会创建一个新的电话号码,因此应返回201。

阅读规范以获取更多信息http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.5

根据REST规范,POST方法应该添加子资源。 GET方法应列出URI所代表的资源下的子资源。

根据这些REST规范进行设计,在同一URL上执行GET应该可以返回电话号码列表。这不是强制性的,但根据REST语义,它应该是这样的。所以GET请求/响应应该是这样的,

请求

GET /users/<uid>/phones

回复200确定

{
  “phones”: [
    {“phone”: “4151111111”, “verified”: “no”},
    {“phone”: “xxxxxxxxxx”, “verified”: “yes”},
    …
  ]
}

进行验证

现在,您已经在URI标识的服务器上有一个资源(/ users // phones / 4151111111)。只是它没有得到验证。验证它直接向资源发送帖子消息。喜欢这个

请求

POST /users/<uid>/phones/4151111111
{
  “code”: “1234”
}

回复200 ok。

现在,“手机”上的GET将返回“已验证”:“是”。像这样,

请求

GET /users/<uid>/phones

回复200确定

{
  “phones”: [
    {“phone”: “4151111111”, “verified”: “yes”},
    {“phone”: “xxxxxxxxxx”, “verified”: “yes”},
    …
  ]
}

如果尚未创建“用户”,那么您也可以为用户使用类似的语义。像这样。

GET / users

POST / users,带有有效负载以添加新用户。回复201(已创建)等

<强>更新

如果用户存在或是新用户,请求可能没有像这样的URL中的“用户”,

POST /phones
{
  “phone”: “4151111111”,
  "user": "James"
}

响应可能是201(已创建)但我们还必须注意用户是否已存在。当发送电话号码时,可以在DB中搜索匹配的用户,并根据不同的条件,您可以返回这样的响应,

案例1,用户不存在

HTTP/1.1 200 OK

{
   "rel": "/phones/4151111111",
   "phone": "4151111111",
   "verified": "no"
}

案例2,用户存在,但电话未经验证

HTTP/1.1 200 OK

{
   "rel": "/phones/4151111111",
   "phone": "4151111111",
   "verified": "no"
}

请注意,案例1和2的响应相同。在案例1中,在服务器上创建用户。

案例3,用户存在且手机已经过验证

HTTP/1.1 200 OK

{
   "rel": "/phones/4151111111",
   "phone": "4151111111",
   "verified": "yes"
}

在案例3中,用户已经存在并且电话已经过验证;所以客户端应该发送一个GET请求,而不是再次发送带有验证码的POST。客户端应自动重定向,而不是用户启动POST。

案例4,手机已经存在但与其他用户相关联。在这种情况下,请返回错误代码或根据您的应用程序要求。

发送URI作为响应,尊重RESTful样式的“按需代码”语义。客户端不需要事先知道验证的位置。

为了验证,现在客户端将文本消息中收到的代码POST到先前响应中返回的URI。像这样,

POST /phones/4151111111
{
  “code”: “1234”
}

响应可能是201(已创建),因为新手机也已添加,或者200也有所需的响应正文。