2011-01-10 32 views
27

Tôi có một vài ứng dụng Rails tôi đang tìm cách tích hợp với OmniAuth, nhưng có một vấn đề khái niệm mà tôi đang gặp phải mà tôi muốn tìm ra trước tiên . Hãy xem xét trường hợp sau:OmniAuth: Bảo vệ chống lại nhiều tài khoản cho cùng một người dùng

  1. Ứng dụng của bạn, Foo, hỗ trợ đăng nhập OmniAuth qua Twitter và Facebook.
  2. Joe đến trang web của bạn và đăng nhập qua tài khoản Twitter của anh ấy. Điều này tạo ra một người dùng mới trên Foo và liên kết nó với ủy quyền Twitter mới này.
  3. Joe đăng xuất khỏi Foo và quên về trang web trong sáu tháng.
  4. Joe trở lại Foo, không nhớ rằng trước đây anh đã đăng nhập bằng Twitter.
  5. Joe đăng nhập bằng Facebook. Vì anh ta chưa đăng nhập thông qua ủy quyền Twitter ban đầu của mình, không có cách nào để phát hiện anh ta, trên thực tế, cùng một Joe, và một tài khoản mới được tạo ra.
  6. Joe phát hiện ra tài khoản cũ của mình và giờ đây đã thất vọng vì nội dung cũ của anh ấy bị ràng buộc với tài khoản cũ này và anh ấy không thể đăng nhập bằng Twitter và Facebook thay thế được.

Vì Twitter không cung cấp Foo bằng địa chỉ email, không có số nhận dạng phổ dụng để phát hiện hai tên Joes giống Joe. Bạn có thể quyết định chỉ hỗ trợ các nhà cung cấp cung cấp cho bạn địa chỉ email của người dùng, nhưng điều này không giúp ích nếu người dùng đã đăng ký với các địa chỉ email khác nhau trên các nhà cung cấp khác nhau.

Giải pháp duy nhất khác mà tôi có thể nghĩ là cung cấp cho người dùng một số cách để hợp nhất hai tài khoản hiện có. Đó là một nhức đầu lớn so với sự dễ dàng tương đối của mọi thứ khác khi sử dụng OmniAuth. Nếu đây là giải pháp duy nhất, có ai đi qua một hướng dẫn/hướng dẫn cho thấy một ví dụ về cách này có thể được thực hiện? Tôi ngạc nhiên về vấn đề này đã không nhận được nhiều sự chú ý hơn vì sự phổ biến của OmniAuth.

Cảm ơn!

+1

Tôi không thấy giải pháp hoàn hảo cho vấn đề này. Vì vậy, tôi đã quyết định đi với nhà cung cấp duy nhất cho đến bây giờ cho đến khi tôi tìm ra một giải pháp vững chắc cho việc này. – hnprashanth

+1

hi Jimmy Cuadra, bạn có thể xem try.discourse.org. Discourse đã triển khai nhiều tùy chọn đăng ký bằng omniauth. Mã nguồn của nó có sẵn tại GitHub. –

Trả lời

7

Cảm giác ruột của bạn là chính xác. Bạn sẽ phải cung cấp công cụ hợp nhất cho người dùng của mình ... hoặc bạn có thể bỏ qua vấn đề.

+4

Câu trả lời được chấp nhận này như thế nào? Bất cứ ai cũng phát hiện ra một công cụ hợp nhất phong nha chưa? –

+2

Vì đó là câu trả lời duy nhất có thể? Bạn không thể ngăn người dùng nhận hai tài khoản do tai nạn. Không có công cụ hợp nhất nào có thể biết phải làm gì trong ứng dụng của bạn. Cách thực hành tốt nhất để sử dụng để giúp * dễ dàng * quy trình hợp nhất là tách biệt danh tính xác thực khỏi hồ sơ người dùng thực tế trong ứng dụng của bạn. Bằng cách đó, ứng dụng của bạn có thể cho phép nhiều nhà cung cấp xác thực liên kết với một hồ sơ người dùng. – mlibby

2

Tôi nhận thấy rằng Stack Overflow xuất hiện để thử và khắc phục vấn đề này, bằng cách lưu trữ tùy chọn xác thực của người dùng trong cookie và tự động đăng nhập bạn khi bạn quay lại trang đăng nhập.

Trong khi nó vẫn không cung cấp giải pháp hoàn chỉnh cho vấn đề này, nó có thể giúp giảm thiểu bụi phóng xạ.

+0

Nhưng nếu người dùng xóa cookie của mình ... – SZH

+0

hoặc nếu người dùng thay đổi máy tính –

+1

hoặc người dùng khác sử dụng cùng một máy tính và trình duyệt –

3

Tôi cũng đã gặp phải vấn đề này ngay hôm nay. Tôi nghĩ rằng tôi sẽ xử lý theo cách sau:

Tôi sẽ yêu cầu người dùng gửi email và mật khẩu khi đăng ký, giống như trong thiết lập xác thực truyền thống, nơi tôi cố gắng nhận email từ Dịch vụ OmniAuth người dùng đã chọn (FB, Twitter, ...). Vì vậy, họ chỉ phải cung cấp email nếu nó không được cung cấp bởi nhà cung cấp auth. Sau đó, nếu người dùng đăng nhập sau đó với cùng một nhà cung cấp mà họ đã sử dụng để đăng ký, họ sẽ đăng nhập ngay lập tức. Điều này có thể sẽ xảy ra trong 99% của tất cả các trường hợp.

Tuy nhiên, có email và mật khẩu của người sử dụng tôi cũng có thể xử lý tất cả các loại trường hợp có thể xảy ra (trong đó có một bạn mô tả):

  • Nhà cung cấp xác thực ban đầu là xuống hoặc người dùng xóa tài khoản nhà cung cấp xác thực của họ -> Giải pháp: Người dùng có thể đăng nhập theo cách truyền thống, sử dụng email và mật khẩu của họ. Mọi người dường như cho rằng FB, Twitter, vv sẽ ở đó mãi mãi, sẽ không bao giờ thất bại và người dùng sẽ không bao giờ bỏ tài khoản của họ với những người đó Bằng cách không lưu trữ pw và email của người dùng, bạn sẽ mất tất cả tài khoản người dùng của mình do nhà cung cấp tạo ra nếu một trong các trường hợp này xảy ra khi bạn không thể ánh xạ chúng cho người dùng nữa. dịch vụ bên ngoài.)

  • Người dùng đăng nhập sau với nhà cung cấp xác thực khác (trường hợp này) -> Giải pháp: Cố gắng ánh xạ người dùng đến tài khoản hiện có bằng email của họ, nếu không thành công, hãy hiển thị biểu mẫu đăng ký với một nút/liên kết "Tôi đã có một tài khoản, xin vui lòng đăng nhập cho tôi trong" (hoặc tương tự ;-). Nếu họ nhấp vào đó, họ phải cung cấp email và mật khẩu của họ. Sau đó, nếu họ xác thực thành công, bạn có thể chỉ cần thêm rằng nhà cung cấp vào hồ sơ người dùng hiện có, và thời gian sau, họ đang đăng nhập ngay lập tức, giống như với các nhà cung cấp họ ban đầu được sử dụng để đăng ký ...

lẽ có những trường hợp khác có thể xảy ra. Bất kỳ phản hồi nào?

+2

Tôi nghĩ rằng một cách tốt hơn là thực sự hoàn toàn dựa vào email và ánh xạ xác thực bên ngoài bổ sung qua email cho người dùng nội bộ. Sau đó, gửi cho người dùng một thư có liên kết để xác thực danh tính của họ. Điều này thuận tiện hơn việc sử dụng 'mật khẩu sao lưu'. – Nico

6

Tôi biết đây là một câu hỏi cũ nhưng tôi nghĩ rằng tôi sẽ trả lời với những gì tôi đã thực hiện gần đây trên một dự án nào đó, chỉ để tham khảo.

Tiết lộ đầy đủ: Tôi không nghĩ ra điều này, tôi đã lấy nó từ người khác trên web. Có một tốt viết lên on the Omniauth wiki.

Tôi chưa bao giờ tìm thấy cách tốt để tự động liên kết tài khoản Facebook/Twitter/etc mà thay vào đó, người dùng có thể liên kết nhiều tài khoản khi họ đăng nhập bằng tài khoản đầu tiên.

Đây là kịch bản:

  • Người dùng đăng nhập vào với ví dụ Facebook
  • Họ có một trang hồ sơ trong đó liệt kê các mạng xã hội mà họ đã gắn liền với tài khoản, và một tùy chọn để liên kết với từng loại vào tài khoản
    • ví dụ: "Facebook liên kết | Liên kết Twitter | Liên kết Google"
  • "liên kết Twitter" ví dụ liên kết đến các hành động omniauth cùng một người dùng sẽ sử dụng để đăng nhập vào Twitter
  • trong xử lý gọi lại, kiểm tra xem nếu người dùng đang đăng nhập
    • nếu họ đang có, lưu trữ nhà cung cấp và uid trong một hồ sơ riêng biệt cho người sử dụng
    • khác, đăng nhập họ như thường lệ

Thay vì lưu trữ các nhà cung cấp và uid trên mô hình của người dùng, mô hình sau đó sẽ là một người dùng có thể có nhiều bản sắc mạng xã hội.

Một lần nữa, xin lỗi vì đã gây chết, nhưng nhận xét của Abe Petrillo trả lời câu trả lời được chấp nhận khiến tôi nghĩ rằng một lượt xem khác có thể hữu ích.

+0

Điều này rất hữu ích. Tôi đã cố gắng làm chính xác điều này. Cảm ơn rất nhiều :) –

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