1

登録ユーザーが複数の Twitter アカウントを追加できるようにしたい。私は twython-django の例に従い、1 人のユーザー (1 つの Twitter アカウント) の作業バージョンを取得しました。ユーザーが Twitter ログインを再度使用しようとすると、同じビューを再度使用すると、次のエラーが発生しますInvalid / expired Token

と に force_login=true を追加して、dict から削除しようとしましoauth/authorizeたが、まだエラーoauth/authenticateが発生します。'request_token'request.sessionInvalid Tokenget_authentication_tokens()

twythonを使用して、複数のTwitterアカウントを同じユーザーに適切に関連付ける方法は? ここで何が欠けていますか?

以下は 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。しかし、私が言ったように、それが何らかの影響を与えたかどうかはわかりません。 .

これはいくつかのブードゥー教でした。笑。それが完全なゴミかどうか教えてください。

4

1 に答える 1

1

うーん、OP は正常に機能していると思いますが、簡単な内訳として、twython-django複数のアカウントの関連付けをサポートするように構築されていません (Django 1.5 にも対応していないため、更新されるまで注意してください~)。

OPが行ったことを実行し、 User に一致する s の別のテーブルを設定してTokenから、適切なトークンを取得して現在使用しているアカウントを処理する必要があります。OPの使用force_loginもうまくいったようです。なぜなら、必ずしも文書化されているわけではありませんが、それでもうまくいくと私は信じているからです(このスレッドによると、私が読み間違えていない限り、そうであれば修正したいと思います)。

私は実際には何も解決していないので、この回答が受け入れられるとは思っていませんが、他の誰かがこれに遭遇した場合は、上記のメモよりも明確なものを残したいと思っています. それが大丈夫であることを願っています!

于 2013-05-05T04:50:37.577 に答える