【问题标题】:Connect angularjs webapp to REST API (PHP)将 angularjs webapp 连接到 REST API (PHP)
【发布时间】:2014-07-03 18:06:49
【问题描述】:

我有一个用 PHP(Slim framework) 编写的 REST API,我的 API 包含一些用于管理私有数据的管理路由。我已经实现了 oAuth2.0 进行授权(this php implementation)。

我喜欢使用 AngularJS 来创建一个管理 web 应用程序,以便用户可以管理自己的数据。

我现在正在使用用户名-密码流程,但我了解到这并不安全,因为我的 webapp 公开了 client_id 和 client_secret。

我还研究了隐式授权(专为公共客户设计),但它说它应该用于只读目的。

我还想使用此 API 为移动应用程序提供数据。用户无需为此登录,但数据不公开。

哪种 oauth 授权适合这种情况/设置?

【问题讨论】:

    标签: php angularjs rest oauth-2.0 authorization


    【解决方案1】:

    看看Resource Owner Password Credentials Grant。这是您提供的第二个链接中的第 4 个要点。 password (user credentials)

    https://www.rfc-editor.org/rfc/rfc6749#section-4.3

    简单地说:

    1. 用户发送他们的loginpassword
    2. 服务器授予用户access_token(相当于旧的cookie会话ID)
    3. 用户发送access_token 连同他们的其余请求

    另外, 如果您想在保持数据私密的同时授予移动设备访问权限,我建议您生成与移动 mac 地址相关联的“免费”帐户。然后让他们使用他们的mac地址作为登录名/密码为空进行上述身份验证。这样,您就可以在每个设备上使用节流/禁止/升级/等实现相同的用户逻辑。

    【讨论】:

    • 这和用户名密码授权一样吗?我不这么认为,我认为这是只有一个用户名和密码(即资源所有者密码)的地方,它不合适。这种授权类型的关键短语“适用于资源所有者与客户端具有信任关系的情况,例如设备操作系统或高特权应用程序”。 javascript 应用程序没有这种信任关系,它不能被信任。
    • 两者的区别是Resource Owner3rd Party。例如,如果我尝试直接登录 facebook,我就是资源所有者。但是,如果某些第 3 方尝试使用我的凭据登录,则需要添加 client_id/client_secret 来验证所述第 3 方。
    • 那么对于资源所有者密码凭据授予,如果我是资源所有者,我不必公开客户端 ID 和密码?
    【解决方案2】:

    我知道我将 Python 发布到一个 PHP 问题中,但这与代码无关。该示例 (http://python-eve.org/authentication.html#auth) 详细解释了哪些身份验证方法可用于良好的 REST API,并且可能对您的应用程序有用。

    【讨论】:

      【解决方案3】:

      如果您对留下客户端凭据或授权代码的隐式或用户名密码不满意。

      客户端凭据在这种情况下不适用,因为无法在浏览器上运行的 javascript 应用程序中保护凭据(如果您正在谈论证书,甚至可能无法使用客户端凭据)。

      所以授权码是你唯一的选择。

      但是,您无法在授权代码流中保护客户端机密。

      隐式确实是浏览器应用程序的唯一 OAuth2 选项。 OAuth 威胁模型中有一个部分讨论了潜在问题和缓解措施。 https://www.rfc-editor.org/rfc/rfc6819#section-4.4.2

      这是另一个关于隐式授权的安全含义的问题。 How secure is Oauth 2.0 Implicit Grant?

      【讨论】:

      • 好吧,我担心的是用户名密码也不安全,因为客户端 ID 和密码是通过 webapp 的源(仅限 angularjs)暴露的?
      • 我没有看用户名密码流程,因为你已经说过你已经排除了它。
      • 这是来自aaronparecki.com/articles/2012/07/29/1/…的关于用户名-密码流的引用“假设大多数密码授予用例将是移动或桌面应用程序,其中的秘密无法保护。”。它似乎不太安全,OAuth 应该可以防止您收集和发送用户凭据,但 username-password 正是这样做的。
      • 我不确定您是否遵循了之前的评论。用户名密码流程不使用客户端 ID 和密码,因此无法通过 webapp 的源公开。
      • 好吧,我使用的 php 实现需要客户端 ID 和密钥来授予资源所有者密码凭据,而对于我所阅读的内容,它需要用于客户端验证
      【解决方案4】:

      由于堆栈溢出是愚蠢的,我无法发表评论,因为我不经常访问此站点。但是,在我提供解决方案之前,我想知道您在什么情况下需要用户不登录才能更新数据?

      【讨论】:

      • 我的 API 有 1 个用于移动应用程序的部分,它应该只对 android 和 ios 应用程序可见,并且不需要用户登录。它包含一些管理端点,供我们/合作伙伴通过 angularjs webapp 更新他们的数据
      猜你喜欢
      • 2016-05-31
      • 1970-01-01
      • 2019-06-10
      • 2019-09-04
      • 1970-01-01
      • 2019-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多