3

私はoauth2を介してSinaWeiboクライアントを作成し、自分のWebサイトのアカウントで既にログインしている現在のユーザーに認証を追加しています。OAuth2はリダイレクトコールバックメカニズムを使用しているため、このルーチンの後、およびコールバックビューハンドラーでは、フラスコ.sessionは完全に新しいオブジェクトです。したがって、現在のユーザーのログインステータスを失いました。

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

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

私は非常に単純なモジュールを作成しました。古いセッションを失ったことを除けば、Sinaweiboとうまく合います。

# -*- 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:テスト目的で、hostsファイルに「127.0.0.1www.funfunsay.com」を追加します。

4

2 に答える 2

2

ドメイン名の一貫性を保つだけです。私の解決策は、常に「www.my-web-site.com」を使用することです。ユーザーが「my-web-site.com」と入力すると、「www.my-web-site.com」にリダイレクトされます。今、すべてが大丈夫です!

于 2012-05-12T17:45:45.683 に答える
0

Flask は、異なる起点からの各リクエストに新しいセッションを割り当てます。そのため、アドレスが同じ IP に解決されたとしても、異なる開始点からの各リクエストには異なるセッションが割り当てられます。たとえば、で開始されたブラウザ ウィンドウhttp://localhost:5000には、同じブラウザ ウィンドウのタブから別のセッションが割り当てられますhttp://127.0.0.1:5000。この 2 つのセッションは同じ場所に解決されます。

これは、1 つのセッションのデータが同じブラウザーの他のタブで利用できないため、イライラする可能性があります.1 つのセッションでは、サイトをナビゲートするときにすべてのデータを喜んで保存している可能性があります。 tab には空のsession変数があります。

これは、OAuth コールバックを操作するときに最も難しいと思います。コールバック URL (リクエストの送信先のサーバーで定義されている、たとえば、データ プロバイダーを使用して OAuth アプリケーションを定義する場合) が、リクエストを開始しています。たとえば、Github API 開発者ページの OAuth アプリケーション設定にコールバック URL がリストされている場合、コールバックは空のセッション データで新しいセッションで開始されるためhttp://localhost:5000/callback、ブラウザーを指すことができません。http://127.0.0.1:5000

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

于 2016-06-08T00:24:50.650 に答える