4

我正在为移动应用程序使用 Flask、flask-jwt-extended 和 React-native (with Expo)。当我使用网络浏览器模拟或 Postman 时,我所有的 cookie 都设置正确。但是,当我使用 Xcode 的 ios 模拟器时,没有存储任何 cookie。

Environment:
  Flask Backend: 127.0.0.1:5000
  React-Native Front: 127.0.0.1:19006

这是我的烧瓶配置:

    JWT_SECRET_KEY = os.getenv("JWT_SECRET_KEY", 'local-secret')
    JWT_TOKEN_LOCATION = ['cookies']
    JWT_ACCESS_TOKEN_EXPIRES = datetime.timedelta(seconds=1800)
    JWT_COOKIE_SECURE = False
    CORS_HEADERS = "Content-Type"
    JWT_REFRESH_TOKEN_EXPIRES = datetime.timedelta(days=15)
    JWT_COOKIE_CSRF_PROTECT = True  # set_refresh_cookies() will now also set the non-httponly CSRF cookies
    JWT_CSRF_CHECK_FORM = True
    JWT_ACCESS_CSRF_HEADER_NAME = "X-CSRF-TOKEN-ACCESS"
    JWT_REFRESH_CSRF_HEADER_NAME = "X-CSRF-TOKEN-REFRESH"
    SSL_REDIRECT = False
jwt = JWTManager()
app = Flask(__name__)
app.config.from_object(APP_CONFIG[CONFIG_ENV])
cors = CORS(app, resources={r"/*": {"origins": "http://127.0.0.1:19006"}}, supports_credentials=True)
APP_CONFIG[CONFIG_ENV].init_app(app)
jwt.init_app(app)

以下是我存储 cookie 的方式(经典,使用邮递员或普通网络浏览器):

access_token = create_access_token(identity = token_identity)
refresh_token = create_refresh_token(identity = token_identity)
resp = jsonify({"access_token": access_token, "refresh_token": refresh_token})
set_access_cookies(resp, access_token)
set_refresh_cookies(resp, refresh_token)

以下是我使用 Fetch 库提出请求的方式:

let response = await fetch(URL + "/login", {
      body: form_data,
      method: "post",
      credentials: "include",
    })

但是,每当我使用带有 react-native 的 ios Simulator (127.0.0.1:19006) 发出请求时,cookie 永远不会被存储。问题可能来自哪里的任何想法?

4

1 回答 1

0

希望这可以帮助您节省一些时间。

当我使用经典浏览器在“http://127.0.0.1:19006”时,我在设备上使用以下域:“http://192.168.0.13:19006”。但是,添加这个域是不够的。我还添加在域中添加“http://192.168.0.13”。我不太清楚为什么,但它现在可以工作了:缓存在我的设备中正常工作。

这是我修改的代码行:

cors = CORS(app, resources={"/*": {"origins": ["http://127.0.0.1:19006", "http://192.168.0.13:19006", "http://192.168.0.13"]}}, supports_credentials=True)
于 2020-08-17T16:44:05.700 回答