Twython - 如何将多个Twitter账户关联到一个用户

1 投票
1 回答
948 浏览
提问于 2025-04-17 19:44

我想让注册用户能够添加多个推特账号。我参考了twython-django的例子,成功实现了一个用户对应一个推特账号的功能。但是,当用户再次尝试用推特登录,重复访问同一个视图时,我遇到了这个错误:无效/过期的令牌

我尝试在oauth/authorizeoauth/authenticate中添加force_login=true,并从request.session字典中删除'request_token',但在get_authentication_tokens()时仍然出现无效令牌的错误。

我该如何正确地将多个推特账号与同一个用户关联起来,使用twython时需要注意什么?我漏掉了什么吗?

这是一个twython-django的例子:https://github.com/ryanmcgrath/twython-django/blob/master/twython_django_oauth/views.py

我的视图代码:

def twitter_login(request):
    redirect_back_to_url = request.build_absolute_uri()

    if 'request_token' not in request.session:
        # request authorization tokens
        t = Twython(twitter_token=settings.TWITTER_CONSUMER_KEY,
                    twitter_secret=settings.TWITTER_CONSUMER_SECRET,
                    callback_url=redirect_back_to_url)

        # Request an authorization url to send the user to...
        request_oauth_key = t.get_authentication_tokens()

        # signing current session as one with twitter authentication
        request.session['request_token'] = request_oauth_key

        # redirecting the user to twitter authorization url for authentication
        return HttpResponseRedirect(request_oauth_key['auth_url'])
    else:
        # user authenticated, receiving auth token
        t2 = Twython(twitter_token=settings.TWITTER_CONSUMER_KEY,
                     twitter_secret=settings.TWITTER_CONSUMER_SECRET,
                     oauth_token=request.session['request_token'][
                         'oauth_token'],
                     oauth_token_secret=request.session['request_token'][
                         'oauth_token_secret'])

        oauth_key = t2.get_authorized_tokens()

        # save authorized tokens
        # twitter oauth tokens dont expire
        token = Token.objects.get_or_create(account_name=oauth_key['screen_name'],
                                            token=oauth_key['oauth_token'],
                                            secret=oauth_key['oauth_token_secret'])
        user = request.user.get_profile()
        user.twitter.add(token[0].id)
        user.save()

        logger.info('Successfully acquired twitter oauth token.')

        return HttpResponseRedirect(reverse('profile'))

更新: 可能的解决方案

我把我的视图改成了这样:

def twitter_login(request):
    redirect_back_to_url = request.build_absolute_uri()

    if 'request_token' not in request.session:
        # request authorization tokens
        t = Twython(twitter_token=settings.TWITTER_CONSUMER_KEY,
                    twitter_secret=settings.TWITTER_CONSUMER_SECRET,
                    callback_url=redirect_back_to_url)

        # Request an authorization url to send the user to...
        request_oauth_key = t.get_authentication_tokens()

        # signing current session as one with twitter authentication
        request.session['request_token'] = request_oauth_key

        # redirecting the user to twitter authorization url for authentication
        return HttpResponseRedirect(request_oauth_key['auth_url'])
    else:
        # user authenticated, receiving auth token
        t2 = Twython(twitter_token=settings.TWITTER_CONSUMER_KEY,
                     twitter_secret=settings.TWITTER_CONSUMER_SECRET,
                     oauth_token=request.session['request_token'][
                         'oauth_token'],
                     oauth_token_secret=request.session['request_token'][
                         'oauth_token_secret'])

        oauth_key = t2.get_authorized_tokens()
        if 'screen_name' not in oauth_key:
            del request.session['request_token']
            request.session.modified = True
            return HttpResponseRedirect(reverse('twitter_login'))

        # save authorized tokens
        # twitter oauth tokens dont expire
        token = Token.objects.get_or_create(account_name=oauth_key['screen_name'],
                                            token=oauth_key['oauth_token'],
                                            secret=oauth_key['oauth_token_secret'])
        user = request.user.get_profile()
        user.twitter.add(token[0].id)
        user.save()

        logger.info('Successfully acquired twitter oauth token.')

        return HttpResponseRedirect(reverse('profile'))

不过我还不确定这是否有帮助。我在twython.py的272行后面添加了request_args['force_login'] = True。但是,正如我所说的,我不确定这是否有影响,因为根据https://dev.twitter.com/docs/api/1/post/oauth/request_token,强制登录并不是可选参数之一。

这真是让人摸不着头脑。哈哈。告诉我这是不是完全没用的想法。

1 个回答

1

嗯,我觉得提问者已经搞定了,但我简单说一下,twython-django 这个东西并不支持多个账号关联(而且它也不兼容 Django 1.5,所以在更新之前要小心使用哦~)。

你需要像提问者那样,建立一个单独的表格来存储与用户对应的 Token,然后通过提取合适的 tokens 来处理当前使用的是哪个账号。提问者使用的 force_login 似乎也有效,因为虽然没有明确的文档说明,但我相信它还是能用的(根据 这个讨论帖,除非我理解错了 - 如果我错了,希望有人能纠正我)。

我不指望这个回答会被接受,因为我并没有真正解决什么问题,但如果其他人遇到类似情况,我希望能留下比上面的笔记更清晰的内容。希望这样没问题!

撰写回答