2013-07-25 9 views
7

OK Also ich richte eine API ein. Alles funktioniert. Ich erstelle ein Token über OAuth2 python lib. Ich verwende TastyPie für meine API.Wie generiere ich einen AccessToken programmatisch in Django?

Das Problem, das ich mit Blick auf bin .. ist, dass es in dem AccessToken oder Client-Modellen nicht „schaffen“ Token-Methode ist.

Ich kann ein accessToken über die Django Admin erstellen, und ich kann man schaffen, indem eine Locke zu tun:

myhost.com/oauth2/access_token (mit allen Infos, geheimen Schlüssel, Client-ID, Benutzer & Pass)

mein Ziel nach erfolgreicher Registrierung eines Benutzers mit meiner API ist, wird der oAuth Client automatisch erstellt (in Betrieb), aber ich möchte auch die AccessToken erzeugen. Ich kann meinen eigenen Server nicht cURL, weil er mir einen redirect/connection abgewiesenen Fehler gibt, also möchte ich es in Python programmatisch tun. Wie auch immer, das zu tun? Hier ist ein Ausschnitt:

try: 
     user = User.objects.create_user(username, password) 
     user.save() 

     if user: 
      oauth_client = Client(user=user, name="api account", client_type=1, url="http://mysite.com") 
      oauth_client.save() 

      oauth_client_id = oauth_client.pk 
      oauth_client_secret = oauth_client.client_secret 

     if oauth_client: 
      print user 
      print oauth_client_id 
      print AccessToken.objects.all() 
      print '........' 
      token = AccessToken(user=user, client=oauth_client_id, scope=6) 
      token.save() 

die letzten beiden Zeilen oben, während keine Fehler geben .. keine neue AccessToken speichern. Irgendwelche Ideen? Danke StackOverflow !!!!

+0

Welche genaue Bibliothek verwenden Sie? http://hiidef.github.io/oauth2app/ oder https://code.google.com/p/django-oauth2/ oder eine andere? – twil

+0

https://github.com/caffeinehit/django-oauth2-provider <- Dieser. Ich habe es über PIP installiert (django-oauth2-provider == 0.2.6). Ist das das Problem, benutze ich die falsche Bibliothek? – virtuexru

+0

Nicht der falsche. Sie sind alle gleich, aber ein bisschen anders;). – twil

Antwort

0

Nach dem, was ich hier sehe https://github.com/caffeinehit/django-oauth2-provider/blob/master/provider/oauth2/views.py#L93 Token Schöpfung ist so gemacht

access_token = AccessToken.objects.create(
    user=user, 
    client=client, 
    scope=scope 
) 
RefreshToken.objects.create(
    user=user, 
    access_token=access_token, 
    client=client 
) 

Ich gehe davon aus zweiten Token für Sie nicht so interessant ist, so dass es fast Code ist aber mit Managern create() Methode. Der einzige Unterschied ist, dass der Manager save() mit force_insert=True aufruft. So

versuchen

token.save(force_insert = True) 
+0

