Я хочу, чтобы зарегистрированные пользователи могли добавлять несколько учетных записей 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 принудительный вход не является одним из необязательных аргументов.
Некоторые вуду это было. лол. Скажите, если это полный мусор.
В моем пользователе у меня есть твиттер как поле M2M. Проблема заключается в таком случае пользователя: пользователь только что подписался и хочет добавить все свои учетные записи. Первый работает нормально, и он видит, что его аккаунт был добавлен. Он снова попытался пройти один и тот же процесс: войдите в твиттер с разными учетными данными. В представлении входа в twitter запрос переходит непосредственно к методу get_authorized_tokens и возвращает недопустимую ошибку токена. Проблема заключается не в моей модели, а в том, как я ее сохраняю, но в том, как снова сделать диалог входа в twitter. – Neara
Я пошел ко всей этой боли, чтобы обеспечить беспрепятственную запись нескольким учетным записям. Я сохранил правильный токен + секретные пары, как вы можете видеть в моем коде. С помощью одного токена он работал нормально. Я еще не обновил задачу, которая будет отправлять сообщения в twitter. Я думаю, что создание экземпляра Twython с соответствующими токенами должно сделать трюк, нет? – Neara
ваши коды в порядке, проблема заключается в том, что вы снова используете токен, результатом чего является токен с недействительным/истекшим сроком действия. Поэтому вы должны выйти из системы, чтобы принять другую учетную запись.Я забыл, почему, но он истекает после того, как вы его используете. – catherine