2016-05-18 72 views
-2

我想允許django用戶使用api網址中的密鑰進行身份驗證。 我還沒有設置OAuth,所以我猜測密鑰可能是一個sesion密鑰或摘要密鑰。 我有2個問題。 我試着發出這個請求:django1.8 api - 如何使用密鑰進行身份驗證

所有的
http://192.166.166.11:8000/api?task=search&term=115&csrf_token=s69WAIZqlCTur1XZQr72QhCc7fzqaRtM 

首先,我使用csrf_token嘗試,但它不工作。 它把我帶到登錄頁面。 其次,我不知道如何檢索其他用戶的csrf_token(管理員試圖獲取他們的csrf_tokens)。

我嘗試:

x = User.objects.get(username='someone') 
x.get_session_auth_hash() 

給我的用戶的身份驗證哈希但它是一個不同的值。

有人能指導我解決這兩個問題嗎?

+0

什麼?您爲什麼認爲您需要其他用戶的CSRF令牌,或者甚至認爲CSRF令牌已分配給特定用戶? –

回答

0

Django不提供開箱即用的API密鑰。 使用API​​提供程序(如Tastypie)具有此功能

+0

謝謝,我會研究這個。 – max

1

您正在創建基於令牌的身份驗證。您已經提到了OAUTH作爲一種選擇,我強烈建議使用django-oauth-toolkit之類的現有實現。但是,您也可以創建自己的快速解決方案來創建基於令牌的身份驗證。

聲明:這僅用於演示目的。不要將它複製到任何現有的項目中。它會使您的應用程序易受攻擊。

首先,我們創建一個額外的模型處理身份驗證令牌:

/auth_tokens/models.py

from django.db import models 
from django.conf import settings 

import string, random 

def random_string(length = 64, chars=string.ascii_uppercase + string.ascii_lowercase + string.digits): 
    return ''.join(random.choice(chars) for x in range(length)) 

class AuthToken(models.Model): 
    user = models.ForeignKey(settings.AUTH_USER_MODEL) 
    token = models.CharField(max_length=64, default=random_string) 

/auth_tokens/middleware.py

from auth_tokens.models import AuthToken 

class AuthTokenMiddleware: 
    def process_request(self, request): 
     token = request.GET.get('auth', None) 
     if not token: 
      return 
     token = AuthToken.objects.get(token=token) 
     request.user = token.user 
     return request 

將中間件加入您的settings.MIDDLEWARE_CLASSES應該使您能夠將?token=<token>添加到您的URL以登錄您的用戶。

0

我最終使用令牌認證: http://www.django-rest-framework.org/api-guide/authentication/

,所以我想分享的工作流程。

首先,您需要進行設置。在settings.py中,修改INSTALLED_APPS並像文檔一樣添加REST_FRAMEWORK。 然後你需要運行python manage.py syncdb,因爲它需要添加一些表。 然後,您需要添加一些url到urls.py來路由api。 您可以創建並使用此代碼檢索標記:最後

from rest_framework.authtoken.models import Token 
token = Token.objects.create(user=User.objects.get(username='john')) 
print token.key 

,你就必須修改您的看法取決於您是否使用基於函數或基於類的視圖。 這裏是一個基於功能視圖我用:

from rest_framework.authentication import TokenAuthentication 
from rest_framework.permissions import IsAuthenticated 
from rest_framework.response import Response 
from rest_framework.views import APIView 
from rest_framework.decorators import authentication_classes, permission_classes 
from rest_framework.decorators import api_view 

@api_view(['GET', 'POST']) 
@authentication_classes((TokenAuthentication,)) 
@permission_classes((IsAuthenticated,)) 
@login_required 
def mybooks(request): 
    entries = Book.objects.all() 
    return render(request, 'mybooks.html', {'entries': entries}) 

最後,測試一下:

import requests 
token = '243124c52f7583e320d043c4395bd99f63344035' 
headers = {'Authorization' : 'Token {}'.format(token)} 
page = requests.post('http://127.0.0.1:8000/mybooks/', headers=headers) 
print page.content 

注意,在我的情況,我不需要定義普通系列化,因爲我有一個先進的自定義序列化這不是這裏的主題。

相關問題