2016-02-09 7 views
5

Ich schreibe gerade eine NodeJS-Befehlszeilen-App. Die App führt einen API-Aufruf aus und gibt einige Daten an den Benutzer zurück. Da es sich um eine öffentliche API handelt, benötigt der Benutzer ein API-Token. Diese CLI wird global auf dem Computer des Benutzers über npm i -g super-cool-api-cli installiert.Daten sicher in einer Node CLI-App speichern

Wenn der Benutzer das CLI zum ersten Mal ausführt, werden sie zur Eingabe des Tokens aufgefordert, und dann speichere ich sie, damit sie bei jeder weiteren Ausführung nicht mehr eingefügt werden müssen. Ich habe dem Benutzer eine Möglichkeit zur Verfügung gestellt setze es ebenfalls zurück. Ich bin zu speichern es im aktuellen Verzeichnis meines CLI-Modul, das als global installiert angegeben ist, und es sieht etwa so aus:

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

ich die Datei benennen .token.json, mindestens einen Punkt mit, um die Datei machen versteckt standardmäßig.

Ich denke, ich frage, ob es eine bessere/sicherere Möglichkeit gibt, vertrauliche Informationen in einer NodeJS-Befehlszeilen-App zu speichern, die Sie mehr als einmal ausführen würden. Ich dachte über Dinge wie environment variables, aber sie scheinen am Ende des Prozesses ablaufen.

Sicherheitsüberlegungen sind eine Fähigkeit, die ich etwas fehlt, aber sehr gerne mehr darüber erfahren, so vielen Dank im Voraus für Ihre Tipps.

+0

Ich muss eine ähnliche Sache wie Sie mit meiner Knoten CLI App tun. Ich habe bemerkt, dass du keine Antwort akzeptierst. Was hast du am Ende gemacht? Vielen Dank! –

+0

@JoshPinter Am Ende verwendeten wir ein Modul namens [buttercup] (https://buttercup.pw/), um Daten hinter einem Passwort zu speichern. [Es gab wenig Debatte] (https://github.com/himynameisdave/git-labelmaker/issues/14) darüber, weil es einfach schien. Das Projekt ist [hier] (https://github.com/himynameisdave/git-labelmaker) und hat viele aktive Benutzer, so scheint diese Lösung gut für uns gearbeitet zu haben :) –

+0

Interessant ... danke für die Rückmeldung ! Buttercup sieht wie ein schöner 1Password Ersatz aus. Ich habe nicht daran gedacht, den Kern auch zum Speichern von Passwörtern zu verwenden. Prost! –

Antwort

1

können Sie speichern Ihre Token in SQLite, und legen Sie einen Benutzernamen/Passwort für die sqlite.db Datei, hier sind die Bindungen für SQLite https://github.com/mapbox/node-sqlite3

+0

Also ich brauche immer noch den Benutzer lokal eine sensible Benutzername/Passwort-Datei richtig zu haben? Es tut mir leid, dass ich normalerweise ein Front-End-Typ bin, also ist dieses DB/Security-Zeug ein bisschen über meinem Kopf ... –

+0

@DaveLunny keine Sorgen. Ja, Sie würden den Benutzer trotzdem brauchen, um den Benutzernamen und das Passwort einzugeben, aber das gespeicherte Token ist sicher und verschlüsselt auf dem Dateisystem (was ich für das Sicherheitsproblem hielt). Für die CLI können Sie einen Cache pro Sitzung (im Speicher, nicht im Dateisystem) des Benutzernamens/Kennworts codieren, so dass der Benutzer den Benutzernamen und das Kennwort nur einmal pro Sitzung (im CLI/Terminalfenster) eingeben muss. Das heißt, der Benutzer müsste nur beim ersten Öffnen des Terminals einen Benutzernamen und ein Kennwort eingeben und die CLI-App ausführen. –

+0

Hmm, das ist ziemlich gut, aber ich mag es nicht wirklich, dass es nur für eine Sitzung gespeichert wird. Das wird es weniger benutzerfreundlich machen, aber das löst natürlich das Problem, dass ein unverschlüsseltes Token nur als JSON-Datei gespeichert wird, und das Erinnern an einen Benutzernamen/Passwort ist immer noch besser als das Erinnern/Kopieren und Einfügen eines ganzen Tokens. Werde mehr in diese Lösung schauen, danke! –

4

Ich denke, es am besten ist, die Anmeldeinformationen Lagermöglichkeiten durch das OS zu nutzen für diese Art von Dingen, natürlich vorausgesetzt, dass jeder Benutzer sein eigenes Konto auf der Maschine hat. Das einzige NPM-Paket, das ich kenne, ist das node-keytar.

+0

Klingt recht echt, danke! Also im Wesentlichen würde ich einen neuen "Service" am Schlüsselbund für meine App erstellen, wo ich den Token als Passwort speichern kann? –

+0

Ja, das ist die Idee. –