Flask - невозможно получить куки - PullRequest
6 голосов
/ 07 апреля 2020

У меня есть следующая конечная точка, запускающая поток авторизации:

@spotify_auth_bp.route("/index", methods=['GET', 'POST'])
def spotify_index():
    CODE = "code"
    CLIENT_ID =   os.environ.get('SPOTIPY_CLIENT_ID')
    SCOPE = os.environ.get('SPOTIPY_SCOPE')
    REDIRECT_URI = os.environ.get('SPOTIPY_REDIRECT_URI')

    SPOTIFY_AUTH_URL = "https://accounts.spotify.com/authorize"

    return redirect("{}?response_type={}&client_id={}&scope={}&redirect_uri={}".format(
        SPOTIFY_AUTH_URL, CODE, CLIENT_ID, SCOPE, REDIRECT_URI), code=302)

Затем я получаю перенаправление из Spotify на /callback, где я устанавливаю jwt куки в своем ответе, например так:

 @spotify_auth_bp.route("/callback", methods=['GET', 'POST'])
 def spotify_callback():
    token = user.encode_access_token(access_token)
    a11n_h, a11n_d, a11n_s = token.decode().split('.')
    response = make_response(redirect('http://localhost/about', code=302))
    response.set_cookie('a11n.h', a11n_h)
    response.set_cookie('a11n.d', a11n_d) 
    response.set_cookie('a11n.s', a11n_s, httponly=True)  

    return response

И файлы cookie отображаются в консоли моего браузера в разделе «Приложение».


Теперь я хотел бы получить их из другой конечной точки, например:

@spotify_auth_bp.route("/get_token/<user_id>", methods=['GET', 'POST'])
def get_token(user_id):
    # get access token cookies
    a11n_h = request.cookies.get('a11n.h')
    a11n_d = request.cookies.get('a11n.d')
    a11n_s = request.cookies.get('a11n.s')

Но я печатаю эти куки как None, None, None

также, у меня НЕТ Flask config ...

app.config.update(
    SESSION_COOKIE_SECURE=True,
    SESSION_COOKIE_SAMESITE='Lax',
)

... что может помешать отправке файлов cookie через http.


Что мне не хватает?


OBS: я тестирую эту конечную точку с использованием Postman и в заголовках я установил ключ Access-Control-Allow-Credentials на значение true.

Ответы [ 2 ]

3 голосов
/ 10 апреля 2020

В соответствии с вышеизложенным, я предполагаю, что вы используете приложение внешнего интерфейса, основанное на любой другой платформе, и используете библиотеки, такие как ax ios, fetch, request и т. Д. c, чтобы использовать API на flask.

Итак, вы, возможно, пропустили, что вам нужно установить флаг в запросе, чтобы разрешить отправку куки. Ниже приведены ссылки, чтобы найти способы сделать это:

  1. Fetch API: https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch#Sending_a_request_with_credentials_included
    fetch('https://example.com', {
      credentials: 'include'
    });
XMLHttpRequest
    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'http://example.com/', true);
    xhr.withCredentials = true;
    xhr.send(null);

Исправьте меня, если проблема не решится.

0 голосов
/ 13 апреля 2020

сработало следующее (как предложено в ответе Друва Агарвала):

getToken(event) {
    const {userId} = this.props
    const options = {
      url: `${process.env.REACT_APP_WEB_SERVICE_URL}/get_token/1`,
      method: 'get',
      headers: {
        'Content-Type': 'application/json',
        Authorization: `Bearer ${window.localStorage.authToken}`,
      }
    };

    axios.defaults.withCredentials = true // <--------------------

    return axios(options)
    .then((res) => {
      console.log('res.data.data)
    })    
    .catch((error) => { console.log(error); });
  };

Я не знаю, чего не хватало в моем запросе к Почтальону, но теперь он работает.

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