2012-05-11 1 views
3

OAuth2はリダイレクトコールバックメカニズムを使用しているため、自分のWebサイトのアカウントで既にログインしているユーザーに認証を追加するには、oauth2経由でSina Weiboクライアントを作成しています。このルーチンの後、コールバック・ビュー・ハンドラではフラスコ・セッションは完全に新しいオブジェクトです。したがって、私は現在のユーザーのログイン状況を失った。oath2コールバック時にflask.sessionオブジェクトを再開する方法

しかし、新しいタブを追加して自分のサイトのホームページ(www.funfunsay.com)にアクセスするのと同じブラウザ(Firefoxなど)では、セッションオブジェクトはまだ存在します。

同じブラウザインスタンスに2つのflask.sessionがありますか?

私はシンプルなモジュールを書いていますが、私は古いセッションを失った以外はSina weiboとよく似ています。

# -*- coding: utf-8 -*- 

from flask import (Flask, render_template, current_app, request, 
        flash, url_for, redirect, session, g, abort) 


# For import * 
__all__ = ['create_app'] 

app = Flask(__name__) 
app.config['DEBUG'] = True 
app.secret_key = 'secret key' 

@app.before_request 
def before_request(): 
    print "before request:", session 
    #<1st output>for first visit www.funfunsay.com, the output is: before request: <SecureCookieSession {}> 
    #<3rd output>for callback from sina, the output is the same 

@app.after_request 
def after(response): 
    print "after request:", session 
    #<2nd output>for first visit www.funfunsay.com, the output is: after request: <SecureCookieSession {'testinfo': 'abc'}*> 
    return response 


@app.route('/') 
def hello_world(): 
    print "request:", request 
    login_uri = 'https://api.weibo.com/oauth2/authorize?redirect_uri=http%3A//funfunsay.com/connect/sina/callback&response_type=code&client_id=3921006605&display=default' 

    session['testinfo'] = 'abc' #a key-value for test 

    return redirect(login_uri) 

@app.route("/connect/sina/callback") 
def connect_sina_callback(): 
    print "connect_sina_callback: ", session 
    #<4th output>will output: connect_sina_callback: <SecureCookieSession {}> 
    return 'Callback success!' 

if __name__ == '__main__': 
    app.run('0.0.0.0', 80) 

PS:テスト目的で、私はホストファイルに "127.0.0.1 www.funfunsay.com"を追加します。

+0

私はこの奇妙な現象を発見しました: 私は私のコールバックURL文字列、 で「www.my-site-addr.com」を使用 その後、「my-site-addr.com」を入力、Firefoxブラウザを起動して、 enterを押すと、セッションはコールバックでクリアされました。 Firefoxブラウザを起動し、「www.my-site-addr.com」と入力してEnterキーを押すと、セッションはまだそこにありました! なぜですか? – Brent81

答えて

2

ドメイン名の一貫性を保つだけです。私の解決方法は常に "www.my-web-site.com"を使用し、 "my-web-site.com"を入力したユーザーが "www.my-web-site.com"にリダイレクトする場合、今はすべてが大丈夫です!

0

Flaskは、異なる発信元からの各要求に新しいセッションを割り当てます。したがって、アドレスが同じIPに解決されたとしても、別個の開始点からの各要求には異なるセッションが割り当てられます。例えば。 http://localhost:5000で開始されたブラウザウィンドウは、同一のブラウザウィンドウ内のタブと異なるセッションが割り当てられ、http://127.0.0.1:5000に導かれます。ただし、2人で同じ場所に解決されます。

これは、1つのセッションのデータが同じブラウザの他のタブで利用できないため、あなたが期待しているように、イライラする可能性があります...一方のセッションでは、もう一方のタブには空のsessionという変数があります。

コールバックURL(リクエストを送信しているサーバーで定義されている、たとえばデータプロバイダでOAuthアプリケーションを定義するときなど)を確実にする必要があるときに、OAuthコールバックを使用するときは、私の要求を開始しているサイトと一致します。たとえば、Github API開発者ページのOAuthアプリケーション設定でコールバックURLがhttp://localhost:5000/callbackと表示されている場合、ブラウザに空のセッションデータを含む新しいセッションでコールバックが開始されるため、ブラウザをhttp://127.0.0.1:5000にポイントできません。

幸いにも、これはデバッグするのが簡単です(少なくとも開発中はlocalhost)。データプロバイダのOAuthアプリケーション設定でコールバックURLを定義したのと同じ形式のホストを使用してサイトをテストするようにしてくださいたとえば、Facebook、Twitter、またはGithub OAuth APIパネルでアプリケーションを定義します)。

関連する問題