相关疑难解决方法(0)

会话真的违反了R​​ESTfulness吗?

在RESTful API中使用会话是否真的违反了R​​ESTfulness?我看到很多意见朝着两个方向发展,但我不相信会话是无REST的.在我看来,我的观点是:

  • RESTfulness不禁止身份验证(否则在RESTful服务中几乎没有用)
  • 通过在请求中发送身份验证令牌(通常是标头)来完成身份验证
  • 此身份验证令牌需要以某种方式获取并可能被撤销,在这种情况下需要续订
  • 验证令牌需要由服务器验证(否则它不会是身份验证)

会话如何违反这一点?

  • 客户端,会话使用cookie实现
  • cookies只是一个额外的HTTP标头
  • 可以随时获取和撤销会话cookie
  • 如果需要,会话cookie可以有无限的生命周期
  • 会话ID(身份验证令牌)在服务器端验证

因此,对于客户端,会话cookie与任何其他基于HTTP头的身份验证机制完全相同,除了它使用Cookie头而不是Authorization其他专有头.如果cookie值服务器端没有附加会话,为什么会产生影响呢?只要服务器表现为 RESTful ,服务器端实现就不需要关注客户端.因此,cookie本身不应该使API无REST,而会话只是客户端的cookie.

我的假设是错的吗?什么使会话cookie RESTless

cookies rest session restful-authentication

472
推荐指数
4
解决办法
12万
查看次数

REST身份验证方案的安全性

背景:

我正在为REST Web服务设计身份验证方案.这并非"真正"需要安全(它更像是一个个人项目),但我希望尽可能安全地将其作为锻炼/学习体验.我不想使用SSL,因为我不想要麻烦,而且主要是设置它的费用.

这些SO问题对我开始特别有用:

我正在考虑使用简化版的Amazon S3身份验证(我喜欢OAuth,但它似乎对我的需求来说太复杂了).我正在为请求添加由服务器提供的随机生成的nonce,以防止重放攻击.

要回答这个问题:

S3和OAuth都依赖于对请求URL进行签名以及一些选定的标头.他们都没有签署 POST或PUT请求的请求体.这是不是容易受到中间人攻击,它会保留url和header并用攻击者想要的任何数据替换请求体?

看起来我可以通过在被签名的字符串中包含请求主体的哈希来防止这种情况.这样安全吗?

authentication rest oauth amazon-s3 rest-security

225
推荐指数
4
解决办法
11万
查看次数

如何使用node.js实现安全的REST API

我开始使用node.js,express和mongodb规划REST API.API为网站(公共和私人区域)以及稍后的移动应用程序提供数据.该前端将与AngularJS一起开发.

有些日子我读了很多关于保护REST API的内容,但我没有找到最终的解决方案.据我所知,使用HTTPS提供基本的安全性.但是我如何在该用例中保护API:

  • 只允许网站/应用的访问者/用户获取网站/应用的公共区域的数据

  • 只允许经过身份验证和授权的用户获取私有区域的数据(并且只有用户授予权限的数据)

目前我认为只允许具有活动会话的用户使用API​​.为了授权用户,我将使用护照并获得许可,我需要为自己实施一些内容.全部在HTTPS之上.

有人可以提供一些最佳实践或经验吗?我的"架构"是否缺乏?

rest node.js express passport.js

199
推荐指数
5
解决办法
11万
查看次数

如何保护RESTful Web服务?

我必须实现安全的RESTful Web服务.我已经使用谷歌进行了一些研究但是我被卡住了.

选项:

TLS(HTTPS)+

是否有更多可能的选择?如果OAuth那么什么版本?它甚至重要吗?从我到目前为止所读到的OAuth 2.0与持有令牌(没有签名)似乎是不安全的.

我发现了另一篇关于基于REST的身份验证的非常有趣的文章.

保护您的REST API ......正确的方法

security rest web-services restful-authentication oauth

88
推荐指数
3
解决办法
11万
查看次数

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

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

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

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

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

科瑞

rest web-services login web-applications restful-authentication

78
推荐指数
2
解决办法
9万
查看次数

在不重新发明轮子的情况下保护REST API

设计REST API时,首先对用户进行身份验证是否常见?

