2013-03-20 2 views
1

Я хочу, чтобы зарегистрированные пользователи могли добавлять несколько учетных записей Twitter. Я следовал примеру twython-django и получил рабочую версию одного пользователя - одну учетную запись Twitter. Если пользователь снова пытается использовать твиттер-логин, снова следует тот же просмотр, я получаю эту ошибку: Invalid/expired Token.Twython - Как связать несколько учетных записей Twitter с одним пользователем

Я попытался добавить force_login = верно oauth/authorize и oauth/authenticate, удаление 'request_token' из request.session Dict, но я все еще получаю Invalid Token ошибку во время get_authentication_tokens().

Как правильно связать несколько учетных записей Twitter с одним и тем же пользователем с помощью twython? Что мне здесь не хватает?

Вот twython-Джанго пример: 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')) 

Update: возможное решение

Я изменил мой взгляд на это:

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')) 

И еще не уверен, если это имеет к этому какое-то отношение. Я добавил после строки 272 в twython.py request_args['force_login'] = True. Но, как я уже сказал, я не уверен, что это имело какое-либо влияние, потому что в соответствии с https://dev.twitter.com/docs/api/1/post/oauth/request_token принудительный вход не является одним из необязательных аргументов.

Некоторые вуду это было. лол. Скажите, если это полный мусор.

+0

В моем пользователе у меня есть твиттер как поле M2M. Проблема заключается в таком случае пользователя: пользователь только что подписался и хочет добавить все свои учетные записи. Первый работает нормально, и он видит, что его аккаунт был добавлен. Он снова попытался пройти один и тот же процесс: войдите в твиттер с разными учетными данными. В представлении входа в twitter запрос переходит непосредственно к методу get_authorized_tokens и возвращает недопустимую ошибку токена. Проблема заключается не в моей модели, а в том, как я ее сохраняю, но в том, как снова сделать диалог входа в twitter. – Neara

+0

Я пошел ко всей этой боли, чтобы обеспечить беспрепятственную запись нескольким учетным записям. Я сохранил правильный токен + секретные пары, как вы можете видеть в моем коде. С помощью одного токена он работал нормально. Я еще не обновил задачу, которая будет отправлять сообщения в twitter. Я думаю, что создание экземпляра Twython с соответствующими токенами должно сделать трюк, нет? – Neara

+0

ваши коды в порядке, проблема заключается в том, что вы снова используете токен, результатом чего является токен с недействительным/истекшим сроком действия. Поэтому вы должны выйти из системы, чтобы принять другую учетную запись.Я забыл, почему, но он истекает после того, как вы его используете. – catherine

ответ

1

Ммм, я верю, что OP получил работу/право, но как быстрая разбивка, twython-django не создан для поддержки нескольких ассоциаций учетных записей (это также не для Django 1.5, поэтому будьте осторожны с этим, пока не будет обновлено ~) ,

Вам нужно будет сделать то, что сделал OP, и настроить отдельную таблицу для Token s, которые соответствуют пользователю, а затем обрабатывать, какую учетную запись они используют в настоящее время, потянув соответствующие токены. Использование OPs в force_login также, похоже, сработало, потому что, хотя это не обязательно документировано, я считаю, что он по-прежнему работает (согласно , если я не ошибаюсь в этом - если да, то я бы хотел, чтобы меня исправили).

Я не ожидаю, что этот ответ будет принят, поскольку я ничего не решаю, но если кто-нибудь еще встретится с этим, я надеюсь оставить что-то более четкое, чем вышеупомянутые примечания. Надеюсь, все в порядке!

+0

Я делаю что-то подобное, кроме без Django; У меня есть куча маленьких скриптов для определенных целей. Каждый раз, когда я создаю новые учетные записи и/или приложения auth tokens, я просто копирую свои сценарии из каталога dev в новый «живой», обновляя файл authinfo.py (который имеет ключи и секретные данные для импорта) и прочь мы идем. – Ben