12

APIを設定しています。すべてが機能しています。OAuth2 python lib 経由でトークンを作成しています。API に TastyPie を使用しています。

私が直面している問題は、AccessToken または Client モデルに「作成」トークン メソッドがないことです。

Django 管理者経由で accessToken を作成できます。curl を実行して作成できます。

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://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()

上記の最後の 2 行では、エラーは発生しませんが、新しい 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 に答える
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
)

2番目のトークンはあなたにとってそれほど興味深いものではないと思うので、ほとんどあなたのコードですが、マネージャーのcreate()方法があります。唯一の違いは、manager が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 に答える