我正在寻找的典型用例是:

  • 用户想要获取数据.当然很酷我们喜欢分享!获取公共API密钥并阅读!
  • 用户想要存储/更新数据......等等!你是谁,你能做到吗?

我想建立一次,并允许说一个Web应用程序,一个Android应用程序或iPhone应用程序来使用它.

REST API似乎是符合此要求的逻辑选择

为了说明我的问题,我将使用一个简单的例子.

我在数据库中有一个项目,它有一个rating属性(整数1到5).

如果我正确理解REST,我将使用我选择的语言实现GET请求,返回csv,xml或json,如下所示:

http://example.com/product/getrating/{id}/
Run Code Online (Sandbox Code Playgroud)

假设我们选择JSON返回:

{
  "id": "1",
  "name": "widget1",
  "attributes": { "rating": {"type":"int", "value":4} }
}
Run Code Online (Sandbox Code Playgroud)

这适用于面向公众的API.我得到那个部分.

我有很多疑问的地方是如何将其与安全模型相结合?我已经习惯了网络应用程序安全性,我的会话状态一直在识别我的用户,所以无论他们决定发送给我什么,我都可以控制他们可以做什么.据我所知,这不是RESTful,因此在这种情况下是一个糟糕的解决方案.

我将尝试使用相同项目/评级的另一个示例.

如果用户"JOE"希望将添加评级项目

这可以使用:

http://example.com/product/addrating/{id}/{givenRating}/
Run Code Online (Sandbox Code Playgroud)

此时我想存储数据,说"JOE"给了产品{id}一个{givenRating}的评级.

问题:我如何知道请求来自"JOE"而不是"BOB".

此外,如果是用于更合理的数据,如用户的电话号码,该怎么办?

到目前为止我得到的是:

1)使用HTTP的内置功能在每个请求(通过HTTP或HTTPS)进行身份验证.

这意味着现在每个请求都采用以下形式:

https://joe:joepassword@example.com/product/addrating/{id}/{givenRating}/
Run Code Online (Sandbox Code Playgroud)

2)使用亚马逊S3的私有和公钥方法:http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/

3)无论如何使用cookie并打破REST的无状态部分.

第二种方法对我来说似乎更好,但我想知道我真的需要重新发明这一切吗?所有由我自己进行哈希,存储,生成密钥等等?

这听起来很像在典型的Web应用程序中使用会话并自己重写整个堆栈,这通常意味着"你做错了",尤其是在处理安全性时.

编辑:我想我也应该提到OAuth.

security api rest web-services

73
推荐指数
3
解决办法
5万
查看次数

Laravel 5.6 - 用于自助API的Passport JWT httponly cookie SPA身份验证?

注意:我在这个问题上有4个赏金,但下面没有提出的答案是这个问题所需要的答案.所需的一切都在下面的Update 3中,只是寻找要实现的Laravel代码.


更新3:此流程图正是我想要完成的流程,下面的所有内容都是原始问题以及一些较旧的更新.该流程图总结了所需的一切.

下面的流程图中的绿色部分是我知道如何做的部分.红色部分及其旁注是我正在寻找帮助完成使用Laravel代码.

在此输入图像描述


我已经做了很多研究,但是当使用Laravel和JWT httponly cookie进行自我消费的API时,信息总是很短而且不完整(大多数在线教程只显示JWT存储在本地存储中,这不是很安全).看起来像包含JWT by Passport的httponly cookie应该用于识别Javascript端的用户,当每次请求发送到服务器以验证用户是否是他们所说的用户时.

还有一些额外的东西需要全面了解如何使这个设置工作,我没有在一个教程中遇到这个包括:

  1. Laravel Passport(不是tymon auth)生成加密的JWT并将其作为httponly cookie发送,作为从JS端登录后的响应.使用什么中间件?如果刷新令牌添加更多安全性,如何实现?
  2. JavaScript(例如axios)api伪代码,用于调用auth端点,如何将httponly cookie传递给后端,以及后端验证令牌是如何有效的.
  3. 如果从多个设备登录单个帐户,那么设备被盗,如何撤销所有authed用户设备的访问权限(假设用户从他们可以控制的登录设备更改密码)?
  4. 什么会登录/注册,注销,更改密码,忘记密码控制器方法通常看起来像处理令牌的创建/验证/撤销?
  5. CSRF令牌集成.

