auth.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. from coreapi.utils import domain_matches
  2. from requests.auth import AuthBase, HTTPBasicAuth
  3. class BasicAuthentication(HTTPBasicAuth):
  4. allow_cookies = False
  5. def __init__(self, username, password, domain=None):
  6. self.domain = domain
  7. super(BasicAuthentication, self).__init__(username, password)
  8. def __call__(self, request):
  9. if not domain_matches(request, self.domain):
  10. return request
  11. return super(BasicAuthentication, self).__call__(request)
  12. class TokenAuthentication(AuthBase):
  13. allow_cookies = False
  14. scheme = 'Bearer'
  15. def __init__(self, token, scheme=None, domain=None):
  16. """
  17. * Use an unauthenticated client, and make a request to obtain a token.
  18. * Create an authenticated client using eg. `TokenAuthentication(token="<token>")`
  19. """
  20. self.token = token
  21. self.domain = domain
  22. if scheme is not None:
  23. self.scheme = scheme
  24. def __call__(self, request):
  25. if not domain_matches(request, self.domain):
  26. return request
  27. request.headers['Authorization'] = '%s %s' % (self.scheme, self.token)
  28. return request
  29. class SessionAuthentication(AuthBase):
  30. """
  31. Enables session based login.
  32. * Make an initial request to obtain a CSRF token.
  33. * Make a login request.
  34. """
  35. allow_cookies = True
  36. safe_methods = ('GET', 'HEAD', 'OPTIONS', 'TRACE')
  37. def __init__(self, csrf_cookie_name=None, csrf_header_name=None, domain=None):
  38. self.csrf_cookie_name = csrf_cookie_name
  39. self.csrf_header_name = csrf_header_name
  40. self.csrf_token = None
  41. self.domain = domain
  42. def store_csrf_token(self, response, **kwargs):
  43. if self.csrf_cookie_name in response.cookies:
  44. self.csrf_token = response.cookies[self.csrf_cookie_name]
  45. def __call__(self, request):
  46. if not domain_matches(request, self.domain):
  47. return request
  48. if self.csrf_token and self.csrf_header_name is not None and (request.method not in self.safe_methods):
  49. request.headers[self.csrf_header_name] = self.csrf_token
  50. if self.csrf_cookie_name is not None:
  51. request.register_hook('response', self.store_csrf_token)
  52. return request