Hey twil ändern, wenn Sie geschieht für die Antwort?.! Also habe ich das schon mal versucht (mit den AccessToken.objects.create(), aber nicht mit .save (force_insert = True). Ich dachte, es würde den Trick machen, aber es fügt das Token immer noch nicht ein. Alles andere funktioniert gut. Ich bekomme keine Fehler mit Ihrem Code, aber keine DB einfügen. Die Sache, die mich dazu bringt, mir die Haare zu ziehen, ist, dass ich ein Token über das Admin-Panel in Django erstellen kann !!! :( – virtuexru

+0

Ich denke, das Problem könnte sein, dass ich brauche ein 'Grant' zuerst ein Access_Token zu bekommen, aber ich bin mir nicht sicher. Ich werde noch mehr lesen: | – virtuexru

+0

Das ist sehr seltsam, weil es keine zusätzlichen Prüfungen vor dem Speichern gibt. 'Gewähren 'Objekt hier https://github.com/caffeinehit/django-oauth2-provider/blob/master/provider/views.py#L459 wird nur verwendet, um Benutzer und Bereich zu bekommen. Kann es sein, dass Sie Datenbank-Router verwenden? – twil

0

ich in der Lage war, diese in Django arbeiten 1.6 mit dem folgenden:

token = AccessToken.objects.create(user=user, 
            client=Client.objects.get(name=clientName), 
            scope=3) 
7

ich https://github.com/caffeinehit/django-oauth2-provider bin mit. Ich habe es geschafft, ein Zugriffstoken zu erstellen und das Token mithilfe von Modellen zu aktualisieren. Ich könnte den Zuschussfluss umgehen. Ich habe diesen Code nicht in der Produktion verwendet, aber im Entwicklungsserver kann ich API-Aufrufe mit dem auf diese Weise generierten Zugriffstoken durchführen. Ich denke, es sollte gut getestet werden, bevor es in die Produktion geht.

#settings.py 
OAUTH2_PROVIDER = { 
# this is the list of available scopes 
'SCOPES': {'read': 'Read scope'}, 
'ACCESS_TOKEN_EXPIRE_SECONDS': 36000, 
} 

#views.py 
expire_seconds = oauth2_settings.user_settings['ACCESS_TOKEN_EXPIRE_SECONDS'] 
scopes = oauth2_settings.user_settings['SCOPES'] 

application = Application.objects.get(name="ApplicationName") 
expires = datetime.now() + timedelta(seconds=expire_seconds) 
access_token = AccessToken.objects.create(
       user=user, 
       application=application, 
       token=random_token_generator(request), 
       expires=expires, 
       scope=scopes) 

refresh_token = RefreshToken.objects.create(
       user=user, 
       token=random_token_generator(request), 
       access_token=access_token, 
       application=application) 

token = { 
       'access_token': access_token.token, 
       'token_type': 'Bearer', 
       'expires_in': expire_seconds, 
       'refresh_token': refresh_token.token, 
       'scope': scopes} 

return Response(token, status=200) 
+0

diese funktioniert grundsätzlich auch mit oauth-toolkit. – owenfi

+0

Hallo, Gibt es eine Möglichkeit, ein nicht abgelaufenes Zugriffstoken zu senden, wenn Benutzer häufig Token anfordern? Ab sofort erstellt es mehrere Token, anstatt dieselbe zurückzusenden !!!!! Brauchen Sie Lösung – Tommy

+0

Es gibt einen Parameter für Single-Access-Token (https://django-oauth2-provider.readthedocs.org/en/latest/api.html#provider.constants.SINGLE_ACCESS_TOKEN), aber ich denke, es funktioniert nicht mit diesem Handbuch Methode. Sie können überprüfen, ob der Benutzer ein gültiges Zugriffs-Token hat oder nicht, und das entsprechende Token zurückgeben. – Ugur

0

unter Versuchen,

In [1]: import base64 

In [2]: from django.conf import settings 

In [3]: from django.http import HttpRequest 

In [4]: from oauth2_provider.views import TokenView 


In [5]: request = HttpRequest() 

In [6]: key = base64.b64encode('{}:{}'.format(<CLIENT_ID>, <SECRET_KEY>)) 

In [7]: request.META = {'HTTP_AUTHORIZATION': 'Basic {}'.format(key)} 

In [8]: request.POST = {'grant_type': 'password', 'username': '<USERNAME>', 'password': '<PASSWORD>'} 

In [9]: tv = TokenView() 

In [10]: url, headers, body, status = tv.create_token_response(request) 

In [11]: body 
Out [11]: '{"access_token": "IsttAWdao3JF6o3Fk9ktf2gRrUhuOZ", "token_type": "Bearer", "expires_in": 36000, "refresh_token": "y2KQyyliOuRIXf3q9PWzEUeBnx43nm", "scope": "read write"}' 
0

versuchen diese, ich habe es Momente gerade getestet früher

>>> from oauth2_provider.models import Application 
>>> app = Application.objects.create(name="Sample ORM", client_type="public", authorization_grant_type="password", user_id=1) 
<Application: Sample ORM> 
>>> import requests 
>>> from requests.auth import HTTPBasicAuth 
>>> 
>>> 
>>> data = "grant_type=password&username=admin&[email protected]" 
>>> headers = {"content-type": "application/x-www-form-urlencoded"} 
>>> r = requests.post(token_url, data=data, auth=(app.client_id, app.client_secret), headers=headers) 
>>> print r.content 
{"access_token": "5kEaw4O7SX6jO9nT0NdzLBpnq0CweE", "token_type": "Bearer", "expires_in": 7776000, "refresh_token": "ZQjxcuTSTmTaLSyfGNGqNvF3M6KzwZ", "scope": "read write"} 
>>> import json 
>>> json.loads(r.content)['access_token'] 
u'5kEaw4O7SX6jO9nT0NdzLBpnq0CweE' 
>>> 
Verwandte Themen