好的我正在设置API。一切正常。我通过OAuth2 python lib创建令牌。我使用TastyPie作为我的API。
我面临的问题是,没有"创造" AccessToken或Client模型中的token方法。
我可以通过Django管理员创建一个accessToken,我可以通过卷曲来创建一个:
myhost.com/oauth2/access_token(包含所有信息,密钥,客户端ID,用户和通行证)
我的目标是在用API成功注册用户后,oAuth客户端会自动创建(工作),但我也想生成AccessToken。我不能cURL我自己的服务器,因为它给我一个重定向/连接拒绝错误所以我想在Python中以编程方式进行。无论如何要做到这一点?这是一个片段:
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()
上面的最后两行,同时给出NO错误..不会保存新的AccessToken。有任何想法吗?谢谢StackOverflow !!!!
答案 0 :(得分:6)
我正在使用https://github.com/caffeinehit/django-oauth2-provider。我设法通过使用模型创建访问令牌和刷新令牌。我可能会绕过拨款流程。 我没有在生产中使用此代码,但在开发服务器中,我可以使用以这种方式生成的访问令牌执行API调用。我认为在投入生产之前应该进行充分的测试。
#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)
答案 1 :(得分:1)
这就是我能够使其工作的方式:
from oauth2_provider.views import TokenView
import json
class SuperUserLogin(views.APIView):
permission_classes = (permissions.AllowAny, )
def post(self, request, **kwargs):
url, headers, body, status_code = TokenView().create_token_response(request)
return Response(json.loads(body), status=status_code)
这就是我的request
对象的样子。
{
"username" : email,
"password" : password,
"client_id" : client_id,
"client_secret" : client_secret,
"grant_type" : password
}
这将生成所需的access_token
。我已经验证了数据库中令牌的创建。
答案 2 :(得分:0)
基于我在此处看到的https://github.com/caffeinehit/django-oauth2-provider/blob/master/provider/oauth2/views.py#L93令牌创建是以这种方式完成的
access_token = AccessToken.objects.create(
user=user,
client=client,
scope=scope
)
RefreshToken.objects.create(
user=user,
access_token=access_token,
client=client
)
我认为第二个令牌对您来说并不那么有趣,所以它几乎是您的代码,但使用管理员create()
方法。它唯一的区别是经理用save()
调用force_insert=True
。
所以试试
token.save(force_insert = True)
答案 3 :(得分:0)
我能够使用以下内容在Django 1.6中使用它:
token = AccessToken.objects.create(user=user,
client=Client.objects.get(name=clientName),
scope=3)
答案 4 :(得分:0)
尝试以下,
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"}'
答案 5 :(得分:0)
尝试这个,我刚刚测试过它
>>> 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&password=d3@narmada13"
>>> 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'
>>>