2016-08-12 34 views
0

我设计了一个简单的HTML/CSS和JS/jQuery应用程序,现在是认证集成的时刻。在服务器端,我完成了一个允许客户端获取一些数据的REST API。但是,现在我想用访问和/或会话令牌来验证每个请求。如何在JS和PHP API之间设置会话令牌?

我读了很多网站来找到协议或建议,以建立客户端(JS)和REST API(PHP)之间的安全性,但不幸的是我没有发现任何东西或不感兴趣。 所以我问你见识一下(如果你想)知道该怎么做,来实现什么,公约等

我读什么:

Designing a Secure REST (Web) API without OAuth

Token Based Authentication for Single Page Apps (SPAs)

我不能发布更多的链接根据我的声誉...

只是给我的建议,方法如何存储私人令牌(RSA)或访问/会话令牌的API。

不要犹豫,给你的反应,并告诉我,如果我不是确切的或别的东西。

回答

0

使用JavaScript前端对REST API进行身份验证非常困难,因为任何访问该站点的人都可以完全读取JavaScript代码,因此存储任何类型的登录凭证都不会有好处。

使用标准的服务器到服务器设置,只需使用基于HTTPS的基本身份验证就足够了,但基本身份验证对于JavaScript SPA来说是没有用的,因为凭据是纯视图。

对于SPA,您需要查看JSON WebTokens,因为您的后端是PHP,您需要从firebase中查看PHP-JWT。你可以在这里得到代码:https://github.com/firebase/php-jwt或使用作曲家推荐:

composer require firebase/php-jwt 

的封装使执行JWT超级简单看文档的完整的代码示例。还查看JWT的完整分解https://jwt.io/

+0

我刚刚阅读这篇文章(http://www.jonathan-petitcolas.com/2014/11/27/creating-json-web-token-in-javascript.html)和jwt.io文档,但是我不明白如何在客户端拥有密钥。由客户端生成(我假设不)?它是如何产生的?我承认这部分吸引我,关键的秘密对我来说很模糊。 –

+0

这里完整解释有点复杂。您将JWT本地存储在localStorage中,用户可以确定这一点,但这样做不会给用户带来额外的价值。 JWT被编码(默认情况下HMAC SHA256),所以不知道'秘密',另一个用户以某种方式设法从用户​​localStorage获得JWT(我相信目前还没有任何已知的攻击)无法构建并发送虚假请求。 –

1

你需要使用一个基于令牌的认证为您的REST API。在这种特殊情况下,智威汤逊是最好的。

为什么使用JSON Web令牌?

  1. 令牌是无状态的。该令牌是自包含的,并且包含它所需的所有身份验证信息。这对扩展性非常好,因为它可以让您的服务器免于存储会话状态。

  2. JWTs可以从任何地方生成。令牌生成与令牌验证分离,允许您选择在单独的服务器上处理令牌签名,或者通过其他公司(例如Auth0)处理令牌签名。

  3. 智威汤逊具有细粒度的访问控制。在令牌载荷内,您可以轻松指定用户角色和权限以及用户可以访问的资源。

这将是你的一个典型的验证流程如下:

  1. 一个用户注册/登录,在登录过程中,你产生来自服务器的JSON网络令牌,并将其返回给客户端。由于您使用的是PHP,因此您可以使用此library来生成和签署令牌。
  2. 在浏览器Web存储(本地/会话存储)中存储返回给客户端的JWT。它也可以存储在一个cookie中。
  3. 对于从客户端到服务器的后续HTTP请求,您通过标头/查询发送令牌,然后服务器验证令牌。如果它是有效的,则用户被认证,否则用户被拒绝。

Typical authentication flow

顺便说一句,如果你不想自己实现身份验证,则可以使用Auth0,检查出VanillaJS SPA和PHP quickstart

我希望这个信息帮助。干杯!

+0

的确,信息有帮助!但我想问一下服务器产生的秘密。如果我理解的很好,客户端会发送名称和密码(通过HTTPS),服务器会根据名称和密码以及其他信息生成密码。我想我可以像这样生成sercret:hash256(name + pwd)和其他散列的部分。没关系 ?我做错了什么? P.S:你的链接真的很有趣,谢谢。 –

+0

我想你是在调用令牌“秘密”。服务器生成令牌。建议您使用像我推荐的库来生成令牌。现在,您需要一个服务器密钥,该库可以用来生成安全令牌。 – unicodeveloper

相关问题