如何在API网关中结合用户级和客户端级身份验证?

如何在API网关中结合用户级和客户端级身份验证?,api,authentication,oauth,single-sign-on,apigee,Api,Authentication,Oauth,Single Sign On,Apigee,我们希望实现web(外部用户)SSO和API网关,以支持web应用程序和移动应用程序,以及潜在的第三方应用程序,甚至B2B场景 我的想法是让SSO网关处理对网站和API的用户级访问,使用OAuth或OpenID Connect对最终用户进行身份验证 对于任何API URL来说,位于这之后的是API网关。这是为了使用客户机ID和密码之类的东西来处理客户机/应用程序级身份验证 这个想法是,用户将登录到一个网站或移动应用程序,然后如果/当该应用程序需要调用API时,它将需要发送自己的凭据(客户端凭据

我们希望实现web(外部用户)SSO和API网关,以支持web应用程序和移动应用程序,以及潜在的第三方应用程序,甚至B2B场景

我的想法是让SSO网关处理对网站和API的用户级访问,使用OAuth或OpenID Connect对最终用户进行身份验证

对于任何API URL来说,位于这之后的是API网关。这是为了使用客户机ID和密码之类的东西来处理客户机/应用程序级身份验证

这个想法是,用户将登录到一个网站或移动应用程序,然后如果/当该应用程序需要调用API时,它将需要发送自己的凭据(客户端凭据流)以及证明用户身份的承载令牌(资源所有者密码流)

客户端凭据与安全性关系不大,更多的是对API函数的粗粒度访问,提供了API使用、流量整形、SLA等的可视性,但需要用户身份来强制下游的数据级授权

我所看到的大多数API网关似乎只支持单一级别的身份验证,例如,我们现在看到的是,可以使用OAuth进行身份验证来处理用户或应用程序,但如何同时处理这两个问题并不明显

是否有任何方法可以让SSO网关的用户承载令牌与API网关的客户端承载令牌或凭据很好地配合使用,最好是以一种基于标准的方式?或者我们必须破解它,这样一个在auth头中通过,另一个在有效负载中通过?或者是否有一种方法可以同时满足两个目的的组合方法(例如混合承载令牌)


我有点惊讶,在身份管理(OAuth2、OpenID Connect、UMA等)方面正在进行的所有工作中,没有人在寻找一种方法来同时处理多个级别的身份验证—用户、客户端、设备等。

不幸的是,我没有足够的信誉点来评论上一篇文章,所以我在这里加上我的两分钱。充分披露:我为Apigee工作

说明如何在授权标头以外的位置将访问令牌授予Apigee OAuthV2策略。如果您已将SSO承载令牌存储为Apigee OAuth令牌的属性,那么一旦Apigee令牌被验证,您将自动获取SSO承载令牌作为流变量,并可以根据需要使用它

例如,如果将令牌作为请求上的“令牌”查询参数发送,则可以在OAuthV2策略中编写以下代码

request.queryparam.token


策略将从该查询参数中提取它。

有点奇怪,为什么您认为不能在开箱即用的情况下同时执行这两项操作?对于客户端级别,我将从Apigee的oauth accesstoken URL请求访问令牌,然后将其传递到HTTP授权头中。但是,SSO网关也会对用户(资源所有者)登录执行类似的操作,我相信它也会尝试在授权标头中传递。显然,他们不能同时做到这一点。我可能会与SSO网关争论,将用户承载令牌放在其他地方(有效负载或自定义头),但这一切似乎都很不雅观,我想知道是否有任何方法可以将这两个概念结合到单个用户+客户端身份验证令牌中。最终,如果有一个包含用户证明的统一令牌就好了,客户端和设备标识位于一个整洁的包中。也许有一天……你可以将一个apikey作为查询参数传递(就像Apigee的oauth开箱即用),然后在上面添加auth令牌头。是的,我可以,但缺点当然是失去了为客户端使用oauth的能力——我想我可以不使用它。Apigee似乎只支持在HTTP头中传递的OAuth承载令牌。谢谢Chris,听起来这是最好的方式。不幸的是,我还没有找到任何支持多身份验证/授权方案的方案(例如,组合用户、客户端、设备),因此最好至少揭示多个OAuth令牌如何共存,即使它需要非标准的方式来传递它们。