2016-05-18 7 views
-2

djangoユーザーが認証のためにapi urlsのキーを使用できるようにします。 私はOAUTHをまだセットアップしていないので、キーがセシオンキーまたはダイジェストキーである可能性があります。 私には2つの問題があります。 私はこの要求を送信しようとしました:すべてのdjango1.8 api - 鍵で認証する方法

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

まず、私はcsrf_tokenを使用してみましたが、それは動作しません。 ログインページに移動します。 第2に、他のユーザーのcsrf_tokenを取得する方法がわかりません(管理者はcsrf_tokensを取得しようとしています)。

私の試み:

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

は私に、ユーザの認証ハッシュを与えるが、それは別の値です。

誰かが私にこの2つの問題を整理させてくれますか?

+0

何ですか?なぜ他のユーザーのCSRFトークンが必要だと思うのですか、あるいはCSRFトークンが特定のユーザーに割り当てられていると思うのですか? –

答えて

0

Djangoは、そのままの状態でAPIキーを提供しません。 TastypieなどのAPIプロバイダを使用してこの機能を使用する

+0

ありがとう、私はこれを調べます。 – max

1

トークンベースの認証を作成しています。すでにOAUTHを1つのオプションとして言及していますが、django-oauth-toolkitのような既存の実装の1つを使用することを強くお勧めします。ただし、独自のクイックソリューションを作成してトークンベースの認証を作成することもできます。

免責事項:これはデモ用です。既存のプロジェクトではコピーしないでください。あなたのアプリケーションを脆弱にするでしょう。

/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 

まず、我々は、認証トークンを処理する追加のモデルを作成します

ミドルウェアをに組み込むは、ユーザーにログインするためにURLに?token=<token>を追加できるようにする必要があります。

0

私は、認証トークンを使用して終了: http://www.django-rest-framework.org/api-guide/authentication/

ので、私はワークフローを共有したいと思います。

まず、セットアップが必要です。 settings.pyでINSTALLED_APPSを修正し、ドキュメントのようにREST_FRAMEWORKを追加してください。 次に、テーブルを追加する必要があるため、python manage.py syncdbを実行する必要があります。 次に、apiをルーティングするためにurls.pyにいくつかのURLを追加する必要があります。あなたはこのコードを使用して、トークンを作成し、取得することができ :

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 

注私は、高度なカスタムのシリアル化を持っているので、私の場合、私は、プレーンのシリアル化を定義する必要はありませんことをそれはここでの話題ではありません。

関連する問題