RESTful身份验证

795
RESTful认证是什么意思,它是如何工作的?我在谷歌上找不到一个好的概述。我唯一了解的是你可以通过URL传递会话密钥(rememberal),但这可能是完全错误的。

4
当我谷歌“Restful Authentication”时,我发现有很多Ruby on Rails插件。我猜想这些并不是你要找的。如果不是Ruby on Rails,那么你需要使用什么编程语言?需要用到什么网络服务器? - S.Lott
3
如果您使用HTTPS,那将不会出现严重的错误。完整的HTTP请求以及URL将被加密。 - Bharat Khatri
5
@BharatKhatri:是的,我不会在 URL 中向用户传递敏感信息。这种信息更有可能因为实际需要而泄露出去。HTTPS 无法防止意外泄漏。 - Jo So
3
“real RESTful authentication” 是什么意思?我对此很感兴趣,因为我刚刚实施了被接受答案中的第三种方式,但我不满意它(我不喜欢URL中的附加参数)。 - BlueLettuce16
5
有些人使用https://jwt.io/introduction/来解决这个问题。我现在正在研究这个问题,以解决我的情况:http://stackoverflow.com/questions/36974163/laravel-rest-authentication-when-post-via-httpclient-android >>希望这能正常运行。 - toha
14个回答

8

1
OAuth2没有HTTPS就不安全,也不是无状态的。 - Arnaud Bouchez
4
没有 HTTPS,就没有安全保障。 - Craig Tullis
1
@Craig,HTTPS也可能不安全,如果证书链被破坏,这可能是为了更大的利益 - https://en.wikipedia.org/wiki/Bullrun_(decryption_program) ;) - Arnaud Bouchez
1
@ArnaudBouchez,请解释一下拥有损坏的证书链对于更大的利益是如何的?我不明白你的意思。;) - Craig Tullis
在移动应用程序上,除非进行SSL固定,否则VPN代理可能会破坏HTTPS。@Craig - amar
显示剩余3条评论

4

保护任何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的更多信息


4
使用公钥基础设施来注册密钥,确保公钥与其分配的个人正确绑定,以确保不可否认性。请参见http://en.wikipedia.org/wiki/Public_key_infrastructure。如果遵循适当的PKI标准,可以识别并锁定错误使用窃取密钥的人或代理。如果代理需要使用证书,则绑定非常紧密。聪明而迅速行动的窃贼可能会逃脱,但他们留下更多的线索。

2
从我的理解来回答这个问题...
一种使用REST的认证系统,因此您无需实际跟踪或管理系统中的用户。这是通过使用HTTP方法POST、GET、PUT、DELETE完成的。我们将这4种方法视为数据库交互的CREATE、READ、UPDATE、DELETE(但在Web上我们使用POST和GET,因为这是目前锚点标记支持的)。因此,将POST和GET视为我们的CREATE/READ/UPDATE/DELETE(CRUD),然后我们可以设计我们的Web应用程序路由,以便能够推断我们正在实现的CRUD操作。
例如,在Ruby on Rails应用程序中,我们可以构建我们的Web应用程序,使得如果已登录的用户访问http://store.com/account/logout,那么该页面的GET可以被视为用户尝试登出。在我们的Rails控制器中,我们将构建一个动作来记录用户并将其发送回主页。
在登录页面上进行GET将产生一个表单。在登录页面上进行POST将被视为登录尝试,并使用POST数据进行登录。
对我来说,这是一种使用映射到其数据库含义的HTTP方法的实践,然后根据这个构建认证系统,在这种情况下,您不需要传递任何会话ID或跟踪会话。我仍在学习--如果您发现我说的有错误,请纠正我,如果您学到更多内容,请在此处发布。谢谢。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接