使用客户端凭证授权调用DRF接口返回403错误的求助
问题原因及解决方案
你遇到的403问题确实是默认权限配置导致的——rest_framework.permissions.IsAuthenticated这个权限类要求请求必须关联一个已认证的用户对象,但客户端凭证授权(Client Credential Grant)模式下,生成的Token是和你的OAuth2应用绑定的,并没有关联到具体的用户,所以这个权限会直接拒绝请求。
要解决这个问题,你需要替换成OAuth2 Provider提供的专门针对客户端凭证场景的权限类:
1. 修改全局默认权限
把DEFAULT_PERMISSION_CLASSES替换为TokenHasReadWriteScope,它会校验Token对应的应用是否拥有read和write的scope权限:
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'oauth2_provider.contrib.rest_framework.OAuth2Authentication', ), 'DEFAULT_PERMISSION_CLASSES': ( 'oauth2_provider.contrib.rest_framework.TokenHasReadWriteScope', ), }
2. 细粒度权限控制(可选)
如果你的接口只需要读权限,或者需要自定义scope,可以使用TokenHasScope类,并在视图中指定所需的scope:
from rest_framework.views import APIView from oauth2_provider.contrib.rest_framework import TokenHasScope class YourAPIView(APIView): permission_classes = [TokenHasScope] required_scopes = ['read'] # 这里可指定需要的scope,比如['write']或自定义scope def get(self, request): # 你的接口逻辑 return Response({"message": "Success"})
额外注意事项
别忘了在Django Admin里创建客户端凭证应用时,给它分配对应的scope(比如read、write),否则即使权限类配置正确,依然会返回403错误。
内容的提问来源于stack exchange,提问作者Hamidreza
相关产品推荐
相关产品推荐

