REST API身份验证

问题描述:

我正在构建将托管在服务器上的应用程序。我想为应用程序构建一个API以促进与任何平台(Web App,Mobile App)的交互。我不明白的是,当使用REST API时,我们如何验证用户。REST API身份验证

例如,用户已登录然后想要创建论坛主题。我如何知道用户已经登录?

+3

您可能应该在这里搜索“REST身份验证”。它已经涵盖了许多其他问题。 –

+9

简而言之,让客户端使用HTTP基本身份验证(通过SSL!)发送每个请求的用户名和密码,或者进行身份验证一次,以便客户端具有经过身份验证的会话,该会话将在一段时间不活动后过期(或者,您选择覆盖你的web框架的'会话处理)。所述会话然后可以被存储在cookie中,或者可以是每个请求传递的参数(例如Java领土中的JSESSIONID)。 – opyate

+0

请参阅[如何控制谁使用我的Web小工具](http://*.com/questions/12998701/how-to-control-who-uses-my-web-widget/)。 – Arjan

您可以使用HTTP基本或摘要式身份验证。您可以在其顶部使用SSL安全地对用户进行身份验证,但是会降低API的速度。

  • 基本身份验证 - 对使用用户名和密码
  • 摘要式身份验证Base64编码 - 通过网络发送之前散列的用户名和密码。

OAuth是最好的了。奥特所给出的优点是一个可撤销或可期望的令牌。请参阅下面的如何实现: 工作评论的链接:https://www.ida.liu.se/~TDP024/labs/hmacarticle.pdf

+4

请阅读[这个问题](http://*.com/questions/454355/security-of-rest-authentication-计划)以及Les Hazelwood(Apache Shiro的作者)提供的答案。 –

+3

链接已损坏。 – FreeAsInBeer

+2

工作链接:https://www.ida.liu.se/~TDP024/labs/hmacarticle.pdf – teksan

我认为最好的方法是使用OAuth2。谷歌它,你会发现很多有用的职位,以帮助您设置它。

从Web应用程序或移动应用程序开发API的客户端应用程序将变得更加容易。

希望它可以帮助你。

+2

请阅读[此问题](http:/ /*.com/questions/454355/security-of-rest-authentication-schemes)和Les Hazelwood(Apache Shiro的作者)的答案。 –

例如,当用户登录时。现在可以说用户想创建一个论坛主题,我将如何知道用户已经登录?

想一想 - 必须有一些握手来告诉您的“创建论坛”API,该当前请求来自经过身份验证的用户。由于REST API通常是无状态的,因此必须坚持的某个地方。您的客户端使用REST API负责维护该状态。通常情况下,用户登录后会传递一些令牌。如果令牌很好,请求就很好。

检查Amazon AWS如何进行身份验证。这是一个完美的例子,从一个API传递到另一个API。

*我想为我以前的回答添加一些实际的回应。尝试Apache Shiro(或任何认证/授权库)。底线,尽量避免自定义编码。一旦你已经集成了您喜爱的图书馆(我使用Apache四郎,顺便说一句),那么你可以做到以下几点:

  1. 创建一个登录/注销API,如:/api/v1/loginapi/v1/logout
  2. 在这些登录和注销的API,执行你 用户存储
  3. 结果的认证令牌(通常,JSESSIONID)被发送回客户端(网页,手机,等等)
  4. 从这时开始,所有后续调用由您的客户端 做将包括这个标记
  5. 比方说,你的下一个电话就是所谓/api/v1/findUser
  6. 的第一件事,这个API代码将做的是检查令牌的API的(“是 该用户认证?”)
  7. 如果答案回来如否,那么您将HTTP 401状态 丢回客户端。让他们处理它。
  8. 如果答案是YES,然后继续返回请求的用户

这就是全部。希望这可以帮助。

+0

所以你所描述的本质上是一个会话cookie,对吧? – LordOfThePigs

+0

是的,但会话在2个不同的地方“维护”。一个在API服务器中,另一个在浏览器中。在成功登录后,浏览器返回的JSON(或其他)应该将API服务器上的会话标识传递回浏览器。这些会话由其各自的代理独立管理。 – Kingz

+0

@Kingz:对我来说听起来像是会话cookie。对于会话cookie,服务器维护会话ID并将其与给定用户相关联。然后,浏览器将该ID存储在每次发送给服务器的Cookie中。我不确定在2个不同的地方“维护”你的意思,除非你的意思是存储令牌。 – Chris

  1. 使用HTTP基本验证验证客户端,但治疗的用户名/密码,仅作为令牌临时会话。

    会话令牌只是一个报头附接到 HTTP请求,例如:Authorization: Basic Ym9ic2Vzc2lvbjE6czNjcmV0

    字符串以上Ym9ic2Vzc2lvbjE6czNjcmV0只是字符串“bobsession1:s3cret”在Base64编码(这是一个用户名/密码) 。

  2. 要获得上述临时会话令牌,请提供一个API函数(例如:http://mycompany.com/apiv1/login),它将master-username和master-password作为输入,在服务器端创建临时HTTP Basic Auth用户名/密码,返回令牌(例如:Ym9ic2Vzc2lvbjE6czNjcmV0)。这个用户名/密码应该是临时的,它应该在20分钟左右后过期。

  3. 为了增加安全性确保您的REST服务通过HTTPS提供,这样的信息都没有转移明文

如果你在Java中,Spring Security的库提供了很好的支持,以实现上述方法

+1

为什么要在20分钟后过期?如果这是一个类似Facebook的网站,那么登录是直到用户注销? – Dejell

+1

@dejel我在假设“会议”是暂时性的。如果用户空闲,它通常会过期 – gerrytan