Revision e28a4841 snf-astakos-app/astakos/oa2/backends/djangobackend.py
b/snf-astakos-app/astakos/oa2/backends/djangobackend.py | ||
---|---|---|
1 |
import astakos.oa2.models as oa2_models |
|
2 |
|
|
1 | 3 |
from astakos.oa2.backends import base as oa2base |
2 | 4 |
from astakos.oa2.backends import base as errors |
3 |
from astakos.oa2.models import * |
|
4 | 5 |
|
5 |
from django.conf.urls.defaults import patterns, url |
|
6 | 6 |
from django import http |
7 |
from django.conf import settings |
|
8 |
from django.core.exceptions import ValidationError |
|
9 |
from django.core.validators import URLValidator |
|
10 |
from django.core.urlresolvers import reverse |
|
11 |
from django.conf.urls.defaults import patterns, url |
|
12 |
from django.views.decorators.csrf import csrf_exempt |
|
13 |
|
|
14 |
import logging |
|
15 |
logger = logging.getLogger(__name__) |
|
7 | 16 |
|
8 | 17 |
|
9 | 18 |
class DjangoViewsMixin(object): |
10 | 19 |
|
11 | 20 |
def auth_view(self, request): |
12 | 21 |
oa2request = self.build_request(request) |
13 |
response = self.authorize(oa2request, accept=False) |
|
14 |
return self._build_response(response) |
|
22 |
oa2response = self.authorize(oa2request, accept=False)
|
|
23 |
return self._build_response(oa2response)
|
|
15 | 24 |
|
25 |
@csrf_exempt |
|
16 | 26 |
def token_view(self, request): |
17 |
return http.HttpResponse("token view") |
|
27 |
oa2request = self.build_request(request) |
|
28 |
oa2response = self.grant_token(oa2request) |
|
29 |
return self._build_response(oa2response) |
|
18 | 30 |
|
19 | 31 |
|
20 | 32 |
class DjangoBackendORMMixin(object): |
21 | 33 |
|
22 | 34 |
def get_client_by_credentials(self, username, password): |
23 | 35 |
try: |
24 |
return Client.objects.get(identifier=username, secret=password) |
|
25 |
except Client.DoesNotExist: |
|
36 |
return oa2_models.Client.objects.get(identifier=username, |
|
37 |
secret=password) |
|
38 |
except oa2_models.Client.DoesNotExist: |
|
26 | 39 |
raise errors.InvalidClientID("No such client found") |
27 | 40 |
|
28 | 41 |
def get_client_by_id(self, clientid): |
29 | 42 |
try: |
30 |
return Client.objects.get(identifier=clientid) |
|
31 |
except Client.DoesNotExist: |
|
43 |
return oa2_models.Client.objects.get(identifier=clientid)
|
|
44 |
except oa2_models.Client.DoesNotExist:
|
|
32 | 45 |
raise errors.InvalidClientID("No such client found") |
33 | 46 |
|
34 |
def create_authorization_code(self, client, code, redirect_uri, scope, |
|
35 |
state, **kwargs): |
|
36 |
return AuthorizationCode.objects.create(**{ |
|
37 |
'code': code, |
|
38 |
'client_id': client.get_id(), |
|
39 |
'redirect_uri': redirect_uri, |
|
40 |
'scope': scope, |
|
41 |
'state': state |
|
42 |
}) |
|
43 |
|
|
44 |
def create_token(self, value, token_type, client, scope, refresh=False): |
|
45 |
params = self._token_params(value, token_type, client, scope) |
|
46 |
if refresh: |
|
47 |
refresh_token = self.generate_token() |
|
48 |
params['refresh_token'] = refresh_token |
|
49 |
# TODO: refresh token expires ??? |
|
50 |
token = self.token_model.create(value, **params) |
|
47 |
def get_authorization_code(self, code): |
|
48 |
try: |
|
49 |
return oa2_models.AuthorizationCode.objects.get(code=code) |
|
50 |
except oa2_models.AuthorizationCode.DoesNotExist: |
|
51 |
raise errors.OA2Error("No such authorization code") |
|
52 |
|
|
53 |
def get_token(self, token): |
|
54 |
try: |
|
55 |
return oa2_models.Token.objects.get(code=token) |
|
56 |
except oa2_models.Token.DoesNotExist: |
|
57 |
raise errors.OA2Error("No such token") |
|
51 | 58 |
|
52 | 59 |
def delete_authorization_code(self, code): |
53 |
del self.code_model.ENTRIES[code] |
|
60 |
code.delete() |
|
61 |
logger.info('%r deleted' % code) |
|
62 |
|
|
63 |
def delete_token(self, token): |
|
64 |
token.delete() |
|
65 |
logger.info('%r deleted' % token) |
|
66 |
|
|
67 |
def check_credentials(self, client, username, secret): |
|
68 |
if not (username == client.get_id() and secret == client.secret): |
|
69 |
raise errors.InvalidAuthorizationRequest("Invalid credentials") |
|
54 | 70 |
|
55 | 71 |
|
56 | 72 |
class DjangoBackend(DjangoBackendORMMixin, oa2base.SimpleBackend, |
57 | 73 |
DjangoViewsMixin): |
58 | 74 |
|
59 |
code_model = AuthorizationCode |
|
75 |
code_model = oa2_models.AuthorizationCode.objects |
|
76 |
token_model = oa2_models.Token.objects |
|
77 |
client_model = oa2_models.Client.objects |
|
60 | 78 |
|
61 | 79 |
def _build_response(self, oa2response): |
62 | 80 |
response = http.HttpResponse() |
... | ... | |
69 | 87 |
def build_request(self, django_request): |
70 | 88 |
params = { |
71 | 89 |
'method': django_request.method, |
90 |
'path': django_request.path, |
|
72 | 91 |
'GET': django_request.GET, |
73 | 92 |
'POST': django_request.POST, |
74 | 93 |
'META': django_request.META, |
75 |
'secure': django_request.is_secure(), |
|
94 |
'secure': settings.DEBUG or django_request.is_secure(), |
|
95 |
#'secure': django_request.is_secure(), |
|
76 | 96 |
} |
97 |
# TODO: check for valid astakos user |
|
77 | 98 |
if django_request.user.is_authenticated(): |
78 | 99 |
params['user'] = django_request.user |
79 | 100 |
return oa2base.Request(**params) |
80 | 101 |
|
81 | 102 |
def get_url_patterns(self): |
103 |
sep = '/' if self.endpoints_prefix else '' |
|
82 | 104 |
_patterns = patterns( |
83 | 105 |
'', |
84 |
url(r'^%s/auth/?$' % self.endpoints_prefix, self.auth_view, |
|
106 |
url(r'^%s%sauth/?$' % (self.endpoints_prefix, sep), |
|
107 |
self.auth_view, |
|
85 | 108 |
name='%s_authenticate' % self.id), |
86 |
url(r'^%s/token/?$' % self.endpoints_prefix, self.token_view, |
|
109 |
url(r'^%s%stoken/?$' % (self.endpoints_prefix, sep), |
|
110 |
self.token_view, |
|
87 | 111 |
name='%s_token' % self.id), |
88 | 112 |
) |
89 | 113 |
return _patterns |
90 | 114 |
|
115 |
def is_uri(self, string): |
|
116 |
validator = URLValidator() |
|
117 |
try: |
|
118 |
validator(string) |
|
119 |
except ValidationError: |
|
120 |
return False |
|
121 |
else: |
|
122 |
return True |
|
123 |
|
|
124 |
def get_login_uri(self): |
|
125 |
return reverse('login') |
|
126 |
|
|
91 | 127 |
|
92 | 128 |
class AstakosBackend(DjangoBackend): |
93 | 129 |
pass |
Also available in: Unified diff