当前位置: 首页 > 知识库问答 >
问题:

java - 如何通过 OAuth2.0 的 access_token 限制接口访问权限?

高修伟
2024-05-31

有个关于 oauth2.0 的问题,我有一个 A公司的 app,里面嵌套一个 B公司 h5 页面,其中 h5 页面要用到A公司 app的用户信息,经过 oauth2.0 拿到App 的 access_token 后,理论上他能调用 A公司app 的全部接口(对于A公司后端来说就是一个普通的用户的token),这个可以预防吗,要怎么限制做到颁发给 A公司的 access_token 只能访问特定的接口,而不能访问系统的其他接口呢

有考虑过 scope,但是 scope 我感觉上只是用户是否赋予 h5 页面 App 的可供调用接口里面的接口是否都授权。打个比喻 APP 提供给第三方公司调用的就三个接口,【获取手机号,获取用户真实姓名,获取用户身份证】其他接口都不可以调用,其中这三个接口 h5 都不是随便可以调用,而是要经过用户进行确认,确认后才可以调用,是做这个功能。但是关于 APP 如何控制第三方公司其他接口都不可以调用,只能调用【获取手机号,获取用户真实姓名,获取用户身份证】接口,是不是要另外做逻辑进行隔离。即控制h5能调用多少个 APP 接口是一回事,而用户是否授权其中某几个接口给 h5 调用,又是另外一回事了。我的理解是否正确呢

共有3个答案

能帅
2024-05-31

OAuth 本身就是个身份校验协议,如果你希望限制访问权限,就得自行实现。

没记错的话 scope 只是其中一个字段,用来方便携带一些信息,真正要实现功能还得你自己来。

何正德
2024-05-31

可以用scope 来做的,请求的时候scope 不同,如果用户一点同意了这些scope 的请求。那么就会发放不同权限的access_token。这时候,client 使用这个用户的access_token 就能请求到资源服务器的各种接口,资源服务器依据access_token 中的不容权限选择放行与否。

能远
2024-05-31

您对于 OAuth2.0 和 scope 的理解是正确的。在 OAuth2.0 中,scope 是用来定义客户端应用可以访问的资源或权限范围的。当用户授权一个应用时,他们会同意应用访问某些特定范围的数据或接口。

为了确保 A 公司的 access_token 只能访问特定的接口,而不是整个系统的接口,你应该采取以下措施:

  1. 定义精细化的 Scope

    • 为每一个接口或接口集合定义一个唯一的 scope。例如,phone_numberreal_nameid_card
    • 在授权过程中,只授予 B 公司 h5 页面需要的 scope。
  2. 接口级别的权限检查

    • 在 A 公司的后端接口中,检查每个请求中的 access_token 对应的 scope 是否包含该接口所需的 scope。
    • 如果不包含,则拒绝访问并返回相应的错误消息。
  3. 动态权限管理

    • 除了静态的 scope 定义,你还可以实现动态的权限管理系统,允许管理员为特定的客户端或用户设置更细粒度的权限。
  4. 使用中间件或拦截器

    • 在你的后端框架中,使用中间件或拦截器来自动执行权限检查,而不是在每个接口中手动检查。
  5. 文档和沟通

    • 确保与 B 公司明确沟通哪些接口是开放的,哪些不是,以及每个接口需要的 scope。
  6. 审计和监控

    • 实施审计和监控机制,定期检查哪些接口被哪些客户端访问,以及是否有未经授权的访问尝试。
  7. 考虑使用 API Gateway

    • API Gateway 可以作为一个中央入口点,用于管理所有 API 请求的权限和流量。它可以在请求到达后端服务之前进行权限检查和其他逻辑处理。
  8. 刷新 Token 和撤销机制

    • 如果需要,实现 token 刷新和撤销机制,以便在必要时撤销对某个客户端的访问权限。

通过这些措施,你可以确保即使 B 公司的 h5 页面获得了 A 公司的 access_token,它也只能访问被明确授权的接口,而不能访问其他未授权的接口。这有助于保护你的 API 和用户数据的安全。

 类似资料:
  • 本文向大家介绍理解Java访问权限控制,包括了理解Java访问权限控制的使用技巧和注意事项,需要的朋友参考一下 今天我们来一起了解一下Java语言中的访问权限控制。在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制。考虑两个场景:   场景1:工程师A编写了一个类ClassA,但是工程师A并不希望ClassA被该应用中其他所用的类都访问到,那么该如何处理?   场景2:如果工程师A编写了一个

  • 我想在用户登录我的系统后控制访问。 例如: 所以在知道用户拥有哪个权限后,在数据库中进行检查,我想限制这个用户可以看到和做什么。有一个简单的方法吗? 编辑

  • 本文向大家介绍java类访问权限与成员访问权限解析,包括了java类访问权限与成员访问权限解析的使用技巧和注意事项,需要的朋友参考一下 在写代码的时候有个问题:包内定义了一个接口类,另外一个包要实现它,这里采用接口隔离与依赖倒置原则,将两个包的依赖关系倒置过来。但是,这里就遇到了一个问题,实现类采用工厂模式来实例化,所以实现类就不想暴露给包外,但是实现类还要实现public接口。所以这里有产生了一

  • 主要内容:开启 ACL 权限Linux 系统传统的权限控制方式,无非是利用 3 种身份(文件所有者,所属群组,其他用户),并分别搭配 3 种权限(读 r,写 w,访问 x)。比如,我们可以通过 ls -l 命令查看当前目录中所有文件的详细信息,其中就包含对各文件的权限设置: [root@localhost ~]# ls -l total 36 drwxr-xr-x. 2 root root 4096 Apr 15 16:33

  • 我在Echo Studio 3上从事一个Java项目。我有一个显示Pdf文件的servlet。我使用一个按钮调用此servlet,该按钮使用以下代码打开一个新窗口: 我只允许单击此按钮的用户访问此servlet,但我不知道如何处理此问题。 任何想法?