oauth-2.0 - 具有复杂或细粒度范围的 OAuth 2.0

标签 oauth-2.0 authorization

我目前正在为所有客户端(Web 和移动端)开发 OAuth2 实现。到目前为止,没有什么特别的,但我们希望范围更复杂,以便我们可以授予对某些对象的部分访问权限,直至单个属性的粒度。
示例 :客户端获得对资源的访问权限,假设是一个具有所有公共(public)属性的用户对象。客户端具有完全读取权限,但只允许编辑某些属性,例如密码和用户名,但不是位置和/或生日。
到目前为止,我的想法是,这个粒度是在授权服务器上定义的,只是由资源服务器解释的。
根据 RFC,范围是基于字符串的逗号分隔值,因此是一个普通列表 (https://www.rfc-editor.org/rfc/rfc6749#page-23)

The value of the scope parameter is expressed as a list of space-
delimited, case-sensitive strings. The strings are defined by the
authorization server. If the value contains multiple space-delimited strings, their order does not matter, and each string adds an
additional access range to the requested scope.

 scope       = scope-token *( SP scope-token )
 scope-token = 1*( %x21 / %x23-5B / %x5D-7E )

所以我的第一个假设提供 json 作为范围可能不起作用,所以我考虑引入可能会变得复杂的命名空间,例如(范围:属性的用户写入完整读取列表或类似内容)。
是否有任何最佳实践,我是否遗漏了 RFC 中的某些内容,或者我是否完全滥用了 OAuth?

最佳答案

您可能需要考虑 UMA 协议(protocol)。 UMA RPT token 由客户端提供给资源服务器。 RPT token 由具有特定范围的授权服务器 (AS) 颁发。在 AS 上,范围映射到策略,例如谁可以使用哪个客户端、网络、所需加密、一天中的时间等访问什么 API。这些策略可以用代码或更结构化的策略语法(如 XACML)表示,例如大卫在上面提出了建议。

如果您想了解有关 UMA 的更多信息,我将从这张图开始:
UMA Overview

在这种情况下,有两个 OAuth2 客户端:资源服务器(具有 API 的事物)和请求方(移动应用程序或网站)。
PAT 和 AAT 通常是 OpenID Connect 客户端 token 。 UMA 核心规范说“OAuth2”,但用于加密客户端注册的唯一 OAuth2 配置文件是 OpenID Connect,因此它是隐式的。

资源所有者是制定策略的人。这些策略可以是算法,也可能需要资源所有者采取行动。有关 OpenID Connect 的更多信息,请参阅

OpenID Connect Website

有关 UMA 的更多信息,请参阅:

UMA Website

如果您正在寻找免费的开源 OAuth2 授权服务器,您应该查看 Gluu 服务器,它是一个 OpenID 连接提供程序和一个用于 FOSS Access Management 的 UMA 授权服务器

关于oauth-2.0 - 具有复杂或细粒度范围的 OAuth 2.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29232450/

相关文章:

django - 如何使用 OAuth2 创建用户?

azure - 用于查询 azure SQL 数据的移动服务 API 或 .net Web API

android - SHA1 指纹已被另一个 OAuth2 客户端使用

rest - 为单页 JS 应用程序保护 REST API?

ruby-on-rails - 如何使用cancan对一系列资源进行授权?

asp.net-mvc - 将 SignalR 与现有授权集成

heroku - 未使用 AFNetworking 发送授权 header

spring - 如何在 Spring MVC 中为错误响应启用 CORS?

asp.net - 向 localhost 发出许多 Web 请求时,HttpClient 卡在 GetAsync 上

java - 监听所有请求 Tomcat