代码之家  ›  专栏  ›  技术社区  ›  Carlos Alvares

阻止用户调用受保护的端点+OAuth2

  •  0
  • Carlos Alvares  · 技术社区  · 7 年前

    出于学习目的,我正在使用OAuth2开发RESTAPI+Angular 4应用程序。

    有些受保护的端点只能由经过身份验证的用户调用。让我们以更新用户配置文件的端点为例:

    邮递 /用户/{user\u id}

    登录的用户将能够通过进入更新配置文件屏幕来更新自己的配置文件,该屏幕将在后台调用/users/{user\u id}发送带有新信息和访问令牌的有效负载。

    我们如何防止恶意用户调用同一端点来更新其他用户的配置文件?

    id为1的用户应该可以调用/users/1,但不能调用/users/2?

    这是可以用OAuth完成的吗?或者我在这里误解了什么?

    谢谢

    3 回复  |  直到 7 年前
        1
  •  2
  •   Georg Wittberger    7 年前

    如果您想坚持使用典型的REST样式API(即,要更新的用户配置文件的ID随请求一起发送),则必须向服务器端添加一些额外的检查。用于对用户进行身份验证的访问令牌包含用户的身份,这将导致相应的 Principal 请求范围中的对象。您必须检查此主体所代表的用户是否真的有权使用请求中的ID更新给定的用户配置文件。

    例如,您可以首先从数据库加载具有给定ID的概要文件,然后检查用户名是否等于主体的用户名。这也可以由Spring Security完成 PreAuthorize 注释和它的论点中的一点特殊魔力。

    另一种方法:远离REST样式的API,只需提供一个端点 /update-profile (或类似命名),不需要用户ID作为URL的一部分。然后,只需获取使用访问令牌指定的用户身份,并更新数据库中相应的概要文件。因此,用户只能更新她/他可以获取访问令牌的配置文件。-缺点是,您将无法允许某些超级用户或管理员在此设置中更新任何任意配置文件。

        2
  •  -1
  •   Vinko Vorih    7 年前

    在angular中有一种很酷的东西叫做guards。此处是文档链接: https://angular.io/guide/router

        3
  •  -1
  •   Community CDub    3 年前

    请阅读有关Oauth2的Spring安全性。因为您同时实现了后端和前端,所以密码授予类型是合适的。Oauth 2.0规范在这里讨论了它: password grant type (aka, Resource Owner Password Credentials) check this link as well

    要回答您的问题,请在密码授予类型中使用用户名和密码来获取访问令牌。来自前端的每个请求都需要传递该访问令牌。安全端点将检查访问令牌是否有效,是否针对同一用户颁发。