Django OAuth - 独立的资源和授权服务器

Posted

技术标签:

【中文标题】Django OAuth - 独立的资源和授权服务器【英文标题】:Django OAuth- Separate Resource and Authorization Server 【发布时间】:2018-05-15 05:03:06 【问题描述】:

我正在使用Django Oauth Library。

我想要不同的身份验证和资源服务器。

在身份验证服务器上,以下是我的设置。

INSTALLED_APPS = [
    ...


    'oauth2_provider',
    'rest_framework',
]


REST_FRAMEWORK = 
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'oauth2_provider.contrib.rest_framework.OAuth2Authentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),


# ############## OAUTH SETTINGS ###################

OAUTH2_PROVIDER = 
    'SCOPES': 'users': 'user details', 'read': 'Read scope', 'write': 'Write scope', 'groups': 'Access to your groups', 'introspection': 'introspection',
    'ACCESS_TOKEN_EXPIRE_SECONDS': 86400,  # 1 Day.

在我的资源服务器上

INSTALLED_APPS = [
    ...


    'oauth2_provider',
    'rest_framework',
]


REST_FRAMEWORK = 
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'oauth2_provider.contrib.rest_framework.OAuth2Authentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),


# ############## OAUTH SETTINGS ###################

OAUTH2_PROVIDER = 
'RESOURCE_SERVER_INTROSPECTION_URL': 'http://localhost:8000/o/introspect/',
'RESOURCE_SERVER_AUTH_TOKEN': '3yUqsWtwKYKHnfivFcJu',

问题 1)

如何获取RESOURCE_SERVER_AUTH_TOKEN

问题 2)

自检令牌后,Auth Server 在控制台日志中返回 403 Forbidden Error。

以下是获取访问令牌的流程。

我从客户端 POST 请求中将client_id, client_secret, grant_type and scopes 发送到资源服务器。我从 Resource Server 调用 AuthServer 并将响应返回给客户端。

我到底错过了什么?

【问题讨论】:

目前,我正在本地开发,即在我的机器上。 RESOURCE_SERVER_AUTH_TOKEN 是什么? RESOURCE SERVER AUTH TOKEN 是自省端点用来验证资源服务器的令牌。但是您是否在内省或初始客户端授权授予时遇到错误?看起来您在 AUTH 服务器上遇到了错误,而不是在 Introspection 上。 好吧,每当我尝试授权自己时,我的资源服务器都会在本地触发查询access_token = AccessToken.objects.select_related("application", "user").get(token=token)。由于resource_server 没有保存任何令牌(所有令牌都保存在身份验证服务器中),因此它返回错误AccessToken matching query does not exist.。在处理上述异常时,又抛出了另一个异常,即 Auth Server 返回的 403 错误。 根据 django-oauth-toolkit 实现,它首先尝试检查其数据库中是否存在访问令牌,因此不存在“访问令牌匹配查询不存在”.. 如果访问令牌不存在,它将尝试根据设置中提供的 URL 和访问令牌使用自省端点验证令牌。所以问题出在自省端点上。您如何创建 RES SERVER AUTH TOKEN ?你能把AUTH SERVER的urlconf放上去吗 【参考方案1】:

根据 django-oauth-toolkit 实现,资源服务器首先尝试检查其数据库中是否有访问令牌。

如果访问令牌不存在,它将检查自省 URL 和自省令牌在设置中是否可用。如果自省设置可用,则资源服务器尝试使用自省端点验证用户令牌。

所以问题似乎是 AUTH SERVER 和 DRF 可能会返回 403 Forbidden,因为权限设置为 IsAuthenticated。这可能是由于令牌无效或用户无效。

所以为资源服务器创建一个用户,然后为资源服务器用户创建一个应用程序。

创建应用程序,

client_type=Application.CLIENT_CONFIDENTIAL
authorization_grant_type=Application.GRANT_AUTHORIZATION_COD‌​E

并通过管理站点生成令牌,并使用新创建的令牌更新资源服务器 INTROSPECTION 设置。确保在创建令牌时放置适当的范围。

【讨论】:

最后一个问题 (:P),如何在不更新 AUTH_SERVER 设置 OAUTH2_PROVIDER['SCOPES'] 的情况下配置范围。我的意思是每次我需要向 auth_server 添加新范围时,我都需要重新加载应用程序!!! 对这个@Saji有什么想法吗? 你能给我一个同样的用例吗?设置中定义的范围适用于特殊情况 - 如果客户端在请求授权时省略范围参数,授权服务器必须使用预定义的默认值处理请求。这是标准规定的。您多久更改一次默认值? . @PythonEnthusiast 我也在做类似的事情。我有一个身份验证服务器和一个单独的资源服务器。假设客户端将访问我的资源服务器。如何为客户端创建令牌?我正在做的是在 Auth 服务器上为该用户创建一个用户和应用程序,因此我从 Auth 服务器获得一个客户端 ID 和客户端密码。现在我调用身份验证服务器的localhost:8001/o/token url,它给了我一个访问令牌。现在我给客户访问令牌。那么我的资源服务器如何验证客户端是否拥有正确的令牌?请帮助我理解这一点 当您拥有不同的资源和身份验证服务器时,身份验证令牌由资源服务器缓存在其数据库中(在第一次自省之后)。因此,当向资源服务器发出请求时,检查 auth 令牌的有效性,由资源服务器自己进行检查。

以上是关于Django OAuth - 独立的资源和授权服务器的主要内容,如果未能解决你的问题,请参考以下文章

Oauth2 Spring Security 资源服务器和独立认证服务器

连接 OAuth2 资源服务器和认证服务器

OAuth 2:分离资源服务器和授权服务器

Spring oAuth2 授权和资源服务器

Spring OAuth2 资源和授权服务器

Spring OAuth授权服务器和资源服务器在不同的服务器上