RESTful API Auth流程

时间:2014-09-18 16:26:46

标签: php angularjs rest laravel

我在研究这个主题的最后一小时一直在堆栈溢出,所以我想我只是问我所有的具体问题。我正在构建一个Web应用程序,目前使用Laravel(PHP)作为API,Angular作为前端。我看过oAuth,但它有点令人生畏,所以我希望能够实现一个更简单的解决方案,然后在必要时重建它。

我目前实施的流程如下。 Angular将用户凭据(通过https)发布到我的休息后端,这只会返回一个生成的字符串(这可能是随机生成的,也可能是生成的)。然后将此字符串存储为cookie或我认为合适的任何浏览器状态,然后附加到每个API请求以及angular作为额外参数或请求标头或其他内容的用户标识。 API使用它来检查用户是否有权访问所请求的资源并做出相应的响应。我可能还会在字符串上添加一个到期时间,该时间将在每次请求后重置。

我的问题是,如果这是一个可接受的流程?在安全性方面,我最有可能遇到哪些问题? CSRF?会话固定?

我知道这是一个曾经被问过几次的问题,但我只是希望进行新的讨论并指出相关的信息。

3 个答案:

答案 0 :(得分:1)

如果我理解正确,这是我在大量API中看到的模型,特别是在无状态SOA世界中。您正在谈论的“字符串”通常被称为“身份验证令牌”。并且所有非公共API方法都需要令牌(并且它是有效的 - 到期是必要的,否则有人可以抓住旧令牌)包含在每个请求中(有或没有用户名 - 令牌应该是唯一可识别的为了使这不必要,但它没有伤害),这意味着在你做任何事情之前你必须先调用Login API(它不需要令牌,natch)来做任何事情。

您可能希望在每次使用(空闲超时)时刷新令牌的到期时间,否则您需要让您的客户知道他们可能需要每隔一段时间刷新令牌(即获得一个新令牌)(这比空闲超时更安全一个。)

答案 1 :(得分:1)

您描述的是某种基本的会话实现。由于REST有一个无状态限制,否认这些事情,我不认为这是一个可接受的解决方案。 Afaik您必须在可信客户的每个请求中发送用户名和密码。如果您有第三方客户端,那么您必须为它们生成api密钥和访问令牌(OAuth可以解决该部分)。如果您想了解有关REST约束的更多信息,请阅读Fielding dissertation

答案 2 :(得分:0)

感谢您输入所有人。最终我决定再按照建议再看看OAuth 2。我试图创建的内容无论如何都是OAuth流程......我没有尝试重新创建轮子,而是在PHP(和Laravel)中查看其他人的OAuth实现,这个实际的实现确实帮助我获得了想法。

我最后使用了这个包

https://github.com/thephpleague/oauth2-server

包裹laravel

https://github.com/lucadegasperi/oauth2-server-laravel

我对我的用例如何实现OAuth有点不确定,因为它只是用于内部使用。我发现,因为我对客户有很高的信任,所以使用的资源很大就是资源所有者凭证授权。

我现在面临的唯一真正问题是确保客户端ID和客户端密码。它存储在客户端绝对是一个问题,但我的理解是,这只是OAuth的问题之一。幸运的是,如果它遭到破坏,我可以撤销并重新发行。

其他遇到类似问题的人应该查看以下链接:

http://alexbilbie.com/2013/02/a-guide-to-oauth-2-grants/

http://tools.ietf.org/html/rfc6749

他们真的帮助我理解了OAuth 2。