基于用户限制REST API结果

基于用户限制REST API结果,rest,backbone.js,oauth-2.0,Rest,Backbone.js,Oauth 2.0,我正在使用BackboneJS构建一个消息传递应用程序,它自然地使用REST接口持久化 我遇到的问题是,我不知道如何限制用户可以从API中提取哪些数据。例如,对/messages的调用此时将为所有用户返回消息。我希望该资源只返回属于当前用户的消息 在线搜索似乎表明oAuth2是解决此问题的最佳方法,但所有教程讨论的内容都已重定向到另一个地方,以确认访问并检索访问令牌 考虑到我的用户已经登录到消息应用程序,并且RESTAPI实际上是同一应用程序的一部分,我不喜欢让用户确认我自己的应用程序可以访问我

我正在使用BackboneJS构建一个消息传递应用程序,它自然地使用REST接口持久化

我遇到的问题是,我不知道如何限制用户可以从API中提取哪些数据。例如,对/messages的调用此时将为所有用户返回消息。我希望该资源只返回属于当前用户的消息

在线搜索似乎表明oAuth2是解决此问题的最佳方法,但所有教程讨论的内容都已重定向到另一个地方,以确认访问并检索访问令牌

考虑到我的用户已经登录到消息应用程序,并且RESTAPI实际上是同一应用程序的一部分,我不喜欢让用户确认我自己的应用程序可以访问我自己的API


有更好的方法吗?

oAuth2可能是您最好的选择--您肯定不想使用自己的安全性。然而,您所想到的oAuth2的味道可能不是您想要的

oAuth2有四种不同的风格,称为授权授予类型:

  • 授权代码:这是您正在考虑的类型。它通常被称为三腿oAuth,因为令牌授予过程中有三个参与者(应用程序、资源所有者和用户)。应用程序会询问用户资源所有者是否可以指定特定类型的资源访问权限。这是一个相当复杂的过程,允许验证用户凭据,而不允许应用程序访问它们。这在您的情况下是不必要的,因为您既是应用程序所有者也是资源所有者

  • 客户端凭据:这是一种通过服务器授权客户端应用程序的方法。它根本不使用用户凭据。如果完全信任您的客户端应用程序(所有客户端应用程序)正确保护用户数据,并且不向使用应用程序的用户公开其他用户的数据,或者您仅通过API提供非用户数据(例如,地图数据或目录数据),则您可能能够使用这种相当简单的oAuth2类型。但是,如果您希望在保护用户数据时保持警惕(并且不允许应用程序在用户未提供凭据的情况下访问数据),您可能不会使用此应用程序

  • 资源所有者密码凭据:用户的用户名和密码通过https传递到后端服务器,后端服务器通过提供访问令牌来验证和授权访问。然后,每次调用都可以传递访问令牌,并且在经过可配置的时间段之前,它对于访问后端仍然有效。这意味着拦截令牌的人只能在有限的时间内(通常是几分钟)成功使用它。拦截器不知道用户的用户名和密码。此外,您可以为应用程序提供刷新令牌,该令牌可用于在新访问令牌过期后获取新访问令牌(直到刷新令牌过期——通常过期日期要长得多)。由于凭据不经常通过网络传递(并且必须加密传递),因此这通常是保护用户凭据和不要求用户经常传递凭据的最佳解决方案(良好的用户体验)。实现比授权码授权类型简单得多

  • 隐式:这是最不安全的方法——根本不在服务器端验证凭据。这通常用于无法安全存储凭据的客户端脚本语言。如果您担心安全问题,请尽可能避免使用这种类型


  • 因此,请签出并查找资源所有者密码凭据授予类型。

    这是节点项目吗?您真的应该在服务器端管理它。服务器应该能够管理会话,并查看谁应该能够查看内容。@JonathanMiles不,这是正常的,在Apache上运行的旧PHP在客户端上具有主干side@YuruiRayZhang是的,数据应该限制在服务器端,但是由于REST是无状态的,如果没有我实现类似oAuthOk的东西,服务器就无法知道客户机是谁,我想我理解其中的区别。我需要做的是直接使用客户端用户名和密码从API请求访问令牌。API使用寿命较短的访问令牌和寿命较长的刷新令牌进行响应。访问令牌用于识别用户的请求,刷新令牌用于在访问令牌过期时重新生成访问令牌?你说不要自己滚?即使我遵循oAuth2协议,编写自己的类也是件坏事吗?听起来你已经弄明白了。当我说不要使用自己的身份验证协议时,我的意思是不要设计自己的身份验证协议。自己实现oAuth2很好。祝你好运