2012-01-21 2 views
9

Tôi quan tâm đến cách tốt nhất để thực hiện xác thực người dùng trong ứng dụng dành cho thiết bị di động. Tại thời điểm thiết lập khá đơn giản. Tôi đang lưu trữ tên người dùng và mật khẩu trên ứng dụng và gửi nó đến api mỗi khi tôi cần chạy truy vấn bị hạn chế.Cách đặt xác thực người dùng vào ứng dụng di động

Điều này tôi cảm thấy có lẽ là sai lầm khi đi về điều này.

Có cách nào tốt hơn để gửi tên người dùng và mật khẩu khi người dùng đăng nhập và sau đó lưu trữ id của người dùng đó? Vấn đề với điều này là sau đó api chấp nhận một id người dùng và không phải là một tên người dùng và mật khẩu. Một id người dùng sẽ dễ dàng hơn nhiều để "đoán" tại và những người độc hại sẽ có thể gửi một req để api với hành động thực hiện id người dùng được lựa chọn ngẫu nhiên trong tài khoản của họ. Tôi có một chìa khóa api. Điều này có đủ an toàn không?

Vấn đề là tôi muốn bắt đầu tích hợp twitter và facebook oauth vào ứng dụng. Tôi đã không đọc nhiều về nó, nhưng tôi nghĩ bạn nhận được một "mã thông báo". Làm thế nào điều này sẽ làm việc với các thiết lập mà bạn đang đề xuất? Sẽ có lợi ích khi tạo một mã thông báo trong cơ sở dữ liệu của người dùng của tôi và sử dụng mã thông báo (cho dù đó là của tôi, của facebook hoặc twitter) làm ủy quyền? Hoặc sẽ có ý nghĩa để giữ riêng từng dịch vụ và giải quyết chúng một cách riêng biệt?

Cảm ơn bạn.

Trả lời

8

Cách chính xác sẽ là tạo mã thông báo xác thực trên máy chủ khi người dùng đăng nhập và gửi mã thông báo này trong trả lời đăng nhập. Sau đó, mã thông báo này được sử dụng trong các yêu cầu tiếp theo.

Điều này có nghĩa là máy chủ phải theo dõi mã thông báo auth mà nó tạo. Bạn cũng có thể theo dõi thời gian tạo mã thông báo và làm cho mã thông báo hết hạn sau một thời gian.

Mã thông báo phải là chuỗi ngẫu nhiên đủ dài để không thể dễ dàng đoán được. Cách thực hiện việc này đã được trả lời trước: How to generate a random alpha-numeric string?

Cá nhân tôi thích phương pháp tiếp cận UUID.

Cập nhật:

Vấn đề này đã được giải quyết trong các trình duyệt web, thông qua các tập tin cookie và các buổi. Bạn có thể sử dụng lại cơ chế này trong các yêu cầu Android của mình (mặc dù một số người thuần túy REST bác bỏ phương pháp này):

  1. Bật phiên trên máy chủ.

  2. Khi người dùng đăng nhập vào một máy chủ thêm một số dữ liệu vào phiên giao dịch, thời gian thể hiện của đăng nhập:

    request.getSession().setAttribute("timeOfLogin", System.currentTimeMillis()); 
    
  3. Kể từ phiên được bật, bạn cũng cần phải kích hoạt hỗ trợ cho các tập tin cookie trong HttpClient yêu cầu của bạn: Using Cookies across Activities when using HttpClient

  4. Mỗi lần yêu cầu được thực hiện, máy chủ sẽ kiểm tra xem phiên có chứa thuộc tính timeOfLogin hay không. Nếu không, nó sẽ trả về trả lời HTTP 401.

  5. Khi người dùng đăng xuất, hãy gọi url đăng xuất của máy chủ và xóa cookie trên ứng dụng khách.

+0

Ok, do đó, tạo mã thông báo là cách để thực hiện. Ác! :) Cảm ơn –