2012-02-06 38 views
7

Trong ứng dụng đường ray 3 của tôi, tôi sử dụng Omniauth cho phần xác thực người dùng (fb/twitter).Phiên Omniauth hết hạn khi trình duyệt được đóng

Thật sự tôi làm theo điều này:

https://github.com/RailsApps/rails3-mongoid-omniauth

https://github.com/RailsApps/rails3-mongoid-omniauth/wiki/Tutorial

Nhưng, khi tôi đóng phiên trình duyệt hết hạn và tôi cần phải đăng nhập lại. Tôi làm cách nào để giữ phiên cho người dùng cũ?

Bất kỳ trợ giúp nào sẽ được đánh giá rất nhiều!

+0

không rõ ràng: điều này xảy ra chỉ trong môi trường/trình duyệt địa phương của bạn? Môi trường thử nghiệm của bạn xử lý các cookie HTTP như thế nào? – mkro

+0

sau khi đăng nhập session_controller lưu trữ user_id: phiên [: user_id] = user.id https://github.com/RailsApps/rails3-mongoid-omniauth/blob/master/app/controllers/sessions_controller.rb – Lamp

+0

Thực sự không thể nói những gì xảy ra trong ứng dụng của bạn, nhưng có thể bạn muốn xem xét thời gian cookie và các cài đặt khác xung quanh cookie seession: http://oldwiki.rubyonrails.org/rails/pages/HowtoChangeSessionOptions – mkro

Trả lời

4

Devise cung cấp chức năng này thông qua mô-đun có thể nhớ được. OmniAuth tích hợp dễ dàng với nó thông qua mô-đun OmniAuth (bạn không bao giờ đoán được). Nó thậm chí còn được đề cập trong liên kết thứ hai mà bạn đã đăng!

+0

[Đây] (https: // github. com/plataformatec/devise/wiki/OmniAuth: -Overview) Trang wiki của Devise về tích hợp với OmniAuth. –

+0

Tôi sẽ dùng thử! Cảm ơn! – Lamp

+0

Vic, bạn có gặp rắc rối với nó không? –

1

Hãy đảm bảo chính sách cookie mà ứng dụng đường ray của bạn tuân theo không có cài đặt hợp lý cho trường hợp sử dụng của bạn (xem liên kết trong nhận xét ở trên). Tất cả tôi có thể tưởng tượng ngay bây giờ (biết những gì tôi biết, ngồi nơi tôi ngồi) là các cookie (s) ha (s/ve) tài sản được suboptimal/không mong muốn trong bối cảnh của bạn.

Vui lòng kiểm tra cài đặt cookie trong công cụ gỡ lỗi/phát triển trình duyệt như công cụ phát triển firebug, firecookie hoặc chrome.

Xin lỗi, đó là tất cả những gì tôi có thể đưa ra khi tôi biết được vấn đề. Vui lòng liên hệ lại với tôi để biết thêm chi tiết về thiết lập cookie và thử nghiệm của bạn.

2Cents của tôi.

+0

Cảm ơn câu trả lời của bạn! Nhưng bạn có thể thấy ở đây không phải vấn đề về cookie: http://stackoverflow.com/questions/4475726/devise-and-omniauth-remembering-oauth – Lamp

9

Điều bạn muốn không khó, bạn chỉ phải đặt cookie cố định khi phiên được tạo và sau đó truy xuất giá trị này khi bạn đặt người dùng hiện tại.

Trong bạn ApplicationController, chỉ cần thay đổi phương pháp current_user của bạn để:

def current_user 
    return unless cookies.signed[:permanent_user_id] || session[:user_id] 
    begin 
    @current_user ||= User.find(cookies.signed[:permanent_user_id] || session[:user_id]) 
    rescue Mongoid::Errors::DocumentNotFound 
    nil 
    end 
end 

Và trong SessionsController của bạn, sửa đổi của bạn create để thiết lập các cookie nếu người dùng muốn:

def create 
    auth = request.env["omniauth.auth"] 
    user = User.where(:provider => auth['provider'], 
        :uid => auth['uid']).first || User.create_with_omniauth(auth) 
    session[:user_id] = user.id 
    cookies.permanent.signed[:permanent_user_id] = user.id if user.really_wants_to_be_permanently_remembered 
    redirect_to root_url, :notice => "Signed in!" 
end 
+0

Cảm ơn câu trả lời của bạn!Tôi kết hợp suy nghĩ và vấn đề của tôi đã được giải quyết! – Lamp

+0

Bạn thực sự không nên sử dụng user_id trong cookie đã ký, cách thích hợp là tạo mã thông báo ghi nhớ trong mô hình người dùng của bạn, lưu trong cookie cố định và khi bạn không có phiên hiện tại, bạn tạo một một bằng cách tra cứu mã thông báo ghi nhớ. Các mã thông báo khó đoán hơn thay đổi uid của bạn nếu một hacker tìm ra cách để có được xung quanh việc ký kết cookie (nó được thực hiện trước đó). –

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