2017-06-26 16 views
6

Bạn biết đấy, các ứng dụng web cần phiên hoặc cookie để xác thực. Tôi cố gắng để xây dựng ứng dụng web với Vue.JS và Flask microframework ví dụ như ERP hoặc CRM.Làm cách nào để làm việc với các phiên trong Vue và Flask?

Tôi đang bối rối. Tôi có thể làm việc với các phiên như thế nào? Hãy nghĩ rằng chúng tôi có một mã như thế này trong Flask:

import os 
from flask import Flask, request, jsonify, abort, session 

app = Flask(__name__) 
app.config['SECRET_KEY'] = os.getenv('SECRET_KEY') or \ 
    'e5ac358c-f0bf-11e5-9e39-d3b532c10a28' 

@app.route('/login', methods=['POST']) 
def user_login(): 
    user = request.form['user'] 
    session['isLogged'] = True 
    return jsonify({'status': session['isLogged']}) 

@app.route('/user-info') 
def user_info(): 
    if 'isLogged' in session: 
     return jsonify({'user': 'ali'}) 
    else: 
     return jsonify({'error': 'Authentication error'}) 

và mã front-end của chúng tôi nên như thế này:

mounted() { 
    this.checkIsLogged(); 
    }, 
    methods: { 
    checkIsLogged() { 
     fetch('http://127.0.0.1:5000/user-info', { 
     mode: 'no-cors', 
     method: 'GET', 
     }).then((resp) => { 
     return resp; 
     }).then((obj) => { 
     if(obj.user) { 
      this.status = true 
     } 
     }) 
    }, 
    login() { 
     let frmData = new FormData(document.querySelector("#frmLogin")); 

     fetch('http://127.0.0.1:5000/login', { 
     mode: 'no-cors', 
     method: 'POST', 
     body: frmData, 
     }).then((resp) => { 
     return resp; 
     }).then((obj) => { 
     this.status = obj.status 
     }) 
    } 
    } 

Mọi thứ đều bình thường cho đến khi tôi làm mới trang. Khi tôi làm mới trang, tôi mất các phiên.

Phiên phía máy chủ rất quan trọng vì nhiều lý do. Nếu tôi sử dụng localStore hoặc một cái gì đó tương tự như thế nào có thể được an toàn tôi không có ý tưởng.

Tôi cần một số trợ giúp đã làm việc trên các dự án tương tự. Bạn có thể cho tôi gợi ý. Bởi vì tôi chưa bao giờ làm việc với các dự án tương tự.

thứ khác Tôi đã đọc về chủ đề này:

Tôi vẫn còn bối rối đến khoảng những gì tôi có thể làm.

+1

Bạn có đang gửi yêu cầu trên các tên miền chéo không? nơi phiên và cookie sẽ không được gửi? –

Trả lời

1

Xử lý phiên là điều mà SPA của bạn thực sự không quan tâm nhiều. Phiên là giữa tác nhân người dùng (trình duyệt) và máy chủ. Ứng dụng vue của bạn không có nhiều việc phải làm với nó. Đó không phải là để nói rằng bạn không thể làm điều gì đó sai, nhưng thường là vấn đề không phải là với giao diện người dùng của bạn.

Điều đó được cho là thật khó để đưa ra câu trả lời cho câu hỏi này bởi vì chúng tôi thực sự không biết có gì sai. Những gì tôi có thể làm là cung cấp cho bạn hướng dẫn về cách bạn có thể chẩn đoán loại vấn đề này. Trong chẩn đoán này, bạn sẽ tìm ra vấn đề thực tế ở đâu và, ít nhất đối với tôi, nó thường trở nên rõ ràng những gì tôi cần làm.

Bước 1)

