2014-11-15 4 views
2

Я настроил Tastypie в проекте Django, и API правильно обслуживает ресурсы. Теперь я пытаюсь разрешить мобильным пользователям (приложениям) регистрироваться, регистрироваться и выходить через указанный API.tastypie - Вход с мобильного на Django, как настроить ApiKeyAuthentication

class BaseResource(ModelResource): 

    class Meta: 
     allowed_methods = [ 'get' ] 
     authentication = BasicAuthentication() 
class UserResource(BaseResource): 

    class Meta: 
     queryset  = User.objects.all() 
     resource_name = 'users' 
     ... 


class ProfileResource(BaseResource): 

    class Meta: 
     queryset  = Profile.objects.all() 
     resource_name = 'profiles' 
     ... 

Так это служит моя первая цель. Что касается логина, я не думаю, что BasicAuthentication присваивается для запросов с мобильного. Из того, что я прочитал там, кажется, несколько способов сделать то, что я хочу:

Что беспокоит меня в первом звене (см the answer) является то, что мобильный приложение для отправки JSON, содержащим необработанный пароль:

{ 'username' : 'me', 'password' : 'l33t' } 

Разве это не возможно, что кто-то/вещь захватить этот JSON и, таким образом, ВГ e доступ к паролю? Не было бы лучше использовать ApiKeyAuthentication?

Я все меньше и меньше понимаю, что читаю об этом. Если учетная запись была создана с веб-платформы (django-userena), то я не могу использовать ApiKeyAuthentication, потому что ключ должен быть создан when a new User is saved.

Я могу найти несколько способов сделать то, что хочу, и не могу найти справа один ... Я понимаю, что этот вопрос задан и ответил много раз, но я ищу пути используя это наилучшим образом в отношении моих потребностей.

ответ

0

я в конечном итоге делает следующее:

# ────────────────────────────────────────────────────────────────────────────── 
class BaseResource(ModelResource): 

    # ────────────────────────────────────── 
    def prepend_urls(self): 
     try: 
      additional_urls = self._meta.additional_urls 
     except AttributeError: 
      additional_urls = [] 
     return [url(r'^'+u[0]+'$', self.wrap_view(u[1]), name=u[2]) for u in additional_urls] 

    # ────────────────────────────────────── 
    def update_in_place(self, request, original_bundle, new_data): 
     try: 
      allowed_fields = self._meta.allowed_fields 
     except AttributeError: 
      allowed_fields = None 
     if allowed_fields and set(new_data.keys()) - set(allowed_fields): 
      raise BadRequest('Only alterable field(s): {}'.format(', '.join(allowed_fields))) 
     return super(ProfileResource, self).update_in_place(request, original_bundle, new_data) 

    # ────────────────────────────────────── 
    class Meta: 
     abstract = True 
     allowed_methods = ['get',] 
     authentication = ApiKeyAuthentication() 
     authorization = DjangoAuthorization() 
     max_limit = 1000 
# ────────────────────────────────────────────────────────────────────────────── 
class UserResource(BaseResource): 

    ... 

    # ────────────────────────────────────── 
    def signup(self, request, **kwargs): 
     ... 

    # ────────────────────────────────────── 
    def signin(self, request, **kwargs): 
     self.method_check(request, allowed=['post']) 
     data = self.deserialize(
      request, 
      request.body, 
      format=request.META.get('CONTENT_TYPE', 'application/json') 
     ) 
     username = data.get('username', '') 
     password = data.get('password', '') 
     user = authenticate(username=username, password=password) 
     if user: 
      if user.is_active: 
       # login(request, user) 
       try: 
        key = ApiKey.objects.get(user=user) 
        if not key.key: 
         key.save() 
       except ApiKey.DoesNotExist: 
        key = ApiKey.objects.create(user=user) 
       return self.create_response(request, { 
        'success': True, 
        'data': key.key, 
       }) 
      else: 
       return self.create_response(request, { 
        'success': False, 
        'message': 'User is not active', 
       }, HttpForbidden) 
     else: 
      return self.create_response(request, { 
       'success': False, 
       'message': 'Wrong password', 
       }, HttpUnauthorized) 

    # ────────────────────────────────────── 
    class Meta(BaseResource.Meta): 
     allowed_methods = ['get', 'patch',] 
     queryset  = User.objects.all() 
     resource_name = 'users' 
     excludes  = [ 'first_name', 'last_name', 'password' ] 
     filtering = { 
      ... 
     } 
     additional_urls = [ 
      ('signup/', 'signup', 'api-signup'), 
      ('signin/', 'signin', 'api-signin'), 
     ] 
     allowed_fields = ['email',]