如果使用必须验证的电话号码进行身份验证,如何处理RESTful身份验证?
例如,让我们说用户想要登录。用户会点击一个带有电话号码的端点,然后将一条短信排队,然后发送到该电话号码进行验证。
理论上,两个端点可能如下所示:
使用电话号码查找或创建用户,返回该用户,并将文本消息排入队列以发送到指定的电话号码(延迟)。
请求(application / json)
{
"phone_number": "4151111111"
}
回复200(application / json)
{
"id": "85165292-8cce-42a3-960a-ffbc7dac987b",
"name": "James",
"avatar_url": null,
"phone_number": 4151111111
}
用户提供在短信中发送的验证码,以验证请求验证的用户是否有效。
请求(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方式进行此验证的惯用方法是什么?动词是否正确?端点名称是否正确?我错过了什么吗?
答案 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也有所需的响应正文。