RESTful身份验证意味着什么?它是如何工作的?我在谷歌上找不到好的概览。我唯一的理解是在URL中传递会话密钥(记住),但这可能是错误的。
当前回答
@skrevel(http://www.berenddeboer.net/rest/authentication.html )讨论了一种复杂但真正失败的身份验证方法。
您可以尝试访问该页面(该页面应仅对经过身份验证的用户可见)http://www.berenddeboer.net/rest/site/authenticated.html没有任何登录凭据。
(很抱歉,我无法对答案发表评论。)
我会说REST和身份验证根本不混合。REST表示无状态,但“已验证”是一种状态。不能在同一层同时使用它们。如果你是一个RESTful的拥护者,并且不赞成状态,那么你必须使用HTTPS(即将安全问题留给另一层)。
其他回答
2019年2月16日更新
下面前面提到的方法本质上是OAuth2.0的“资源所有者密码凭据”授予类型。这是一种简单的起床和跑步方式。然而,使用这种方法,组织中的每个应用程序最终都将拥有自己的身份验证和授权机制。建议采用“授权代码”授权类型。此外,在下面我先前的回答中,我建议使用浏览器localStorage来存储身份验证令牌。然而,我开始相信饼干是实现这一目的的正确选择。在StackOverflow的回答中,我详细介绍了我的原因、授权代码授予类型实现方法、安全考虑等。
我认为以下方法可用于REST服务身份验证:
创建一个登录RESTful API以接受用户名和密码进行身份验证。使用HTTP POST方法在传输过程中防止缓存和SSL安全成功认证后,API返回两个JWT-一个访问令牌(有效期更短,例如30分钟)和一个刷新令牌(有效性更长,例如24小时)客户端(一个基于web的UI)将JWT存储在本地存储中,并且在随后的每个API调用中都会传递“Authorization:Bearer#access token”标头中的访问令牌API通过验证签名和到期日期来检查令牌的有效性。如果令牌有效,请检查用户(它将JWT中的“sub”声明解释为用户名)是否可以通过缓存查找访问API。如果用户被授权访问API,则执行业务逻辑如果令牌过期,API将返回HTTP响应代码400客户端在收到400/401时,调用另一个REST API,并在“Authorization:Bearer#refresh token”标头中使用刷新令牌来获取新的访问令牌。收到带有刷新令牌的呼叫时,通过检查签名和到期日期来检查刷新令牌是否有效。如果刷新令牌有效,则从DB刷新用户的访问权限缓存,并返回新的访问令牌和刷新令牌。如果刷新令牌无效,则返回HTTP响应代码400如果返回了新的访问令牌和刷新令牌,请转到步骤2。如果返回HTTP响应代码400,则客户端假定刷新令牌已过期,并向用户请求用户名和密码要注销,请清除本地存储
使用这种方法,我们每30分钟就要执行一次昂贵的操作,即加载具有用户特定访问权限详细信息的缓存。因此,如果取消了访问或授予了新的访问权限,则需要30分钟才能反映或注销,然后登录。
使用公钥基础结构(其中密钥的注册涉及适当的绑定)可确保公钥以确保不可抵赖的方式绑定到分配给其的个人
看见http://en.wikipedia.org/wiki/Public_key_infrastructure . 如果您遵循正确的PKI标准,可以识别并锁定不正确使用被盗密钥的人或代理。如果要求代理使用证书,则绑定变得非常紧密。一个聪明且行动迅速的小偷可以逃跑,但他们会留下更多的面包屑。
这当然不是关于“会话密钥”,因为它通常用于指在REST的所有约束条件下执行的无会话身份验证。每个请求都是自我描述的,携带足够的信息,可以在没有任何服务器端应用程序状态的情况下自行授权请求。
最简单的方法是从RFC 2617中的HTTP内置认证机制开始。
以我的理解来回答这个问题。。。
一种使用REST的身份验证系统,因此您不需要实际跟踪或管理系统中的用户。这是通过使用HTTP方法POST、GET、PUT、DELETE完成的。我们采用这4种方法,并将它们视为数据库交互的CREATE、READ、UPDATE、DELETE(但在web上,我们使用POST和GET,因为这是锚标记当前支持的)。因此,将POST和GET视为我们的CREATE/READ/UPDATE/DELETE(CRUD),然后我们就可以在web应用程序中设计路由,从而推断出我们正在实现的CRUD操作。
例如,在RubyonRails应用程序中,我们可以构建我们的web应用程序,以便如果登录的用户访问http://store.com/account/logout则该页面的GET可以被视为用户试图注销。在我们的rails控制器中,我们将在中构建一个操作,将用户注销并将其发送回主页。
登录页面上的GET将生成一个表单。登录页上的POST将被视为登录尝试,并获取POST数据并使用它进行登录。
对我来说,这是一种使用映射到其数据库含义的HTTP方法的实践,然后构建一个身份验证系统,您不需要传递任何会话id或跟踪会话。
我还在学习——如果你发现我说的任何错误,请纠正我,如果你了解更多,请将其张贴在这里。谢谢
我认为restful身份验证涉及将身份验证令牌作为请求中的参数传递。示例是api对apikey的使用。我认为使用cookie或http身份验证不合格。
推荐文章
- 调用webrequest, POST参数
- 摘要认证和基本认证的区别是什么?
- 如何在Spring RestTemplate请求上设置“接受:”头?
- 什么是端点?
- 配置系统初始化失败
- REST API最佳实践:查询字符串中的参数vs请求体中的参数
- Java中SOAP和rest式web服务的主要区别
- 如何为Java创建REST客户端?
- file_get_contents(): SSL operation failed with code 1, failed to enable crypto
- 在Subversion中,我可以是我的登录名以外的用户吗?
- 在HttpClient和WebClient之间进行选择
- 执行没有实体主体的HTTP POST被认为是不好的做法吗?
- JavaScript/jQuery下载文件通过POST与JSON数据
- 基于Spring的RESTful认证
- 使用Python向RESTful API发出请求