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