12

我正在设置一个 API。一切正常。我正在通过 OAuth2 python lib 创建一个令牌。我正在为我的 API 使用 TastyPie。

我面临的问题..是 AccessToken 或 Client 模型中没有“创建”令牌方法。

我可以通过 Django 管理员创建一个 accessToken,我可以通过 curl 来创建一个:

myhost.com/oauth2/access_token(包含所有信息、密钥、客户端 ID、用户和密码)

我的目标是在使用我的 API 成功注册用户后,自动创建(工作)oAuth 客户端,但我还想生成 AccessToken。我不能卷曲我自己的服务器,因为它给了我一个重定向/连接被拒绝的错误,所以我想在 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://example.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()

上面的最后两行,虽然没有给出错误.. 不会保存新的 AccessToken。

4

6 回答 6

9

我正在使用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)
于 2014-08-02T13:09:39.623 回答
2

这就是我能够使它工作的方式:

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. 我已经在我的数据库上验证了令牌创建。

于 2018-10-11T16:57:00.597 回答
1

根据我在这里看到的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)
于 2013-07-25T22:22:25.897 回答
0

我能够使用以下方法使其在 Django 1.6 中工作:

token = AccessToken.objects.create(user=user,
                                   client=Client.objects.get(name=clientName),
                                   scope=3)
于 2014-04-22T12:29:26.440 回答
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'
>>> 
于 2016-09-22T04:40:13.247 回答
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"}'
于 2016-04-04T12:05:18.890 回答