rfc6749 4.3 - 资源所有者与Auth Server直接通信?

时间:2017-03-31 18:46:06

标签: rest authentication oauth-2.0 rfc6749

背景

我正在建立一个与休息api通信的水疗和移动应用程序。我想运行一个单独的auth服务器来管理用户(资源所有者),并认为oAuth2 4.3资源所有者密码凭据授权对我的应用程序有意义。

As described in the specification,用户(资源所有者)应该直接与我的其他api(客户端)通信,然后我的其余api(客户端)应该与auth服务器通信。

     +----------+
     | Resource |
     |  Owner   |
     |          |
     +----------+
          v
          |    Resource Owner
         (A) Password Credentials
          |
          v
     +---------+                                  +---------------+
     |         |>--(B)---- Resource Owner ------->|               |
     |         |         Password Credentials     | Authorization |
     | Client  |                                  |     Server    |
     |         |<--(C)---- Access Token ---------<|               |
     |         |    (w/ Optional Refresh Token)   |               |
     +---------+                                  +---------------+

            Figure 5: Resource Owner Password Credentials Flow

但是,我想改变这种流程。我希望用户(资源所有者)直接与auth服务器通信,接收令牌,然后使用这些令牌与我的其他api(客户端)进行通信:

                                                  +----------+
                                                  | Resource |
                                                  |  Owner   |
                                                  |          |
                                                  +----------+
                                                   v
                                Resource Owner     |          
                             Password Credentials (A)
                                                   |
                                                   v  
                                                  +-----------+
      ------------(G)-------- JSON -------------->| SPA / APP |
      |      -----(D)---- Access Token ----------<|           |
      |      |                                    +-----------+
      |      |                                     v         ^
      |      |                  Resource Owner     |         |
      |      |               Password Credentials (B)       (C) Access token
      |      |                                     |         |
      ^      V                                     v         ^
     +---------+                                  +---------------+
     |         |>--(E)--- Token Introspection --->|               |
     |         |                                  | Authorization |
     |  REST   |                                  |     Server    |
     |  API    |<--(F)----- Token Metadata ------<|               |
     |         |                                  |               |
     +---------+                                  +---------------+

      Figure 5: Resource Owner Password Credentials Flow (modified)

FYI步骤(E)和(F)如RFC 7662中所定义。

问题

我想知道你对这个设计的看法。我知道这是RFC 6749的混蛋,但我认为它更适合我的需求。

  1. RFC 6749中定义的流量是否符合我的需求?
  2. 是否有其他规范,其他RFC 6749,可以更好地满足我的需求?
  3. 我认为我的流程的优点是:

    • 不要求我在spa或移动应用程序中存储密码
    • 允许我的用户直接与auth服务器通信以进行登录/注销等,将问题与我的其他API完全分开
    • 允许我更轻松地添加其他休息api(微服务)而无需处理用户身份验证。

    我认为缺点是:

    • 要求我的身份验证服务器面向公众
    • 需要更多步骤
    • 完全不符合规范

1 个答案:

答案 0 :(得分:1)

OAuth 2.0由两个协议部分组成:如何从授权服务器“获取”访问令牌以及如何对资源服务器所服务的受保护资源“使用”访问令牌。

您从规范中粘贴的图片不包含“使用访问令牌”的一部分,因为它在所有授权中都是通用的;它只关注“获取访问令牌”的一小部分。

您的图表将两者放在一张图片中,但您将混合角色:REST API不是客户端。客户是您的SPA。 API是资源服务器。然后,您的图片代表(完整)标准OAuth 2.0资源所有者密码凭据流+附加令牌内省部分。