Session 字段是 None

Session field is None

我在一个域中托管了一个用 Flask 编写的 rest API,在 Azure 应用程序服务的另一个域中托管了我的 React 应用程序。我可以使用用户名和密码成功登录系统。但是,当我尝试访问端点时,我得到 None 用户名属性(本地一切正常,没有任何问题)。

def login_required( f ):
    @wraps(f)
    def wrap( *args, **kwargs ):
        project_owner = session.get( 'username' )
        if project_owner is None:            
            logging.error( ERROR_MSG.LOGIN_ERROR_MSG )
            return response.cannot_process_redirect( ERROR_MSG.LOGIN_ERROR_MSG, '/' )
        else:
            return f( *args, **kwargs )
    return wrap

我想我已经应用了正确的 CORS 策略,但我无法让它工作。应用的CORS配置如下。

app.config['CORS_HEADERS'] = 'Content-Type'
app.config['SESSION_COOKIE_HTTPONLY'] = False
CORS( app, supports_credentials = True, resources = {r"/api/*": {"origins": "http://domainA.net"}} )

端点的提取请求如下所示。

export function getUsers() {
    const url = 'users/'
    const requestOptions = {
      method: 'GET',
      credentials: 'include'
    };
    return ( dispatch ) => {
    return fetchReq( requestOptions, url ).then( ([response, json]) => {
        // Do something
    } )
  }
}

同样在 Azure 应用服务中,domainA 被添加到 domainB 中允许的来源列表。

如果我使用 Postman,我可以毫无问题地使用端点。我注意到的一件事是在我的请求和响应中 session 值字符串不同。下面是request-responseheaders.

的截图

有什么想法吗?

玩了很多天后,我发现我需要将 credentials: 'include' 添加到我的获取请求中,以便浏览器将发送带有 cross-origin 请求的 cookie (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Credentials) .所以我在 Flask 应用程序中的最终 CORS 配置如下。

app.config['SESSION_COOKIE_SECURE'] = True
app.config['SESSION_COOKIE_HTTPONLY'] = True
app.config['SESSION_COOKIE_SAMESITE'] = 'None'
CORS( app, resources = {r"/api/*": {"origins": ["http://localhost:3000", "<Domains that are allowed to do cross origin requests>"],