Web services RESTful web服务的最终用户身份验证

Web services RESTful web服务的最终用户身份验证,web-services,security,rest,authentication,oauth,Web Services,Security,Rest,Authentication,Oauth,我有一个面向内部的RESTful web服务。有多种客户端应用程序使用该服务,客户端应用程序本身也有最终用户。web服务需要根据最终用户身份对请求进行授权 问题:这里验证最终用户的典型选项是什么?也就是说,我想验证用户,而不是客户端应用程序。(我不介意验证客户端应用程序是否是方案的一部分,但最终我需要知道最终用户是我认为的那个人。) 例如,一种可能的方案是每个客户端都有系统帐户,然后让客户端简单地断言用户的身份(例如,在HTTP请求头中)。因此,我们对客户端应用程序进行身份验证,并将用户身份验证

我有一个面向内部的RESTful web服务。有多种客户端应用程序使用该服务,客户端应用程序本身也有最终用户。web服务需要根据最终用户身份对请求进行授权

问题:这里验证最终用户的典型选项是什么?也就是说,我想验证用户,而不是客户端应用程序。(我不介意验证客户端应用程序是否是方案的一部分,但最终我需要知道最终用户是我认为的那个人。)

例如,一种可能的方案是每个客户端都有系统帐户,然后让客户端简单地断言用户的身份(例如,在HTTP请求头中)。因此,我们对客户端应用程序进行身份验证,并将用户身份验证委托给客户端。不过,我认为这不是一个很强的方案,因为它太依赖于对系统帐户凭据保密。我见过太多关于人们通过电子邮件发送系统帐户凭据的例子,对这种方法没有太多信心

另一种方法可能是让客户端应用在用户登录时使用用户的凭据从API获取令牌,然后将该令牌用于后续API请求。这样,身份验证是特定于用户的,而不需要客户端应用程序挂起用户名/密码凭据


无论如何,我想对这里应该考虑的选项范围有一个更好的了解。

您描述的“委托认证”问题是一个真实的问题。这意味着使用其凭证的“客户机应用程序”可以访问整个范围的用户数据。此访问可能被恶意使用(例如,获取api数据的“半可信”应用程序)或疏忽使用(例如,意外暴露直接对象引用漏洞的应用程序-)

可能最流行的“基于令牌”方案是OAuth2(),它的前身是OAuth,许多站点选择继续使用它

OAuth2有许多角色:

  • 资源所有者(您案例中的用户)
  • 资源服务器(您的api)
  • 客户端(您谈论的应用程序)
  • 授权服务器(不清楚在您的案例中谁或什么将履行此角色)
  • 基本方案是,资源所有者直接通过授权服务器使用其凭据进行身份验证。然后询问他们是否希望将某些信息(可能只是持久标识符,或api公开的信息的描述)授予某个客户机。当他们接受“身份验证代码”时,会将其发送到客户端,并使用该代码(连同他们自己的凭据)接收“访问令牌”。然后可以使用该访问令牌对资源服务器进行身份验证(资源服务器可以根据授权服务器检查其真实性)

    通常使用的方式是授权服务器和资源服务器由同一实体拥有和管理(例如,google和facebook将履行此角色),然后独立管理客户端


    该方案也可以在组织内部使用,而无需“明确授权”,该授权至少可以在从api发布任何数据之前确认特定最终用户在场。

    这确实很有帮助。我考虑过OAuth2,但认为它不匹配,因为我在服务端有细粒度的ACL,我看到的所有OAuth2示例都涉及授予粗粒度的权限(例如,授予某个或某个应用程序在墙上发布的权限)。因此,您的神奇搜索词是“范围”。OAuth2有一个可扩展的作用域机制,这意味着您可以添加非常细粒度的控件,但它依赖于您事先与授权服务器达成一致。在这种情况下,“授权”屏幕会询问他们是否愿意根据“母亲鞋码”范围访问例如“你母亲的鞋码”。当客户端重定向用户时,应用程序需要的作用域将传递给授权服务器。我可以让客户端将令牌传递给web服务,然后让web服务将令牌解析给用户,然后应用任何ACL吗?我并不是真的希望最终用户能够授权客户端应用程序访问这样或那样的数据(我认为这是正常的OAuth用例)。相反,客户端作为最终用户对服务进行身份验证(例如,通过传递令牌),因此客户端可以执行服务允许该最终用户执行的任何操作。让我知道OAuth2是否仍然是这里的候选人。如果您事先知道全部用户,那么您可以为某些功能应用标准的“白名单”用户。这实际上是在使用OAuth2进行普通的旧身份验证(您将在您的服务中应用自定义授权)。你给了我一个很好的方向。