RESTful身份验证意味着什么?它是如何工作的?我在谷歌上找不到好的概览。我唯一的理解是在URL中传递会话密钥(记住),但这可能是错误的。
当前回答
用于保护任何web应用程序的有效提示
如果你想保护你的应用程序,那么你应该首先使用HTTPS而不是HTTP,这样可以确保你和用户之间建立一个安全的通道,防止嗅探来回发送给用户的数据,并有助于对交换的数据保密。
您可以使用JWT(JSON Web令牌)来保护RESTful API,与服务器端会话相比,这有很多好处,好处主要是:
1-更具可扩展性,因为您的API服务器不必为每个用户维护会话(当您有多个会话时,这可能是一个很大的负担)
2-JWT是独立的,具有定义用户角色的声明,例如,他可以访问的内容,并在日期和到期日发布(之后JWT将无效)
3-更易于跨负载平衡器处理&如果您有多个API服务器,因为您不必共享会话数据,也不必配置服务器将会话路由到同一服务器,只要JWT请求命中任何服务器,就可以对其进行身份验证和授权
4-减少了数据库的压力,也不必为每个请求不断存储和检索会话id和数据
5-如果您使用强密钥签署JWT,JWT不会被篡改,因此您可以信任随请求发送的JWT中的声明,而无需检查用户会话&无论他是否获得授权,您只需检查JWT,然后您就可以知道该用户可以做什么。
许多库提供了在大多数编程语言中创建和验证JWT的简单方法,例如:在node.js中,最流行的是jsonwebtoken
由于REST API通常旨在使服务器保持无状态,因此JWT与这一概念更为兼容,因为每个请求都使用自包含的授权令牌(JWT)发送,而服务器无需跟踪用户会话,而会话使服务器保持有状态,从而记住用户及其角色,然而,会话也被广泛使用并有其优点,如果需要,可以搜索。
需要注意的一点是,您必须使用HTTPS将JWT安全地交付给客户机,并将其保存在安全的地方(例如,本地存储)。
您可以通过此链接了解有关JWT的更多信息
其他回答
首先也是最重要的,RESTful web服务是无状态的(或者换句话说,无会话的)。因此,RESTful服务没有也不应该包含会话或cookie的概念。在RESTful服务中进行身份验证或授权的方法是使用RFC 2616 HTTP规范中定义的HTTP授权头。每个请求都应该包含HTTP授权头,并且请求应该通过HTTPs(SSL)连接发送。这是在HTTPRESTful web服务中进行身份验证和验证请求授权的正确方法。我已经为Cisco Systems的Cisco PRIME Performance Manager应用程序实现了RESTful web服务。作为web服务的一部分,我还实现了身份验证/授权。
使用公钥基础结构(其中密钥的注册涉及适当的绑定)可确保公钥以确保不可抵赖的方式绑定到分配给其的个人
看见http://en.wikipedia.org/wiki/Public_key_infrastructure . 如果您遵循正确的PKI标准,可以识别并锁定不正确使用被盗密钥的人或代理。如果要求代理使用证书,则绑定变得非常紧密。一个聪明且行动迅速的小偷可以逃跑,但他们会留下更多的面包屑。
这里是一个真正且完全的RESTful身份验证解决方案:
在身份验证服务器上创建公钥/私钥对。将公钥分发给所有服务器。当客户端进行身份验证时:3.1.发行包含以下内容的代币:到期时间用户名(可选)用户IP(可选)密码散列(可选)3.2.使用私钥加密令牌。3.3.将加密令牌发送回用户。当用户访问任何API时,还必须传递其身份验证令牌。服务器可以通过使用身份验证服务器的公钥解密令牌来验证令牌是否有效。
这是无状态/RESTful身份验证。
注意,如果包含密码哈希,则用户还将发送未加密的密码以及身份验证令牌。服务器可以通过比较散列来验证密码是否与用于创建身份验证令牌的密码匹配。需要使用HTTPS之类的安全连接。客户端的Javascript可以处理获取用户的密码并将其存储在客户端,可以存储在内存中,也可以存储在cookie中,可能使用服务器的公钥进行加密。
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分钟才能反映或注销,然后登录。
这就是实现这一点的方法:使用OAuth 2.0进行登录。
您可以使用Google以外的其他身份验证方法,只要它支持OAuth。
推荐文章
- Rails new vs create
- 如何使用邮差导出具体要求文件?
- 有没有REST api的命名规范指南?
- 令牌身份验证vs. cookie
- JWT vs cookie用于基于令牌的身份验证
- 什么是HTTP中的“406-不可接受的响应”?
- 哪些HTTP方法与哪些CRUD方法相匹配?
- RESTful服务中部分更新的最佳实践
- JAX-RS / Jersey如何自定义错误处理?
- 如何POST表单数据与Spring RestTemplate?
- Restful API服务
- 在用nodejs和express创建的REST API中设置响应状态和JSON内容的正确方法
- 如何POST JSON数据与PHP卷曲?
- 为跨源请求设置cookie
- REST身份验证方案的安全性