2016-04-28 2 views
10

Я пользуюсь фантастическим Python social auth с Django.
Однако на данный момент каждый раз, когда процесс вызывается, создается новый пользователь. Мне нужны только токены (access_token и refresh_token). Как это можно достичь? Через какой-то трубопровод?Использовать Python для получения доступа к токенам

Это мой pipeline.py код в данный момент (сокращенном):

def get_token(backend, user, response, *args, **kwargs): 

    # get token from the oauth2 flow 
    social = user.social_auth.get(provider='google-oauth2') 
    access_token = social.extra_data['access_token'] 
    refresh_token = social.extra_data.get('refresh_token') 

И соответствующее settings.py файл:

# set django session 
SESSION_EXPIRE_AT_BROWSER_CLOSE = True 

# psa settings 
SOCIAL_AUTH_URL_NAMESPACE = 'social' 

# see http://psa.matiasaguirre.net/docs/configuration/settings.html 
SOCIAL_AUTH_UUID_LENGTH = 32 

AUTHENTICATION_BACKENDS = (
    #'social.backends.facebook.FacebookOAuth2', 
    'social.backends.google.GoogleOAuth2', 
    #'social.backends.twitter.TwitterOAuth', 
    'django.contrib.auth.backends.ModelBackend', 
) 

SOCIAL_AUTH_PIPELINE = (
    'social.pipeline.social_auth.social_details', 
    'social.pipeline.social_auth.social_uid', 
    'social.pipeline.social_auth.auth_allowed', 
    'social.pipeline.social_auth.social_user', 
    'social.pipeline.user.get_username', 
    'social.pipeline.user.create_user', 
    'social.pipeline.social_auth.associate_user', 
    'social.pipeline.social_auth.load_extra_data', 
    'social.pipeline.user.user_details', 
    'youtube.pipeline.get_token', 
) 
+0

* «... каждый раз, когда вызывается процесс, создается новый пользователь ...» * - какой процесс? – xyres

+0

@xyres: процесс аутентификации пользователя в Google+ или Facebook или Twitter. Он начинается со ссылки в шаблоне. – Jan

ответ

4

Да, это все в стадии разработки. Если вы посмотрите на то, что у вас уже есть, вы даже увидите шаг social.pipeline.user.create_user.

From the documentation:

# Create a user account if we haven't found one yet. 
'social.pipeline.user.create_user', 

(source for that function)

Заменить это (и все следующие шаги, если они не нужны) с тем, что это то, что вы пытаетесь достичь.

def get_token(backend, uid, *args, **kwargs): 
    # get token from the oauth2 flow 
    provider = backend.name 
    social = backend.strategy.storage.user.get_social_auth(provider, uid) 
    access_token = social.extra_data['access_token'] 
    refresh_token = social.extra_data.get('refresh_token') 

Модифицированный способ должен работать, даже если пользователь не существует/не создан.

+0

Я иду и попробую это. – Jan

+0

Я получаю сообщение об ошибке, что 'uid' не определен - как мне его получить? – Jan

+0

Ах, извините, похоже, что '' uid' является одним из аргументов функции [https://github.com/MSOpenTech/python-social-auth/blob/master/social/pipeline/social_auth.py#L18) (создается с помощью шага 'social.pipeline.social_auth.social_uid'). Обновлено сообщение. – Anonymous