0

我已经在一个域中托管了一个用 Flask 编写的 rest API,并且我在 azure app services 中的另一个域中托管了我的 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,我可以毫无问题地使用端点。我注意到的一件事是我的请求和响应会话值字符串不同。下面是请求-响应标头的屏幕截图。

有任何想法吗? 请求-响应标头

4

1 回答 1

0

在玩了很多天之后,我发现我需要添加credentials: 'include'到我的 fetch 请求中,以便浏览器发送带有跨域请求的 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>"],
于 2020-10-14T05:33:20.837 回答