2

Twython を使用して、Django で構築した Web サイトに OAuth 機能を実装しています。ユーザーが自分の Twitter 資格情報を使用して登録およびログインできるようにしたいと考えています。

Twython Git リポジトリーの例を微調整して、Twitter 情報にログインして登録するための基本的なビューを作成しました。

私の問題は、現在、ユーザーは Firefox と Chrome では Twitter OAuth を使用して登録できますが、Safari では登録できないことです。この機能を実装する私の見解は次のとおりです。

def begin_auth(request):
        twitter = Twython(
        twitter_token = TWITTER_KEY,
        twitter_secret = TWITTER_SECRET,
        callback_url = request.build_absolute_uri(reverse('portnoy.views.thanks'))
    )
    # Request an authorization url to send the user to...
    auth_props = twitter.get_authentication_tokens()

    # Then send them over there, durh.
    request.session['request_token'] = auth_props
    return HttpResponseRedirect(auth_props['auth_url'])

def thanks(request, redirect_url='/'):
     c = RequestContext(request)
     twitter = Twython(
         twitter_token = TWITTER_KEY,
         twitter_secret = TWITTER_SECRET,
         oauth_token = request.session['request_token']['oauth_token'],
         oauth_token_secret = request.session['request_token']['oauth_token_secret']
     )

    # Retrieve the tokens we want...
    authorized_tokens = twitter.get_authorized_tokens()
    request.session['request_tokens'] = authorized_tokens
    debug('thanks', request.session['request_tokens'])

    user = User.objects.filter(username=authorized_tokens['screen_name'])
    if user.exists():
        user = user[0]
        user.backend='django.contrib.auth.backends.ModelBackend'     
        auth.login(request,user)
    else:
        return render_to_response('twitter_register.html', c)   
    return HttpResponseRedirect(redirect_url)

2 番目のビューでは、authorized_tokens をフェッチしてセッションに保存します。これにより、未登録ユーザーがリダイレクトされる twitter_register.html ページで簡単にアクセスできるようになり、未登録ユーザーが Twitter 情報でサインアップできるようになります。

Safari で失敗する行までの twitter_register ビュー コードを以下に示します。

def twitter_register(request):
    c = RequestContext(request)
    if request.method == 'POST':
        email = request.POST.get('email')
    password = request.POST.get('password')
    if not SafeContact.objects.filter(email=email).exists():
        return HttpResponseRedirect('/')
    if (User.objects.filter(email=email).exists()):
        c['warning'] = "Looks like that email is already in use"
        return render_to_response('twitter_register.html', c) 
    #debug('twitter_register', request.session['request_tokens'])
    twitter = Twython(
        twitter_token = TWITTER_KEY,
        twitter_secret = TWITTER_SECRET,
        oauth_token = request.session['request_tokens']['oauth_token'],
        oauth_token_secret = request.session['request_tokens']['oauth_token_secret']
    )
    debug('twitter_register', request.session['request_tokens'])
    twitter_user_dict = twitter.showUser(screen_name=request.session['request_tokens']['screen_name'])

これらはすべて Firefox と Chrome では機能しますが、Safari では失敗します。特に、Safari では、このコードは twitter_register の最後に提供された行で失敗します。

twitter.showUser(screen_name=request.session['request_tokens']['screen_name']). 

次のエラーが発生します。

The error is KeyError: 'screen_name'.

デバッグ ステートメント debug('thanks', request.session['request_tokens']) は、Firefox と Chrome では期待どおりに authorized_tokens を出力しますが、何らかの理由で Safari では 2x を出力します。最初に印刷すると、許可されたトークンの辞書が期待どおりに表示されますが、2 回目の印刷では、次のように表示されます。

thanks: {'<?xml version': '"1.0" encoding="UTF-8"?>\\n<hash>\\n  <error>Invalid / expired Token</error>\\n  <request>/oauth/access_token</request>\\n</hash>\\n'}

これは Safari でのみ発生しているように見えるため、かなり混乱しています (v. 5.1.5 でテストしています)。

この問題を解決する方法についてアドバイスをいただければ幸いです。これを見てくれてありがとう!

4

1 に答える 1

0

「Thanks」ビューが 2 回実行されているようです。

twitter_register ビューの次の行が原因である可能性はありますか?

if not SafeContact.objects.filter(email=email).exists():
        return HttpResponseRedirect('/')
于 2012-11-14T21:45:45.283 に答える