使用 Python 社交身份验证仅获取令牌

Posted

技术标签:

【中文标题】使用 Python 社交身份验证仅获取令牌【英文标题】:Use Python social auth to only get tokens 【发布时间】:2016-08-23 16:22:16 【问题描述】:

我正在使用奇妙的Python social auth 和Django。 但是,此时,每次调用该流程时,都会创建一个新用户。我只需要进程中的令牌(access_tokenrefresh_token)。如何做到这一点?通过某种管道?

这是我目前的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',
)

【问题讨论】:

"...每次调用流程时,都会创建一个新用户..." - 什么流程? @xyres:向 Google+ 或 Facebook 或 Twitter 验证用户的过程。它从模板中的链接开始。 【参考方案1】:

是的,一切都在筹备中。如果您查看已有的内容,您甚至会看到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')

即使没有用户存在/创建,修改后的方法也应该可以工作。

【讨论】:

我去试试这个。 我收到一个错误,指出 uid 未定义 - 我如何获得这个? 啊,抱歉,看起来像 uid is one of the arguments to the function(由 social.pipeline.social_auth.social_uid 步骤创建)。更新帖子。 找不到social 对象(它始终是None) - 另外extra_data 稍后会在管道队列中初始化。怎么了? 给出的代码只有在创建用户时才有效(即只能找到social 对象)。尽管如此,感谢您的努力。

以上是关于使用 Python 社交身份验证仅获取令牌的主要内容,如果未能解决你的问题,请参考以下文章

如何在社交身份验证中存储 facebook 的访问令牌

通过访问令牌进行的 Python Social auth 身份验证失败

如何测试使用 JWT 身份验证的节点 API(使用用户登录获取令牌)

Django中的Python社交身份验证,makemigrations检测到没有变化

在 Python 中从 Quickblox 进行身份验证和获取会话令牌

从 Spotify 请求访问令牌时出现错误“仅支持有效的不记名身份验证”