我希望这个问题的答案可以作为一个易于遵循的指南,为未来的读者和那些正在努力寻找一个自我消费API的上述观点的答案.

更新1:

  1. 请注意我尝试过CreateFreshApiToken之前的功能,但是在撤销用户令牌时这不起作用(上面的第3点和第4点).这是基于此评论的核心laravel开发商,谈论时CreateFreshApiToken中间件:

由此中间件创建的JWT令牌不会存储在任何位置.它们不能被撤销或"不存在".它们只是为您的api调用提供了一种通过laravel_token cookie进行authed调用的方法.它与访问令牌无关.另外:您通常不会在发布它们的同一个应用程序上使用客户发出的令牌.您可以在第一方或第三方应用中使用它们.使用中间件或客户端发出的令牌,但不能同时使用两者.

所以似乎能够迎合第3点和第4点来撤销令牌,如果使用CreateFreshApiToken中间件则不可能这样做.

  1. 在客户端,Authorization: Bearer <token>处理安全的httpOnly cookie 似乎不是一种方法.我认为请求/响应应该包含安全的httpOnly cookie作为请求/响应头,像这样基于laravel文档:

使用此身份验证方法时,默认的Laravel JavaScript脚手架指示Axios始终发送X-CSRF-TOKEN和X-Requested-With标头.

headerswindow.axios.defaults.headers.common = {
    'X-Requested-With': 'XMLHttpRequest',
    'X-CSRF-TOKEN': (csrf_token goes here)
};
Run Code Online (Sandbox Code Playgroud)

这也是我寻找涵盖上述所有要点的解决方案的原因.道歉,我使用的是Laravel 5.6而不是5.5.

更新2:

似乎密码授予/刷新令牌授权组合是要走的路.使用密码授予/刷新令牌授权组合寻找易于遵循的实施指南.

密码授予: 此授权适用于与我们信任的客户交易,例如我们自己网站的移动应用.在这种情况下,客户端将用户的登录凭据发送到授权服务器,服务器直接发出访问令牌.

刷新令牌授权: 当服务器发出访问令牌时,它还会为访问令牌设置到期时间.当我们想要在访问令牌过期时刷新访问令牌时,使用刷新令牌授予.在这种情况下,授权服务器将在发出访问令牌时发送刷新令牌,该令牌可用于请求新的访问令牌.

我正在寻找一个易于实现,直接,全面的答案,使用密码授予/刷新令牌授权组合,涵盖上述原始5点的所有部分与httpOnly安全cookie,创建/撤销/刷新令牌,登录cookie创建,注销cookie撤销,控制器方法,CSRF等

csrf-protection laravel cookie-httponly laravel-5 laravel-passport

56
推荐指数
4
解决办法
4238
查看次数

单页应用程序上的用户身份验证?

我开发了一个单页应用程序原型,它在前端使用Backbone,并在服务器上使用瘦RESTful API来获取它的数据.

来自繁重的服务器端应用程序开发(php和python),我非常喜欢使用胖客户端MVC的新的不同设计方法,但我对如何最好地将应用程序限制为登录的经过身份验证的用户感到困惑.

我更喜欢将应用程序本身放在登录后面,并且除了站点的本机登录之外,还希望最终实现其他类型的登录(openid,fb connect等).我不清楚这是如何完成的并且一直在搜索 - 但是在找到让我清楚的信息方面不成功.

总体而言,目前注册用户并要求他们登录以使用您的单页应用程序的最佳做法是什么?

用户登录后,api请求如何进行身份验证?我可以存储会话但是如何在API调用中检测此会话,或者我是否需要在每次单独的API调用中传递一个令牌?任何答案都将非常感谢!

javascript authentication javascriptmvc backbone.js single-page-application

39
推荐指数
2
解决办法
1万
查看次数

Web应用程序的RESTful身份验证

嗨已经写了这个观察和问题,关于这个问题的较早,但后来才发现,这是一个老"死"的问题.由于我非常喜欢其他人的一些见解,我将其作为一个新问题重新发布.

