Django-oauth-toolkit如何为特定OAuth应用单独配置自定义scope作用域
Django-oauth-toolkit 单个OAuth应用专属作用域配置方案
可以实现,主流有两种适配不同场景的实现方式:
方案一:使用框架原生的应用级作用域字段
Django-oauth-toolkit 1.0及以上版本自带Application模型的allowed_scopes字段,配合官方提供的作用域后端即可快速实现需求,步骤如下:
- 第一步:修改项目配置,启用应用级作用域后端
OAUTH2_PROVIDER = { # 全局定义所有可能用到的作用域 'SCOPES': { 'read': 'Read scope', 'write': 'Write scope', 'custom': 'Custom scope.', 'app_specific': '专属应用作用域' }, # 配置作用域后端为应用级后端 'SCOPE_BACKEND': 'oauth2_provider.scopes.ApplicationScopeBackend' }
- 第二步:为指定应用配置允许的作用域
可以直接在Django admin后台的OAuth应用编辑页,填写Allowed scopes字段,值为空格分隔的作用域标识;也可以在代码中创建/修改应用时赋值:
from oauth2_provider.models import Application # 创建专属应用,仅允许使用read和app_specific两个作用域 specific_app = Application.objects.create( name="专属作用域应用", client_type=Application.CLIENT_CONFIDENTIAL, authorization_grant_type=Application.GRANT_AUTHORIZATION_CODE, allowed_scopes="read app_specific" )
该方案无需额外自定义代码,适配绝大多数常规场景。
方案二:自定义作用域后端实现复杂逻辑
如果需要基于应用属性动态分配作用域(比如按应用类型、所属用户分配不同作用域),可以自己实现自定义作用域后端:
- 第一步:编写自定义作用域后端类
# 示例路径:your_project/oauth/scopes.py from oauth2_provider.scopes import BaseScopeBackend class CustomScopeBackend(BaseScopeBackend): def get_all_scopes(self): # 定义所有合法的作用域字典 return { 'read': 'Read scope', 'write': 'Write scope', 'custom': 'Custom scope.', 'app1_scope': '应用1专属作用域', 'app2_scope': '应用2专属作用域' } def get_available_scopes(self, application=None, request=None, *args, **kwargs): # 未指定应用时返回全局作用域 if not application: return list(self.get_all_scopes().keys()) # 应用ID为1的仅返回对应专属作用域 if application.id == 1: return ['read', 'app1_scope'] # 应用ID为2的仅返回对应专属作用域 if application.id == 2: return ['write', 'app2_scope'] # 其他应用返回默认作用域 return ['read', 'write', 'custom']
- 第二步:修改项目配置指向自定义后端
OAUTH2_PROVIDER = { 'SCOPE_BACKEND': 'your_project.oauth.scopes.CustomScopeBackend' }
注意事项
所有自定义作用域必须在全局SCOPES配置或者自定义后端的get_all_scopes方法中声明,否则会被框架判定为无效作用域自动过滤。
内容的提问来源于stack exchange,提问作者Duilio
相关产品推荐
相关产品推荐

