验证来自Spring RESTful资源服务器的OAuth 2.0访问令牌

2022-09-04 04:37:49

我想保护我的Spring RESTful后端。一种方法(对吗?)是使用OAuth 2.0,如下所示:

http://www.youtube.com/watch?v=8uBcpsIEz2I

在我的体系结构中,资源服务器和授权服务器不是同一个实体。我真的只是提供一些JSON REST服务。无用户界面。如果我阅读OAuth2 RFC,他们只会说:

授权服务器和资源服务器之间的交互超出了本规范的范围。授权服务器可以是与资源服务器相同的服务器,也可以是单独的实体。单个授权服务器可以颁发多个资源服务器接受的访问令牌。

我在 cloudfoundry.com(与上面的youtube视频相关)上找到了一个很好的图表,我用它来说明我的观点:

enter image description here

“令牌”提供商:例如,这可以/应该是谷歌或Facebook。

RESTful后端:这实际上是我的代码。春季RESTful服务,如:

@Controller
@RequestMapping("/api/v1")
public class MyResourceToProtect {

    @Autowired
    private MyService service;

    @RequestMapping(value = "/resource/delete/{name}",
                    method = RequestMethod.DELETE,
                    consumes = MediaType.APPLICATION_JSON_VALUE,
                    headers = "Content-Type=application/json")
    @ResponseStatus(HttpStatus.OK)
    public void delete(@PathVariable("name") String name) {
        service.delete(name);
    }
}

(这只是一些示例代码)

现在我的问题是:是否有可能以某种方式验证由AuthServer(Facebook,Google)生成的访问令牌?我知道我需要在我的资源服务器上的某个地方有一个“令牌到用户”映射(数据库)。基本上,我想将我的RESTful API设计为PayPal:

https://developer.paypal.com/webapps/developer/docs/integration/direct/make-your-first-call/

但是,如果我想使用Facebook或Google作为身份验证提供商,我如何处理步骤1和2?这有可能吗?

其他想法:可能我需要提供自己的终结点,然后委托给底层的 AuthProvider。/oauth2/token


答案 1

不知道如何用一个漂亮的弓回答所有问题,所以我只把以下几点放在那里:

  • 您是否试图以OAuth安全的方式使用像Facebook这样的OAuth安全API?使用春季社交。
  • 如果您尝试创建自己的 REST API 并使用自己的用户上下文,请使用 Spring Security OAuth。在这种情况下,您将要求客户端使用OAuth针对您的API进行身份验证,而不是Facebook或LinkedIn等。
  • Spring Social Security(在1.2.x系列中)支持通过OAuth连接(例如,“使用Facebook登录”,“..”)对用户进行“登录”。推特,'..LinkedIn“等,并且您的应用程序最终在会话中以Spring Security主体结束,就像您使用HTTP表单手动登录用户一样。
  • Spring Security OAuth并不关心你从哪里得到Spring Security principal。它只是关心主体是否具有Spring Security OAuth客户端所需的正确角色/作用域。因此,您没有理由不能使用Spring Social安全地连接到Facebook,使用Spring Social Security让该连接创建Spring Security Authentication对象,然后使用Spring Security OAuth来保护对您的API的任何访问,这反过来又可以在幕后安全地连接到Facebook的API。客户端会将 OAuth 访问令牌用于您的 API,而不是 Facebook。这在服务中处理。

答案 2