2009-04-22 33 views
9

Tôi đang làm việc trên ứng dụng cho phép người dùng đăng ký tạo hoặc tải lên nội dung và cho phép người dùng ẩn danh xem nội dung đó và duyệt trang của người dùng đã đăng ký để tìm nội dung đó - đây là rất giống với cách một trang web như Flickr, ví dụ, cho phép mọi người duyệt các trang của người dùng.Tạo ID người dùng duy nhất và mờ trong Google App Engine

Để thực hiện việc này, tôi cần một cách để xác định người dùng trong yêu cầu HTTP GET ẩn danh. Người dùng có thể nhập http://myapplication.com/browse/<userid>/<contentid> và truy cập đúng trang - phải là duy nhất nhưng không được giống địa chỉ email của người dùng vì lý do bảo mật.

Thông qua Google App Engine, tôi có thể nhận địa chỉ email được liên kết với người dùng, nhưng như tôi đã nói, tôi không muốn sử dụng địa chỉ đó. Tôi có thể yêu cầu người dùng ứng dụng của tôi chọn một tên người dùng duy nhất khi họ đăng ký, nhưng tôi muốn thực hiện tùy chọn đó nếu có thể, để quá trình đăng ký càng ngắn càng tốt.

Một tùy chọn khác là tạo một số cookie ngẫu nhiên (GUID?) Trong quá trình đăng ký và sử dụng điều đó, tôi không thấy một cách rõ ràng để đảm bảo tính duy nhất của cookie như vậy mà không có chuyến đi tới cơ sở dữ liệu.

Có cách nào, được cung cấp đối tượng người dùng App Engine, để nhận mã định danh duy nhất cho đối tượng đó có thể được sử dụng theo cách này không?

Tôi đang tìm giải pháp Python - Tôi quên rằng GAE cũng hỗ trợ Java ngay bây giờ. Tuy nhiên, tôi mong đợi các kỹ thuật tương tự, bất kể ngôn ngữ.

Trả lời

7

Thời gian của bạn hoàn hảo: Chỉ hôm qua, bản phát hành SDK mới ra mắt với hỗ trợ unique, permanent user IDs. Họ đáp ứng tất cả các tiêu chí bạn đã chỉ định.

+0

"Nếu người dùng hiện tại không đăng nhập, người xây dựng Người dùng sẽ tăng UserNotFoundError." - nghĩa là nó yêu cầu đăng nhập bằng Google. Tuy nhiên, tôi muốn nói rằng việc sử dụng cơ chế đăng nhập của Google là tốt hơn so với việc tự tạo tài khoản của riêng bạn, đặc biệt là đối với kỳ vọng của người dùng. – Mark

+1

Tuy nhiên, nó xảy ra với tôi rằng user_id có thể là duy nhất trên thế giới, điều đó sẽ không tốt. – Mark

+0

Điều này nghe có vẻ như đó là chính xác những gì tôi đang tìm kiếm. Tôi sử dụng đăng nhập bằng Google và một user_id duy nhất trên thế giới thực sự là một yêu cầu. Hoàn hảo. –

1

Bạn có nghĩa là session cookies?

Hãy thử http://code.google.com/p/gaeutilities/


gì DzinX nói. Cách duy nhất để tạo ra một khóa mờ có thể được xác thực mà không có một vòng lặp cơ sở dữ liệu đang sử dụng mã hóa hoặc một băm mật mã.

Cung cấp cho người dùng số ngẫu nhiên và băm hoặc mã hóa số đó bằng khóa riêng. Bạn vẫn chạy nguy cơ va chạm (nhỏ), nhưng bạn có thể tránh điều này bằng cách chạm vào cơ sở dữ liệu khi tạo khóa, thay đổi số ngẫu nhiên trong trường hợp va chạm. Đảm bảo rằng số ngẫu nhiên là mật mã và thêm một số ngẫu nhiên phía máy chủ dài để ngăn chặn các cuộc tấn công văn bản thuần túy đã chọn.

