【问题标题】:How to set up session token between JS and PHP API?如何在 JS 和 PHP API 之间设置会话令牌?
【发布时间】:2016-08-12 08:27:46
【问题描述】:

我设计了一个简单的 HTML/CSS 和 JS/jQuery 应用程序,现在是身份验证集成的时刻。在服务器端,我做了一个 REST API,它允许客户端获取一些数据。但是,现在我想使用访问和/或会话令牌对每个请求进行身份验证。

我阅读了许多网站以找到在客户端 (JS) 和 REST API (PHP) 之间建立安全性的协议或建议,但不幸的是,我什么也没找到或没有发现有趣的东西。 所以我请你启发我(如果你想)知道要做什么、要实现什么、约定等。

我读到的:

Designing a Secure REST (Web) API without OAuth

Token Based Authentication for Single Page Apps (SPAs)

根据我的声誉,我无法发布更多链接...

请给我一些建议,如何存储私有令牌 (RSA) 或 API 的访问/会话令牌。

不要犹豫,给出你的反应,如果我不准确或别的什么,请告诉我。

【问题讨论】:

    标签: javascript php api authentication token


    【解决方案1】:

    您需要对 REST API 使用基于令牌的身份验证。在这种特殊情况下,JWT 是最好的。

    为什么使用 JSON Web 令牌?

    1. 令牌是无状态的。令牌是自包含的,包含验证所需的所有信息。这对于可扩展性非常有用,因为它使您的服务器不必存储会话状态。

    2. 可以从任何地方生成 JWT。 令牌生成与令牌验证分离,您可以选择在单独的服务器上处理令牌的签名,甚至可以通过 Auth0 等不同的公司来处理.

    3. JWT 具有细粒度的访问控制。在令牌负载中,您可以轻松指定用户角色和权限以及用户可以访问的资源。

    这将是您的典型身份验证流程:

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

    BTW,如果不想自己实现认证,可以使用Auth0,查看VanillaJS SPA和PHPquickstart

    我希望这些信息对您有所帮助。干杯!

    【讨论】:

    • 是的,这些信息确实有帮助!但我想问一下服务器生成的秘密。如果我理解得很好,客户端发送名称和密码(通过 HTTPS),服务器从名称和密码等生成秘密。我想我可以像这样生成 sercret:hash256(name+pwd) 和其他散列部分。没关系 ?我做错了什么? P.S:你的链接真的很有趣,谢谢。
    • 我猜你称这个令牌为“秘密”。服务器生成令牌。建议您使用我推荐的库来生成令牌。现在,您将需要一个服务器密码,该库也可以使用它来生成安全令牌。
    【解决方案2】:

    使用 JavaScript 前端验证 REST API 很困难,因为访问该站点的任何人都可以完全读取 JavaScript 代码,因此存储任何类型的登录凭据都不好。

    使用标准的服务器到服务器设置,只需通过 HTTPS 使用基本身份验证就足够了,但基本身份验证对 JavaScript SPA 没有好处,因为凭据是显而易见的。

    对于 SPA,您需要查看 JSON WebTokens,因为您的后端是 PHP,您需要查看来自 firebase 的 PHP-JWT。您可以在此处获取代码:https://github.com/firebase/php-jwt 或推荐使用 composer:

    composer require firebase/php-jwt
    

    该软件包使 JWT 的实现变得超级简单,请参阅文档以获取完整的代码示例。还可以查看 JWT 以获得完整的分解https://jwt.io/

    【讨论】:

    • 我刚刚阅读了这个article 和 jwt.io 文档,但是我不明白如何在客户端拥有密钥。是由客户端生成的(我假设不是)?它是如何产生的?我承认这部分引起了我的兴趣,关键的秘密对我来说是模糊的。
    • 这里解释完整有点复杂。您将 JWT 本地存储在 localStorage 中,用户可以精确地执行此操作,但这样做不会给用户带来额外的价值。 JWT 已编码(默认为 HMAC SHA256),因此在不知道“秘密”的情况下,另一个用户设法从用户​​ localStorage 获取 JWT(我相信还没有任何已知的攻击)无法构造和发送虚假请求。
    【解决方案3】:

    我想 Jwt (https://jwt.io/) 是解决您问题的好方法。

    在客户端,您可以将令牌存储在 localStorage 或某个全局变量中(对于 SPA)。

    您可以在 HTTP 标头上或作为请求参数传输令牌。它有效。

    你也可以看到https://auth0.com/blog/angularjs-authentication-with-cookies-vs-token/

    【讨论】:

      猜你喜欢
      • 2021-09-07
      • 2021-06-12
      • 1970-01-01
      • 1970-01-01
      • 2015-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-24
      相关资源
      最近更新 更多