对于如何进行RESTful身份验证的问题,人们通常会热情地喊出"HTTP身份验证".但是,我怀疑这些人是否曾尝试使用REST 制作基于浏览器的应用程序(而不是机器到机器的Web服务).(没有违法行为 - 我只是认为他们没有遇到过并发症)

我在RESTful服务上使用HTTP身份验证发现的问题是生成可在浏览器中查看的HTML页面:

  • 用户通常会得到一个丑陋的浏览器制作的登录框,这对用户不友好.你不能添加密码检索,帮助框等.
  • 以不同的名称注销或登录是一个问题 - 浏览器将继续向站点发送身份验证信息,直到您关闭窗口
  • 超时很难

铲球这些逐点非常有见地的文章是在这里,但是这导致的很多特定浏览器的JavaScript两轮牛车,变通办法变通办法,等等的.因此,它也不是向前兼容的,因此在发布新浏览器时需要不断维护.我不认为干净清晰的设计,而且我觉得这是一项额外的工作和头痛,这样我就可以热情地向我的朋友展示我的REST徽章.

我相信cookie是解决方案.但等等,饼干是邪恶的,不是吗?不,他们不是,饼干的使用方式往往是邪恶的.Cookie本身只是一条客户端信息,就像浏览器在浏览时会跟踪的HTTP身份验证信息一样.这条客户端信息在每次请求时都会发送到服务器,就像HTTP身份验证信息一样.在概念上,唯一的区别是所述内容这块客户端状态中的可以由确定服务器作为其响应的一部分.

通过使用以下规则使会话成为RESTful资源:

  • 一个会话映射一个关键用户ID(也可能是最后行动时间戳超时)
  • 如果存在会话,则表示该密钥有效.
  • 登录意味着POST到/ sessions,新密钥被设置为cookie
  • 注销意味着DELETEing/sessions/{key}(重载POST,请记住,我们是浏览器,HTML 5还有很长的路要走)
  • 通过在每个请求时将密钥作为cookie发送并检查会话是否存在且有效来完成身份验证

现在,与HTTP身份验证的唯一区别在于,身份验证密钥由服务器生成并发送给不断发送回来的客户端,而不是客户端从输入的凭据计算它.

我认为这是一个运行良好的充分解决方案,但我必须承认,我不足以识别此方案中的潜在漏洞 - 我所知道的是,数百个非RESTful Web应用程序使用的基本相同登录协议($ _SESSION inphp,j2ee中的HttpSession等).cookie头内容仅用于寻址服务器端资源,就像接受语言可能用于访问翻译资源一样,等等.我觉得它是一样的,但也许其他人不一样?你们觉得怎么样?

rest web-applications restful-authentication

24
推荐指数
1
解决办法
8102
查看次数

缓存GET调用的RESTful API结果的最佳方法

我正在考虑在前面创建缓存层的最佳方法,或者作为对我的RESTful API(用Ruby编写)的GET请求的第一层.

并非每个请求都可以缓存,因为即使对于某些GET请求,API也必须验证请求的用户/应用程序.这意味着我需要配置哪个请求是可缓存的以及每个缓存的答案有效多长时间.对于少数情况,我需要非常短的到期时间,例如15秒及以下.即使尚未达到过期日期,我也应该能够让API应用程序使缓存条目到期.

我已经考虑了许多可能的解决方案,我的两个最佳想法:

  • API的第一层(甚至在路由之前),我自己的缓存逻辑(手中有所有配置选项),答案和存储到Memcached的到期日期

  • 一个网络服务器代理(高可配置),也许像Squid之类的东西,但我从来没有使用代理这样的情况,我绝对不确定它

我还考虑过像Varnish这样的缓存解决方案,我将Varnish用于"通常"的Web应用程序,它令人印象深刻,但配置有点特别.但如果它是最快的解决方案,我会使用它.

另一个想法是缓存到Solr索引,我已经在数据层中使用它来查询数据库以查找大多数请求.

如果某人有关于此主题的提示或良好来源,请告诉我.

api rest memcached caching varnish

22
推荐指数
2
解决办法
4万
查看次数