使用Django Scopes来区分用户和客户端

时间:2014-12-22 01:38:21

标签: python django oauth-2.0 django-rest-framework

我正在开发一个REST API,它由角度js应用程序以及其他一些应用程序/客户端使用。我正在使用Django REST Framework,我想使用django-oauth-toolkit OAUTH2进行身份验证处理。

问题: 某些API调用只能由其他应用程序/客户端调用,而不能由用户自行调用(原因:允许外部应用程序为特定用户解锁成就但不允许用户执行此操作)。 我想过使用两个不同的范围:一个用于用户,另一个用于外部应用程序/客户端,并且只允许对这些范围中的任何一个进行特定的API调用。这是实现我意图的正确方法吗?如果是这样,我如何限制用户查询“外部应用程序”范围?

1 个答案:

答案 0 :(得分:0)

我之前在DjangoRestFramework中使用自定义Authentication

class APIKeyAuthentication(BaseAuthentication):

    def authenticate(self, request):
        """
        Check if there is an api key in the request and match it
        to the api keys we have. If it matches or is empty allow entrance.
        """
        api_key = request.META.get('HTTP_X_APIKEY', None)
        if not api_key:
            # if api key not in headers try get params
            api_key = request.GET.get("apikey", request.GET.get("api_key", None))

        if not api_key:
            # no api key in request
            raise PermissionDenied(
                detail="No API key send. Use the header \"X-APIKey\" "
                       "or the GET parameter \"apikey\""
            )


        auth_user = get_user_from_django_oauth_toolkit()

        if api_key == settings.APIKEYS["internal"]:
            request.is_internal = True

        return auth_user, None

您需要更新settings.py以告知DRF使用此身份验证

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'app.authentication.APIKeyAuthentication',
    )
}