3

我正在通过oauth2编写新浪微博客户端,为已经使用我自己网站帐户登录的当前用户添加身份验证,因为OAuth2使用重定向回调机制,似乎在这个例程之后,并且在回调视图处理程序中, flask.session 完全是一个新对象。因此我失去了当前用户的登录状态。

但是在同一个浏览器(比如Firefox)中添加一个新标签并访问我网站的主页(www.funfunsay.com),会话对象仍然存在!

所以同一个浏览器实例中有两个flask.session???

我写了一个非常简单的模块,除了我丢失了旧会话之外,它与新浪微博很好。

# -*- 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”。

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...,即使两者解析到相同的位置。

这可能令人沮丧,因为一个会话中的数据将无法在同一浏览器中的另一个选项卡中使用,正如您所期望的那样......虽然一个会话可能会在您浏览网站时愉快地存储您的所有数据,另一个会话选项卡将有一个空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 回答