2016-02-09 47 views
5

Tôi hiện đang viết một ứng dụng dòng lệnh NodeJS. Ứng dụng thực hiện cuộc gọi API và trả về một số dữ liệu cho người dùng. Do đây là API công khai, người dùng yêu cầu mã thông báo API. CLI này sẽ được cài đặt trên toàn cầu trên máy của người dùng qua npm i -g super-cool-api-cli.Lưu trữ dữ liệu an toàn trong ứng dụng Node CLI

Lần đầu tiên người dùng chạy CLI, họ được nhắc mã thông báo và sau đó tôi lưu trữ để mỗi lần sau họ chạy nó, họ không cần phải nhập nó. Tôi đã cung cấp cho người dùng một cách để thiết lập lại nó là tốt. Tôi đang lưu trữ nó trong thư mục thực tế của mô-đun CLI của tôi, mà như đã nêu được cài đặt trên toàn thế giới, và nó trông giống như sau:

fs.writeFile(__dirname+'/.token.json', JSON.stringify({ "token": token }, null, 2), 'utf8', (e)=>{ 
    // error handling and whatever 
}); 

Tôi đặt tên cho tập tin .token.json, sử dụng một dấu chấm để ít nhất làm cho các tập tin ẩn theo mặc định.

Tôi đoán những gì tôi yêu cầu là nếu có một cách an toàn hơn/an toàn hơn để lưu trữ thông tin nhạy cảm trong ứng dụng dòng lệnh NodeJS, bạn sẽ chạy nhiều lần. Tôi nghĩ về việc sử dụng những thứ như environment variables nhưng chúng dường như hết hạn vào cuối quá trình.

Cân nhắc bảo mật là một kỹ năng mà tôi phần nào thiếu, nhưng rất mong muốn tìm hiểu thêm về, vì vậy cảm ơn trước vì lời khuyên của bạn.

+0

Tôi cần phải làm một điều tương tự như bạn với ứng dụng CLI nút của tôi. Tôi nhận thấy bạn không chấp nhận bất kỳ câu trả lời nào, cuối cùng bạn đã làm gì? Cảm ơn! –

+0

@JoshPinter Chúng tôi đã kết thúc bằng cách sử dụng một mô-đun gọi là [buttercup] (https://buttercup.pw/) để lưu trữ dữ liệu đằng sau một mật khẩu. [Có rất ít tranh luận] (https://github.com/himynameisdave/git-labelmaker/issues/14) về nó vì nó có vẻ đơn giản. Dự án là [ở đây] (https://github.com/himynameisdave/git-labelmaker) và có rất nhiều người dùng hoạt động, vì vậy giải pháp này dường như đã làm việc tốt cho chúng tôi :) –

+0

Thú vị ... cảm ơn vì đã phản hồi lại ! Buttercup trông giống như một thay thế 1Password tốt đẹp. Không nghĩ đến việc sử dụng cốt lõi để lưu trữ mật khẩu. Chúc mừng! –

Trả lời

1

Bạn có thể lưu trữ thẻ của bạn trong SQLite, và đặt tên người dùng/mật khẩu cho các tập tin sqlite.db, sau đây là các ràng buộc cho sqlite https://github.com/mapbox/node-sqlite3

+0

Vì vậy, tôi vẫn sẽ cần người dùng địa phương có một tên người dùng/mật khẩu tập tin nhạy cảm phải không? Tôi xin lỗi tôi thường là một người đàn ông front-end để DB/công cụ bảo mật này là một chút trên đầu của tôi ... –

+0

@ DaveLunny không phải lo lắng. Có, bạn vẫn sẽ cần người dùng nhập tên người dùng và mật khẩu, nhưng mã thông báo được lưu trữ sẽ được an toàn và được mã hóa trên hệ thống tệp (mà tôi nghĩ là vấn đề bảo mật). Đối với CLI, bạn có thể mã hóa bộ nhớ cache cho mỗi phiên (trong bộ nhớ, không phải hệ thống tệp) của tên người dùng/mật khẩu để người dùng chỉ phải nhập tên người dùng và mật khẩu một lần mỗi phiên (trên cửa sổ CLI/terminal). Tức là, người dùng sẽ chỉ phải đặt tên người dùng và mật khẩu vào lần đầu tiên mở terminal và chạy ứng dụng CLI. –

+0

Hmm khá tốt nhưng tôi không thực sự thích nó chỉ được lưu trữ trong một phiên. Điều đó sẽ làm cho nó ít thân thiện với người dùng hơn nhưng rõ ràng là giải quyết vấn đề mã thông báo không được mã hóa chỉ được lưu trữ dưới dạng tệp JSON và ghi nhớ tên người dùng/mật khẩu vẫn tốt hơn ghi nhớ/sao chép + dán toàn bộ mã thông báo mỗi lần. Sẽ xem xét thêm vào giải pháp này, cảm ơn! –

4

Tôi nghĩ đó là tốt nhất để sử dụng các cơ sở lưu trữ chứng chỉ được cung cấp bởi hệ điều hành cho loại điều này, giả sử tất nhiên là mỗi người dùng có tài khoản riêng của họ trên máy. Gói NPM duy nhất tôi biết rằng xử lý đó là node-keytar.

+0

Âm thanh khá hợp pháp thực sự, cảm ơn! Vì vậy, về cơ bản tôi sẽ tạo một "dịch vụ" mới trên móc khóa cho ứng dụng của tôi, nơi tôi có thể lưu mã thông báo dưới dạng mật khẩu? –

+0

Vâng, đó là ý tưởng. –

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