Django OAuth- 分离资源服务器和授权服务器

10
我将使用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)

在内省令牌时,认证服务器在控制台日志中返回403禁止错误。

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

我从客户端POST请求到资源服务器上获取client_id,client_secret,grant_type和scopes。我从资源服务器调用认证服务器,并将响应返回给客户端。

我在这里到底缺少什么?


目前,我正在本地开发,也就是在我的计算机上。 - Praful Bagai
您可以使用管理员登录创建 AUTH TOKEN。 - Saji Xavier
这个 Auth Token 应该与特定的应用程序关联吗?这意味着我应该为我的资源服务器创建一个新的应用程序,然后创建一个与新创建的应用程序关联的新 auth_token 吗? - Praful Bagai
@SajiXavier - 它按预期工作。最终令牌可以被内省。非常感谢。 - Praful Bagai
Oauth的DB表应该存在于您的资源服务器中,只有在AUTH服务器中创建记录...因为您在设置中有INTROSPECTION详细信息。 - Saji Xavier
显示剩余11条评论
1个回答

12

根据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添加新的作用域时,我都需要重新加载应用程序!!! - Praful Bagai
@Saji,你有什么想法吗? - Praful Bagai
你能给我一个使用场景吗?设置中定义的范围是针对特定情况的 - 如果客户在请求授权时省略了范围参数,则授权服务器必须使用预定义的默认值处理该请求。这是强制性的标准。您多久更改一次默认值? - Saji Xavier
@PythonEnthusiast 我也在做类似的事情。我有一个认证服务器和一个独立的资源服务器。假设客户端要访问我的资源服务器。我该如何为客户端创建令牌? 我所做的是在认证服务器上为该用户创建用户和应用程序,因此我从认证服务器获取客户端ID和客户端密钥。 然后,我调用认证服务器的http://localhost:8001/o/token/ URL,以获取访问令牌。然后,我将访问令牌提供给客户端。 那么,我的资源服务器如何验证客户端是否具有正确的令牌呢?请帮助我理解这个问题。 - Syed Ammar Mustafa
当您拥有不同的资源服务器和认证服务器时,认证令牌会在第一次内省后由资源服务器缓存在其数据库中。因此,当向资源服务器发出请求以检查认证令牌的有效性时,它将由资源服务器本身进行检查。 - Praful Bagai
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接