如何在RESTful Web服务中实现login?

我正在构build一个带有服务层的Web应用程序。 服务层将使用RESTfuldevise来构build。 我们的想法是,将来有一段时间我们可能会构build其他应用程序(iPhone,Android等),它们使用与Web应用程序相同的服务层。 我的问题是这个 – 我如何实现login? 我想我在从一个更传统的基于动词的devise转向基于资源的devise方面遇到了麻烦。 如果我用SOAP构build这个,我可能会有一个名为Login的方法。 在REST中,我应该有一个资源。 我很难理解如何构build我的URIlogin。 应该是这样的:

http:// myservice / {用户名}?p = {密码}

编辑:前端Web应用程序使用传统的ASP.NET框架进行身份validation。 但是,在身份validation过程中,我需要validation提供的凭据。 在传统的Web应用程序中,我将执行数据库查找。 但在这种情况下,我正在调用一个服务,而不是做一个数据库查询。 所以我需要一些服务来validation提供的凭据。 除了validation所提供的证书之外,我还可能在成功通过validation之后还需要一些有关用户的信息,比如他们的全名,ID等等。我希望这个问题更清楚。

还是我没有想到这个正确的方法? 我觉得我很难正确描述我的问题。

科瑞

正如S.Lott所指出的那样,我们在这里有两个折叠的东西:login和authentication

身份validation超出了范围,因为这是广泛讨论,并有共同的协议。 但是,我们实际上需要客户端使用RESTful Web服务成功进行身份validation? 对,有些令牌,我们称之为访问令牌。

客户端)所以,我需要的只是一个访问令牌,但如何获得这样的RESTfully?
服务器)为什么不简单地创build它?
客户)如何来?
服务器)对于我来说,一个访问令牌不是别的,而是一个资源。 因此,我将为您创build一个换取您的用户名和密码。

因此,服务器可以提供资源URL“/ accesstokens”,用于发送用户名和密码,将链接返回到新创build的资源“/ accesstokens / {accesstoken}”。 或者,您返回包含access-token和href的文档以及资源的链接:

 <存取令牌
   id =“{访问令牌ID在这里;例如GUID}”
   HREF = “/ accesstokens /(编号)”
 />

最有可能的是,你实际上并不创build访问令牌作为子资源,因此,不会在响应中包含它的href。
但是,如果你这样做,客户可以代表它或不生成链接? 没有!
请记住,真正的RESTful Web服务将资源链接在一起,客户端可以自行导航而无需生成任何资源链接。

你可能有的最后一个问题是,如果你应该把用户名和密码作为一个HTML表单或者一个文档,比如XML或者JSON,那么这个取决于… 🙂

你不要“login”。 你“authentication”。 世界的差异。

你有很多authenticationselect。

HTTP基本,摘要,NTLM和AWS S3authentication

  • HTTP基本和摘要authentication。 这使用HTTP_AUTHORIZATION标头。 这很好,很简单。 但是会导致很多stream量。

  • 用户名/签名authentication。 有时称为“ID和KEY”authentication。 这可以使用查询string。

    ?username=this&signature=some-big-hex-digest

    这是亚马逊使用的地方。 用户名是“id”。 “密钥”是一个摘要,类似于用于HTTP摘要authentication的摘要。 双方不得不同意文摘进行。

  • 某种基于cookie的身份validation。 例如, OpenAM可以configuration为代理进行身份validation,并提供您的REST风格的Web服务器可以使用的cookie。 客户端首先进行身份validation,然后为每个RESTful请求提供Cookie。

很好的问题,好姿势。 我真的很喜欢帕特里克的答案。 我使用类似的东西

– /用户/ {名} / loginsession

正在处理POST和GET。 所以我发布一个新的login会话与凭据,然后我可以通过GET查看当前会话作为资源。

资源是一个login会话,可能有一个访问令牌或授权码,到期等。

奇怪的是,我的MVC调用者本身必须通过头部提供一个密钥/不记名令牌,以certificate它有权尝试创build新的login会话,因为MVC站点是API的客户端。

编辑

我认为这里有一些其他的答案和评论是用带外共享秘密来解决这个问题,只是用一个头文件进行validation。 在许多情况下或服务对服务呼叫都很好。

另一种解决scheme是stream程标记,OAuth或JWT或其他方式,这意味着“login”已经发生了另一个进程,可能是一个正常的login界面在浏览器中,基于formsPOST。

我的答案是位于该UI后面的服务,假设您希望login和授权以及用户pipe理放置在REST服务中,而不是放在站点MVC代码中。 这是用户login服务。

它还允许其他服务“login”并获取到期的令牌,而不是使用预共享密钥,以及在CLI或Postman中testing脚本。

由于2011年以来相当多的变化…

如果您打算使用第三方工具,并稍微偏离Web UI的REST,请考虑http://shiro.apache.org

Shiro基本上给你一个servletfilter,用于authentication和授权。 您可以使用@ S.Lott列出的所有login方法,包括简单的基于表单的身份validation。

过滤需要身份validation的其余URL,Shiro将完成剩下的工作。

我目前正在使用这个在我自己的项目,迄今为止,我工作得很好。

以下是其他人可能感兴趣的内容。https://github.com/PE-INTERNATIONAL/shiro-jersey#readme

了解REST的第一件事是它是一个基于Token的资源访问。不同于传统的方式,基于令牌validation授予访问权限。 简单的说,如果你有正确的标记,你可以访问资源。现在有很多其他的东西来创build和操作标记。

对于你的第一个问题,你可以devise一个Restfull API。 凭据(用户名和密码)将被传递到服务层。服务层然后validation这些凭证并授予令牌。凭证可以是简单的用户名/密码,也可以是SSL证书。 SSL证书使用OAUTH协议,更安全。

你可以devise你的URI像这个URI的令牌request-> http:// myservice / some-directory / token ? (你可以在这个Token的URI中传递Credentilals)

要使用此令牌进行资源访问,您可以将此[授权:承载(令牌)]添加到您的http头中。

这个令牌可以被客户用来访问服务层的不同组件。 您还可以更改此令牌的有效期限以防止误用。

对于第二个问题,你可以做的一件事就是授予不同的令牌来访问服务层的不同资源组件。 为此,您可以在您的令牌中指定资源参数,并根据此字段进行macros许可。

您也可以按照这些链接了解更多信息 – http://www.codeproject.com/Articles/687647/Detailed-Tutorial-for-Building-ASP-NET-WebAPI-REST

http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api

我以前遇到同样的问题。 login不能很好地转换为基于资源的devise。

我通常处理它的方式是通过login资源并在参数string上传递用户名和密码,基本上这样做

GET http:// myservice / login?u = {username}&p = {password}

响应是某种会话或身份validationstring,然后可以传递给其他API进行validation。

在login资源上做GET的替代方法是做一个POST,REST纯粹主义者可能不会喜欢我现在:),并在身体传递信用。 答复是一样的。