Sử dụng một số công cụ mức HTTP thấp để kiểm tra phản ứng Server (cá nhân tôi sử dụng curl hoặc Postman khi lười biếng). Gửi yêu cầu đăng nhập tới máy chủ và xem các tiêu đề phản hồi. Khi đăng nhập thành công, bạn nên có tiêu đề "Set-Cookie", thường là với nội dung của "sessionid" hoặc bất kỳ khóa nào bạn đang sử dụng cho phiên. Nếu bạn không nhìn thấy một "Set-Cookie" một trong những điều sau đây là đúng:

  • Máy chủ của bạn đã không bắt đầu một phiên làm việc và do đó đã không gửi một cookie phiên cho khách hàng
  • có một proxy/firewall/anti-ad- hoặc plugin theo dõi một nơi nào đó lọc ra cookie

Nếu bạn thấy Set-Cookie Header tiếp tục với Bước 2, nếu không hãy xem hướng dẫn liên quan đến các phiên trong công nghệ phụ trợ bạn đã chọn.

Bước 2)

Rất may hầu hết các trình duyệt hiện đại có một giao diện điều khiển nhà phát triển cho phép bạn làm hai việc: 1) Kiểm tra tiêu đề yêu cầu HTTP của bạn, cơ thể và đáp ứng tiêu đề và cơ thể 2) Hãy nhìn vào lưu trữ cookie

Sử dụng tính năng đầu tiên (trong Chrome điều này sẽ nằm trong tab "Mạng" trong bảng điều khiển dành cho nhà phát triển) chẩn đoán yêu cầu và phản hồi. Để làm như vậy, bạn cần mở bảng điều khiển dành cho nhà phát triển trong khi thực hiện đăng nhập trong ứng dụng của mình. Kiểm tra phản hồi của thông tin đăng nhập, nó sẽ chứa Set-Cookie nếu đăng nhập thành công. Nếu cookie không có mặt, máy chủ của bạn không gửi được, có thể vì lý do bảo mật (chính sách gốc).

Nếu có, cookie hiện phải có trong cửa hàng cookie. Trong bảng điều khiển dành cho nhà phát triển Chrome, hãy chuyển đến tab "Ứng dụng", mở rộng Cookie từ menu bên trái và xem qua các máy chủ lưu trữ cookie nào. Nên có một cookie hiện tại đã được thiết lập trong bước trước. Nếu không trình duyệt không chấp nhận cookie. Điều này thường xảy ra khi cookie của bạn được đặt cho một miền hoặc đường dẫn nhất định, không đúng. Trong trường hợp này, bạn có thể thử đặt tên miền và/hoặc đường dẫn thành giá trị trống hoặc giá trị đúng (trong trường hợp đường dẫn "/"). Nếu cookie của bạn là hiện nay, chuyển sang bước 3

Bước 3)

Ghi khi tôi nói các ứng dụng không có gì để làm với phiên. Mọi yêu cầu bạn gửi bằng ajax hoặc chỉ cần nhập URL hợp lệ trong trình duyệt sẽ gửi tất cả cookie hiện diện cho máy chủ lưu trữ này trong tiêu đề yêu cầu. Đó là trừ khi bạn chủ động ngăn chặn bất kỳ thư viện nào bạn đang sử dụng để làm như vậy. Nếu yêu cầu của bạn không chứa cookie phiên một trong các cách sau thường là đúng:

  • việc sử dụng thư viện http của bạn chủ động ngăn chặn việc gửi các tập tin cookie
  • bạn đang gửi một yêu cầu đúng nhưng cookie- miền/path không phù hợp với yêu cầu máy chủ/path và vì thế không được gửi cùng
  • cookie của bạn là siêu shortlived và đã hết hạn

Nếu cookie của bạn sẽ được gửi một cách chính xác sau đó xử lý các phiên của bạn nên làm việc trừ khi bạn máy chủ không rem phát ra phiên đó hoặc bắt đầu phiên mới bất kể phiên hiện tại.

Tôi nhận thấy câu hỏi này khá cũ và câu trả lời mở rộng này đến quá muộn, tuy nhiên, ai đó có vấn đề tương tự có thể kiếm lời từ đó.

Các vấn đề liên quan