RESTful身份验证的含义是什么?它是如何工作的?我无法在Google上找到一个很好的概述.我唯一的理解是你在URL中传递会话密钥(remeberal),但这可能是非常错误的.
我正在努力将RESTful原则应用于我正在研究的新Web应用程序.特别是,为了成为RESTful,每个HTTP请求应该自己携带足够的信息,以便其接收者处理它以与HTTP的无状态特性完全协调.
该应用程序允许用户搜索药物.搜索接受过滤器作为输入,例如,返回停止的药物,包括免费治疗等.等等.总共有大约30个可以应用的过滤器.
此外,可以输入患者详细信息,包括患者年龄,性别,当前药物等.
要保持安静,每个请求都应包含所有这些信息吗?这似乎给网络带来了巨大的开销.此外,对于URL长度的限制,至少对GET来说,这不是不可行吗?
我已经阅读了很多关于使用REST和Angular进行身份验证和授权的SO线程,但我仍然觉得我对我希望做的事情有一个很好的解决方案.对于某些背景,我打算在AngularJS中构建一个我想要支持的应用程序:
所有对REST API的调用都需要通过SSL进行.我想在不破坏RESTful原则的情况下构建应用程序,即不保持会话状态存储在服务器上.当然,在客户端进行的任何授权都必须在服务器端得到加强.由于我们需要在每个请求中传递整个状态,因此我知道我需要传递某种令牌,以便接收REST请求的后端服务器可以对该调用进行身份验证和授权.
话虽如此,我的主要问题是身份验证 - 这里的最佳做法是什么?似乎讨论了很多不同的方法,这里只是我发现的一些方法:
有一个类似的问题(AngularJS最佳实践应用程序身份验证),但除非我误解了答案,否则似乎意味着应该使用服务器会话,这违反了RESTful原则.
我对Amazon AWS和George Reese文章的主要关注是它似乎假设消费者是一个程序,而不是最终用户.可以提前向程序员发出共享密钥,然后可以使用它在此处对呼叫进行编码.这不是这种情况 - 我需要代表用户从应用程序中调用REST API.
这种方法是否足够?假设我有一个会话资源:
POST/api/session
为用户创建新会话
要创建会话,您需要POST一个包含"username"和"password"的JSON对象.
{
"email" : "austen@example.com",
"password" : "password"
}
Run Code Online (Sandbox Code Playgroud)
卷曲示例
curl -v -X POST --data '{"username":"austen@example.com","password":"password"}' "https://app.example.com/api/session" --header "Content-Type:application/json"
Run Code Online (Sandbox Code Playgroud)
响应
HTTP/1.1 201 Created {
"session": {
"id":"520138ccfa4634be08000000",
"expires":"2014-03-20T17:56:28+0000"
}
}
Run Code Online (Sandbox Code Playgroud)
状态代码
为清楚起见,我将HATEOAS细节遗漏.在后端,将创建一个新的,有限持续时间的会话密钥并与用户相关联.在后续请求中,我可以将其作为HTTP标头的一部分传递:
Authorization: MyScheme 520138ccfa4634be08000000
Run Code Online (Sandbox Code Playgroud)
然后,后端服务器将负责从请求中消化此内容,查找关联用户并强制执行请求的授权规则.它应该也可以更新会话的到期时间.
如果所有这一切都发生在SSL上,我是否会对任何我应该保护的攻击敞开大门?您可以尝试猜测会话密钥并将它们放在标头中,因此我想我还可以在会话密钥中附加用户GUID以进一步防止暴力攻击.
我已经积极编程已经有几年了,我刚刚回到这里.抱歉,如果我是钝的或不必要地重新发明轮子,只是希望社区根据我的阅读目前运行我的想法,看看他们是否通过了试金石.
我读过很多文章说会话违反了无状态性REST。
如果用户登录服务器,服务器会将会话cookie(ssid)提供给客户端,并将会话数据(用户数据)存储在服务器中,在本例中为内存。
它违反了无国籍状态,这是有道理的。
但是会话存储在数据库中怎么样?
如果用户登录服务器,服务器将会话cookie( ssid)提供给客户端,并将会话数据存储在mysql数据库中,而不是存储在内存中。
这是否也违反了无国籍状态?
如果是这样,“会话存储在数据库中”和“用户请求正在查询数据库数据”有什么区别?
当客户端发出请求时,它们都从数据库中提取一些数据。
显然,后者并不违反无状态性,否则REST建筑永远不会如此受欢迎。
我之前的问题,关于数据库的 RESTful 违规,回答者说“它没有违规”
反之亦然,会话真的违反了 RESTful 吗?回答者说“是的,这是违规的”。但该答案可能绑定到唯一的服务器端(内存)。
如此迷茫。
我正在构建一个包含多个服务器的RESTful API,我想知道可以将访问令牌存储在中央数据库服务器中,然后,对于每个请求,通过查询数据库并执行给定的操作来验证此访问令牌是否有效.
如果我使用会话来完成这项工作,那么它会变成非RESTful吗?就像我将会话数据存储在数据库中一样?这对我来说一直是个令人困惑的想法.
我有一个典型的用户管理模块,我想为其创建REST API。用户应该能够访问他/她的详细信息,但不应被允许访问其他用户详细信息。作为管理员用户,应该能够获取任何用户或删除任何用户。
这就是我打算创建URL端点的方式,有什么建议吗?
# To create/register user
POST /api/users/
# or
POST /api/register/
# To get all users
# This will be allowed to access only by admins.
GET /api/users/
# To get current user.
# For admin, allowed
# For regular user, id will be validated against userid stored in the session.
GET /api/users/<id>/
# To update current user.
# This id will be validated against userid stored in the session.
PUT /api/users/<id>/
# To delete current user.
# …Run Code Online (Sandbox Code Playgroud) 我知道要创建无状态应用程序,我们需要来回传输用户状态而不是服务器保持用户状态.
但是,必须有一些状态存储在服务器中,我读到这篇文章,存储在服务器中的状态称为资源状态.所以,如果我是对的,我们经常调用的客户端状态应该与应用程序状态相同.
那么,我如何区分这两者,因为它将确定它们是应该存储在服务器中还是传输的.
以购物车为例.
如果在用户完成购买之前有5个步骤,则用户的阶段(#3,#4)似乎是应用程序状态,但这是否意味着如果他们关闭浏览器并再次点击付费,他将不得不从step1开始?
他图表中的项目怎么样?如果我们将其视为应用程序状态,我们需要将所有项目放在请求中.但是如果我们这样做,当用户关闭浏览器并再次登录时,他将无法再次找到他的项目,因为浏览器无法记住所有项目.因此,我们似乎应该将其视为资源状态.但如果是这样,当用户点击付费时,他们会有一个不同的页面:根据他的购物车是否为空,去支付或说"你的购物车是空的".因此,具有完全相同的param输入的相同请求出现了不同的结果,我们仍然可以说它是无状态的吗?
也许我明白了什么不对,请问任何人可以回答如何区分不同类型的状态以及如何区别对待它们?
我已经读过,会话违反了RESTfulness的概念.
由于微服务不可避免地使用REST,这同样适用吗?如果是这样,为什么我们有春季会议?它甚至列出了'Spring Session允许在头文件中提供会话ID以使用RESTfulAPI'作为其功能之一.
java spring-security spring-boot spring-session microservices
是否有更现代的PHP会话替代方案,还是PHP会话仍然是存储信息的主要选择?我读到这个:https://pasztor.at/blog/stop-using-php-sessions.我还在学习PHP,坦白说,我很无能为力.
我试图了解如何使用restful客户端为经过身份验证的用户实现安全性.我遇到麻烦的情况是如何阻止用户更新不属于他自己的购买,因为宁静的客户通过了购买ID.对于熟练的用户,产品id可以容易地被篡改.由于使用https可以阻止或减轻它,因此我并不感兴趣.我真的对试图更新不属于他们的用户感兴趣.
你如何在其他世界阻止这种攻击?Web参数篡改
我被问及Web API和RESTful服务之间的区别,这对我来说也是一个有趣的问题.从我的角度来看,RESTful服务和Web API之间唯一可能的区别可以被认为是RESTful服务本质上意味着无状态(虽然我们可以使用cookie),而本质上无状态的概念不适用于Web API因为我们可以使用会话(不能在RESTful服务中使用).
但是,我决定发布这个问题,看看是否存在将这两种技术相互区分的任何其他潜在差异.
rest ×9
session ×2
angularjs ×1
api ×1
architecture ×1
crud ×1
java ×1
php ×1
restful-url ×1
security ×1
spring-boot ×1
state ×1
stateless ×1
web-services ×1