Bạn sẽ kết thúc bằng mã thông báo như khóa Google Documents, về cơ bản chữ ký chứng minh người dùng được xác thực, có thể được xác minh mà không cần chạm vào cơ sở dữ liệu.

Tuy nhiên, với giá của GAE và tốc độ của bigtable, có lẽ bạn nên sử dụng ID phiên nếu bạn thực sự không thể sử dụng xác thực của riêng Google.

+0

Không, tôi không có nghĩa là cookie phiên. GAE đã cung cấp điều đó để theo dõi người dùng đã đăng nhập. Câu hỏi của tôi đề cập cụ thể với người dùng ẩn danh và tương tác của họ với nội dung được liên kết với người dùng đã đăng ký. –

+0

Đề xuất của tôi là sử dụng gaeutilities cho người dùng không đăng nhập. – Mark

+0

người dùng không đăng nhập tương tác với ứng dụng theo cách hoàn toàn không quốc tịch, vì vậy điều đó không thực sự áp dụng được. Cảm ơn con trỏ, mặc dù - nó trông giống như một thư viện tiện dụng. –

3

Tôi nghĩ bạn nên phân biệt giữa hai loại người dùng:

1) người dùng đã đăng nhập thông qua tài khoản Google hoặc đã đăng ký trên trang web của bạn với một-google không địa chỉ e-mail

2) người dùng đã mở trang web của bạn lần đầu tiên và không đăng nhập bằng bất kỳ cách nào

Đối với trường hợp thứ hai, tôi không thể tìm cách nào khác để tạo chuỗi ngẫu nhiên (ví dụ: qua uuid.uuid4() hoặc từ cookie phiên của người dùng này), với tư cách là một người dùng ẩn danh không mang theo bất kỳ thông tin độc đáo nào với chính mình.

Đối với người dùng đã đăng nhập, tuy nhiên, bạn đã có số nhận dạng duy nhất - địa chỉ email của họ. Tôi đồng ý với các mối quan tâm về quyền riêng tư của bạn - bạn không nên sử dụng nó làm định danh. Thay vào đó, cách tạo chuỗi có số có vẻ như là ngẫu nhiên, nhưng thực tế được tạo từ địa chỉ email? Chức năng băm là hoàn hảo cho mục đích này. Ví dụ:

>>> import hashlib 

>>> email = '[email protected]' 
>>> salt = 'SomeLongStringThatWillBeAppendedToEachEmail' 

>>> key = hashlib.sha1('%s$%s' % (email, salt)).hexdigest() 
>>> print key 
f6cd3459f9a39c97635c652884b3e328f05be0f7 

Như hashlib.sha1 không phải là một hàm ngẫu nhiên, nhưng đối với trao trả về dữ liệu luôn luôn là kết quả tương tự, nhưng nó được chứng minh là thực tế không thể đảo ngược, bạn có thể trình bày một cách an toàn khóa băm trên trang web mà không ảnh hưởng của người sử dụng e -địa chỉ thư điện tử. Ngoài ra, bạn có thể giả định một cách an toàn rằng không có hai băm e-mail riêng biệt sẽ giống nhau (chúng có thể, nhưng xác suất xảy ra là rất, rất nhỏ). Để biết thêm thông tin về chức năng băm, tham khảo the Wikipedia entry.

+0

Tôi coi là băm, và nó sẽ không mua cho tôi nhiều do khả năng va chạm (rất khó, nhưng một chương trình mạnh mẽ nên kiểm tra nó) Tôi vẫn cần một vòng để cơ sở dữ liệu, tại thời điểm đó tôi cũng có thể tạo ra một ID ngẫu nhiên và kiểm tra điều đó. Đó là chính xác những gì tôi đã cố gắng để tránh. Đối với người dùng chưa được xác thực, họ không thể tạo nội dung, do đó, đó không phải là vấn đề. –