Oauth 2.0 OAuth客户端凭据流-接收并验证访问令牌后,基于令牌内容进行授权的最佳方式是什么?

Oauth 2.0 OAuth客户端凭据流-接收并验证访问令牌后,基于令牌内容进行授权的最佳方式是什么?,oauth-2.0,openid-connect,okta,Oauth 2.0,Openid Connect,Okta,在上下文中,我使用的是Okta SSO平台 对于机器到机器的身份验证,我使用客户端凭据流。在收到并验证了访问令牌之后,我需要知道应该如何授权请求 似乎我可以选择根据访问控制列表检查客户端ID(在“sub”声明中) 否则,选项看起来更复杂,并且可能不安全,例如验证是否存在添加到访问令牌中的自定义范围 基于我可以从访问令牌获得的数据,授权请求的正确方法是什么?客户端凭据流 只有在您对目标客户是您受保护的资源或服务的100%可信实体有绝对信心时,才能采用。因为您的授权服务器将直接为注册的客户端颁发访问

在上下文中,我使用的是Okta SSO平台

对于机器到机器的身份验证,我使用客户端凭据流。在收到并验证了访问令牌之后,我需要知道应该如何授权请求

似乎我可以选择根据访问控制列表检查客户端ID(在“sub”声明中)

否则,选项看起来更复杂,并且可能不安全,例如验证是否存在添加到访问令牌中的自定义范围

基于我可以从访问令牌获得的数据,授权请求的正确方法是什么?

客户端凭据流 只有在您对目标客户是您受保护的资源或服务的100%可信实体有绝对信心时,才能采用。因为您的授权服务器将直接为注册的客户端颁发
访问令牌
,即使没有提供
授权代码
。这就是
客户端凭证流的美妙之处

正如您所提到的,最好的方法是在为客户端颁发访问令牌之前检查客户端id
Sub
值在真正的客户端凭据流中将为空,因为流中不涉及最终用户。它只是在注册客户端和授权服务器之间

下面是中指定的客户端凭据流。我想你已经知道了所有这些东西,但只是想确定你认为的方法是否正确

+-----------++---------------+
|         |                                  |               |
||>-(A)-客户端身份验证-->|授权|
|客户端| |服务器|
||客户端凭证流
只有在您对目标客户是您受保护的资源或服务的100%可信实体有绝对信心时,才能采用。因为您的授权服务器将直接为注册的客户端颁发
访问令牌
,即使没有提供
授权代码
。这就是
客户端凭证流的美妙之处

正如您所提到的,最好的方法是在为客户端颁发访问令牌之前检查客户端id
Sub
值在真正的客户端凭据流中将为空,因为流中不涉及最终用户。它只是在注册客户端和授权服务器之间

下面是中指定的客户端凭据流。我想你已经知道了所有这些东西,但只是想确定你认为的方法是否正确

+-----------++---------------+
|         |                                  |               |
||>-(A)-客户端身份验证-->|授权|
|客户端| |服务器|

||OAuth客户端id是一个值,例如0ajiower789,它只做一件事,即用技术术语识别调用方。在接收端,您需要将此对象映射到它在业务术语中的含义

下面有几个例子:

  • 0ajiowefr789表示呼叫应用程序,您需要在应用程序的数据中查找该外部应用程序的权限

  • 0ajiowefr789表示呼叫的外部公司,您需要在应用程序的数据中查找该公司的权限

在这两种情况下,我的目标都是将特权表示为声明/主体对象,它可以包含角色、对特定资源的读/写访问权或任何您喜欢的内容

class ApiClaims {
  clientId: string;
  callerName: string;
  callerType: string;
  readOnly: boolean;
  role: string;
}

然后,每个API操作都可以使用上述数据强制访问资源,如果调用方尝试他们无权访问的内容,则返回403禁止。当然,API只允许调用者拥有有限的特权是有意义的,这刚好足以满足他们的需要。

OAuth客户端id是一个值,例如0ajiower789,它只做一件事,即用技术术语识别调用者。在接收端,您需要将此对象映射到它在业务术语中的含义

下面有几个例子:

  • 0ajiowefr789表示呼叫应用程序,您需要在应用程序的数据中查找该外部应用程序的权限

  • 0ajiowefr789表示呼叫的外部公司,您需要在应用程序的数据中查找该公司的权限

在这两种情况下,我的目标都是将特权表示为声明/主体对象,它可以包含角色、对特定资源的读/写访问权或任何您喜欢的内容

class ApiClaims {
  clientId: string;
  callerName: string;
  callerType: string;
  readOnly: boolean;
  role: string;
}
然后,每个API操作都可以使用上述数据强制访问资源,如果调用方尝试他们无权访问的内容,则返回403禁止。当然,API只允许调用者拥有有限的权限是有意义的,这刚好可以满足他们的需要