因此,为了给您提供背景知识,我们有一个后端应用程序,它具有大量的API(Spring启动框架)。然后是一个包含React和Ember.js的UI应用程序。我们正在使用OAuth2.0访问令牌。
UI的每个页面都可以使用许多API资源,并且页面的权限(包括操作和按钮)与直接访问API的权限分开管理。
现在的问题是,为了阻止所有人使用其访问令牌,可以直接调用任何API。为此,我们决定将每个页面中使用的服务/资源或按钮链接到路由网址(Ember.js路由),以便根据用户对这些路由的许可,确定他们是否可以访问以下站点中的特定服务后端与否。换句话说,如果用户直接向服务发送请求,并说该服务已链接到用户界面世界中他无权访问的页面,那么安全检查将阻止他。
但是,这现在变得令人头疼。页面不断变化,某些服务被删除或添加了新服务,我们必须连续维护SQL脚本以保持两者之间的链接。现在要提到的是,由于UI(路线)的层次结构,这变得更加复杂。
现在我在想,如果我们可以确定某个请求来自某个UI,那么我们就不需要检查对API的许可,并且如果他们没有访问权限,就不会呈现该UI ,我们可以放心地让该请求进入并得到处理。而且,如果同一用户使用其UI令牌直接访问API,我们只需将其阻止即可。如果用户需要直接访问API,则必须获得用于API的特殊令牌(某些用户可能需要直接对其使用API)。
现在的问题是,如何确定来自UI的请求,而该UI页面是我们信任的页面?我在互联网上进行了搜索,但实际上找不到任何框架或协议。甚至有可能吗?
答案 0 :(得分:1)
我们如何确定请求来自UI,并且该UI页面是我们信任的页面?
您可能不会。为此,您需要一个受信任的执行环境,换句话说,是一种不受用户完全控制的执行环境。例如信用卡销售点机器,有线/卫星电视盒和ARM TrustZone。这些环境使您可以在用户不可见的客户端设备上存储秘密。然后,您可以使用此秘密在受信任的环境中与您的代码进行通信,而无需用户访问它。
您的用户的Web浏览器不是受信任的执行环境。用户可以在您的网页上看到所有的cookie,本地和会话存储等,并且可以使用它们通过诸如curl之类的东西直接发出请求,从而使请求看起来与来自浏览器的请求相同。
不是问题,但是您应该做什么?
鉴于您现在已进行了设置,听起来很痛苦,但是要对API进行所有安全性和许可。如果您不希望用户使用令牌自动调用API,请对令牌实施速率限制。
首先回顾一下进行此设置的原因可能也很有用。用户调用API是否直接使服务器超载?仅仅是关于用户在页面上看到的内容的用户体验吗?用户是否可以访问哪些数据和操作是否与访问有关?
答案 1 :(得分:0)
对不起,如果我完全错过了它,但这不只是跨源资源共享(CORS)的简单案例吗?
您将在每个控制器上将允许的CORS设置为您的UI /前端域的CORS。
@CrossOrigin(value = "example.com")
@RestController
public class PrivateController {
}
控制器现在将拒绝来自example.com
的所有内容。