Сеанс колбы не сохраняется между запросами для приложения Angular - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть приложение Angular, которому нужно вызывать сервер Flask, использующий сеансы для хранения информации между запросами.

У меня также есть старое приложение JS, которое вызывает тот же сервер с использованием XMLHttpRequest, который я заменяю нановое приложение Angular.

Проблема в том, что когда старое приложение отправляло запрос, сессионные cookie-файлы работали, как и ожидалось, но теперь с приложением angular это не работает.

Все взаимодействия выполненычерез локальный хост.Сервер Flask доступен из localhost:5000, а приложение Angular - из localhost:4200.

Старое приложение выполняло такой запрос:

var xhttp = new XMLHttpRequest();
xhttp.open("GET", "http://localhost:5000/api/getAll", true);
xhttp.withCredentials = true;
xhttp.send();

Приложение Angular работает следующим образом.:

import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders, } from '@angular/common/http';
import { Observable } from 'rxjs';

const httpOptions = {
  withCredentials: true,
  headers: new HttpHeaders({ 
    'Content-Type': 'application/json',
    'charset': 'UTF-8',

    })
};


@Injectable()
export class ServerService {
  url = "http://localhost:5000/api/"

  constructor(private http:HttpClient) { }

  getAll(): Observable<string>{
    return this.http.get<string>(this.url + 'getAll', httpOptions);
  }

  login (username: string): Observable<string> {
    return this.http.post<string>(this.url + 'login', JSON.stringify({"username": username}), httpOptions)
  }

}

И сервер Flask:

from flask import Flask, session, request, jsonify
from flask_cors import CORS
import os
import Person
import multiprocessing as mp
import json
import Insurance
import datetime
import Functions
import missingVal


app = Flask(__name__)
CORS(app, supports_credentials=True)

# set the secret key. keep this really secret:
# The value come from calling os.urandom(24)
# See https://stackoverflow.com/a/18709356/3729797 for more information
# app.secret_key = b'fL\xabV\x85\x11\x90\x81\x84\xe0\xa7\xf1\xc7\xd5\xf6\xec\x8f\xd1\xc0\xa4\xee)z\xf0'
app.config['SECRET_KEY'] = b'fL\xabV\x85\x11\x90\x81\x84\xe0\xa7\xf1\xc7\xd5\xf6\xec\x8f\xd1\xc0\xa4\xee)z\xf0'




@app.route('/api/getAll')
def getAll():
    response = jsonify()
    if 'username' in session:
        user = users[session['username']]
        # some more logic here
        response = jsonify({'username': session['username']})

    return response

# login and account creation    
@app.route('/api/login', methods=['POST'])
def login():
    response = jsonify()
    if users.get(request.json.get('username')) is not None:
        session['username'] = request.json.get('username')
        # some more logic here
        response = jsonify({'username': session['username']})

    response.headers.add('Access-Control-Allow-Methods',
                         'GET, POST, OPTIONS, PUT, PATCH, DELETE')
    response.headers.add('Access-Control-Allow-Headers',
                         "Origin, X-Requested-With, Content-Type, Accept, x-auth")
    return response


if __name__ == '__main__':
    # some more logic here
    app.run(host='localhost', threaded=True

Проблема заключается в том, что при входе в систему он передает информацию в сеанс, а при выполнении другого запроса я проверяю,эта информация находится в сессии, но это не так.

Я нашел много других связанных с этим вопросов о StackOverflow:

  • этот имеет отношение к установке secret_key несколько раз, что не является моей проблемой.
  • этот говорит о статической и динамической конфигурации в init, но я не думаю, что это как-то связано с моей проблемой?Скажите мне, если я ошибаюсь.
  • этот и этот другой возникли проблемы, потому что их полезная нагрузка внутри файла cookie была слишком большой, разрешено только 4096 байт или меньшепохоже на то.Но я добавил в файл cookie только имя пользователя, состоящее из нескольких букв, поэтому я не верю, что это моя проблема.
  • этот Я думал, что это связано с моей проблемой, потому что она имеет дело сlocalhost, но выясняется, что это произошло потому, что OP смешивал запросы на 127.0.0.1 и localhost, а cookie, по-видимому, обрабатывается отдельно флягой.Я делаю все свои запросы по localhost, поэтому я не думаю, что они связаны.

Я немного растерялся сейчас, возможно, есть кое-что очень очевидное, что я упускаю, но не могу понять,Любое предложение приветствуется

1 Ответ

0 голосов
/ 17 ноября 2018

Я заработал, добавив

response.headers.add('Access-Control-Allow-Headers',
                         "Origin, X-Requested-With, Content-Type, Accept, x-auth")

на сервере Flask перед отправкой всех запросов.

Например

@app.route('/api/doSomething', methods=['POST'])
def doSomething():
    response = jsonify()
    if 'username' in session:
        # some logic here
        response = jsonify(someData)

    # here is the line I added
    response.headers.add('Access-Control-Allow-Headers',
                         "Origin, X-Requested-With, Content-Type, Accept, x-auth")
    return response

Очевидно, это необходимо при выполнении CORS, некоторые полезные сведения о MDN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...