如何在RESTful Web服务中实现登录?

Cor*_*ett 78 rest web-services login web-applications restful-authentication

我正在构建一个带有服务层的Web应用程序.服务层将使用RESTful设计构建.我们的想法是,未来一段时间我们可能会构建使用与Web应用程序相同的服务层的其他应用程序(iPhone,Android等).我的问题是 - 如何实现登录?我想我无法从更传统的基于动词的设计转变为基于资源的设计.如果我用SOAP构建它,我可能会有一个名为Login的方法.在REST中我应该有一个资源.我很难理解如何为登录构建我的URI.应该是这样的:

http:// myservice / {username}?p = {password}

编辑:前端Web应用程序使用传统的ASP.NET框架进行身份验证.但是,在身份验证过程中的某些时候,我需要验证提供的凭据.在传统的Web应用程序中,我会进行数据库查找.但在这种情况下,我正在调用服务而不是进行数据库查找.所以我需要服务中的一些东西来验证提供的凭据.除了验证提供的凭据之外,我可能还需要在用户成功通过身份验证之后获得有关用户的某些信息 - 例如他们的全名,他们的ID等.我希望这会使问题更加清晰.

或者我没有想到这个正确的方法?我觉得我很难正确地描述我的问题.

科瑞

小智 61

正如S.Lott已经指出的那样,我们在这里有两个折叠的东西:登录和身份验证

认证在这里是超出范围的,因为这被广泛讨论并且有共同的协议.但是,客户端实际需要为RESTful Web服务成功验证自身需要什么?对,某种令牌,我们称之为访问令牌.

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

因此,服务器可以提供资源URL"/ accesstokens",用于POST用户名和密码,返回到新创建的资源"/ accesstokens/{accesstoken}"的链接.或者,您返回包含访问令牌和带有资源链接的href的文档:

<access-token
  id="{access token id goes here; e.g. GUID}"
  href="/accesstokens/{id}"
/>

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

您可能遇到的最后一个问题是,您是否应将用户名和密码作为HTML表单或文档(例如XML或JSON)发布 - 这取决于...... :-)

  • 不完全遵循REST,但是比其他人更简单,更可靠.另外还有幽默感. (4认同)
  • 帕特里克(Patrick),您提出的答案与此相同吗?http://stackoverflow.com/a/1135995/14731 (2认同)

S.L*_*ott 25

你没有"登录".你"认证".差异世界.

您有许多身份验证替代方案.

HTTP Basic,Digest,NTLM和AWS S3身份验证

  • HTTP基本和摘要式身份验证.这使用HTTP_AUTHORIZATION标题.这非常好,非常简单.但是会导致很多流量.

  • 用户名/签名验证.有时称为"ID和KEY"身份验证.这可以使用查询字符串.

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

    这就是亚马逊使用的地方.用户名是"id"."密钥"是摘要,类似于用于HTTP摘要式身份验证的摘要.双方必须就摘要达成一致才能继续进行.

  • 某种基于cookie的身份验证. 例如,OpenAM可以配置为代理进行身份验证,并提供RESTful Web服务器随后可以使用的cookie.客户端将首先进行身份验证,然后为每个RESTful请求提供cookie.

  • @Darrel Miller:"你的想法......有缺陷"并没有提供适当的背景或任何有用的东西.这有点消极,也没有太大帮助. (6认同)
  • @ S.Lott 1)用户始终与RESTful系统进行交互.2)HTML是RESTful系统返回的完全有效的媒体类型.3)REST不是HTTP的子集.REST是一种架构风格,HTTP是一种protcol.4)RESTful系统不仅限于"Web服务"5)RESTful系统可以通过使用某种形式的授权令牌来模拟登录,而不会遇到与会话相关的问题. (5认同)
  • @Darrel Miller:"声称REST仅限于......简直荒谬".随你.相反,重复什么是错的,你能解释一下是对的吗?你能提供简单的积极陈述而不是否定陈述吗?你能解释一下REST是什么而不是它是什么?它有无数的东西. (4认同)
  • @Darrel Miller:5.2.1.2表达似乎很清楚.你的评论非常消极.你能提供积极的更正或更新,而不是消极吗?我无法弄清楚如何纠正或修改我的答案以满足你,因为你所做的只是说我有点"有缺陷"或"散布不正确的信息"或"荒谬".什么不那么有缺陷,不正确或不那么荒谬? (3认同)
  • @ S.Lott @Corey用户绝对可以与RESTful系统进行交互.大多数静态HTML网站都是RESTful"服务". (2认同)
  • @ S.Lott你问了上下文,我给了你上下文.你对这个问题的原始答案很好.你显然很了解HTTP.我只觉得需要纠正正在进行的无效断言.你携带一个大代表,因此你的声音很重.但是,没有人是每个学科的专家.至于我是建设性的并解释REST是什么,你可以自由地仔细阅读我提供给REST标记的其他489个答案.或者,如果您有特定问题,请将其标记为REST,我一定会对其进行标记. (2认同)