code: def protected_resource_view(scopes=None):
      
      if scopes is None:
          scopes = []
  
      def wrapper(view):
          def view_wrapper(request,  *args, **kwargs):
              access_token = extract_access_token(request)
  
              try:
                  try:
                      kwargs['token'] = Token.objects.get(access_token=access_token)
                  except Token.DoesNotExist:
                      logger.debug('[UserInfo] Token does not exist: %s', access_token)
                      raise BearerTokenError('invalid_token')
  
                  if kwargs['token'].has_expired():
                      logger.debug('[UserInfo] Token has expired: %s', access_token)
                      raise BearerTokenError('invalid_token')
  
                  if not set(scopes).issubset(set(kwargs['token'].scope)):
                      logger.debug('[UserInfo] Missing openid scope.')
                      raise BearerTokenError('insufficient_scope')
              except BearerTokenError as error:
                  response = HttpResponse(status=error.status)
                  response['WWW-Authenticate'] = 'error="{0}", error_description="{1}"'.format(
                      error.code, error.description)
                  return response
  
              return view(request,  *args, **kwargs)
  
          return view_wrapper
  
      return wrapper
docs: View decorator. The client accesses protected resources by presenting the
      access token to the resource server.
      https://tools.ietf.org/html/rfc6749#section-7