如果 OAuth 2.0 授权服务器和资源服务器位于单独的应用程序中,它们如何共享令牌?

Hou*_*iki 2 spring-security oauth-2.0 spring-security-oauth2

我想知道授权服务器如何与资源服务器共享令牌(访问令牌),如果它们位于单独的应用程序中?

我正在使用 Spring OAuth 2.0/授权代码授予类型。

Fil*_*are 6

我恰好有一个很棒的视频可以向您解释一切。花一个小时在上面。这是值得你花时间的。我保证。

一些定义

  1. Client- 需要访问服务器上的API的应用程序
  2. Resource Server- 托管受保护 API 的应用程序
  3. Authorization Server- 发行令牌的应用程序,用于断言客户端的身份

场景很简单

假设有一个名为 的应用程序Photo Storage。这个应用程序所做的就是让我们上传照片、下载照片、更新照片和删除照片。

照片存储是一个资源服务器

调用移动应用程序Photo Editor,它知道如何编辑照片。照片编辑器是客户

现在,照片编辑器希望您能够登录,以便它可以访问照片存储应用程序上的照片。但照片存储不知道照片编辑器(也不需要)。但是照片存储需要有人为照片编辑器提供担保,为此,我们有一个授权服务器

看起来像这样


    Photo Editor                 Photo Storage           Authorization Server

    Get Token  ------------authorization_code (https)----------->

    Download Photo ----token(https)---->

    Edit Photo (local)

    Upload Photo -----token(https)----->

Run Code Online (Sandbox Code Playgroud)

这是这样做的好处:

  1. 客户端,照片编辑器,了解照片存储和授权服务器
  2. 资源服务器,照片存储,知道授权服务器,但知道照片编辑器
  3. 授权服务器知道照片编辑器(client_id,client_secret),但它对照片存储一无所知(但它可以,如果照片存储也是客户端)

客户端(照片编辑器)通过 HTTP 请求从授权服务器下载令牌。令牌本身是一个字符串。可以编码为 JSON(JSON Web Token,JWT),也可以是唯一的任意字符串。

当客户端需要访问资源服务器时,它将调用资源服务器上的 HTTP API 并将令牌作为请求的一部分发送到 HTTP 标头中)

    GET /photo/download/1 HTTP/1.1
    Authorization: Bearer dsadsadsadasdasdasda.....
Run Code Online (Sandbox Code Playgroud)

资源服务器将在内部或联系授权服务器验证令牌,并根据结果允许或拒绝来自客户端的调用。

我希望这有帮助。正如我所说,视频将通过示例更详细地解释这一点。

TL;DR 对您问题的回答是,令牌只是一个字符串,它作为 HTTP 请求的一部分发送。这些应用程序都可以位于不同的服务器上(客户端 -> 智能手机、资源服务器 -> Amazon AWS 服务器、授权服务器 -> Google 云服务器)