2014-02-14 11 views
5

In meinem C# -Projekt haben APIKeys.cs Datei, die Const Strings mit API-Schlüssel haben. Ich möchte, dass diese Zeichenfolgen im Git-Server leer sind, aber tatsächliche API-Schlüssel in meinem lokalen Computer haben. So können Leute, die Projekt ziehen, es ohne Problem kompilieren und noch mein lokaler Computer wird API-Schlüssel in der gleichen Datei haben.Proper Weg zum verstecken API Schlüssel in Git

Wenn ich versuche, APIKeys.cs Datei mit leeren Zeichenfolgen zu laden, dann kann ich nicht lokale Datei mit API-Schlüssel haben, weil, wenn ich versuche, es zu schieben, wird leere APIKeys.cs-Datei zu überschreiben. Auch ich kann diese Datei nicht ignorieren, da sie die leere Datei APIKeys.cs vom Git-Server entfernt.

Also was ist der beste automatisierte Ansatz für dieses Problem, der eine Klassendatei mit leeren Strings im Server erlaubt, so dass das Projekt kompilierbar ist, wenn Leute es ziehen und eine echte Klassendatei im lokalen Computer haben?

+0

Leider gibt es keine automatische Möglichkeit, dies zu tun (die ich kenne). Möglicherweise müssen Sie die Datei bei jedem Commit einfach aus dem Staging-Bereich entfernen. –

Antwort

7

Ich dachte, jetzt eine andere Lösung, die nicht perfekt ist, aber immer noch gut genug für mich, Beispiel:

APIKeys.cs Datei:

public static partial class APIKeys 
{ 
    public static readonly string ImgurClientID = ""; 
    public static readonly string ImgurClientSecret = ""; 
    public static readonly string GoogleClientID = ""; 
    public static readonly string GoogleClientSecret = ""; 
    public static readonly string PastebinKey = ""; 
    ... 
} 

APIKeysLocal.cs Datei:

public static partial class APIKeys 
{ 
    static APIKeys() 
    { 
     ImgurClientID = "1234567890"; 
     ImgurClientSecret = "1234567890"; 
     GoogleClientID = "1234567890"; 
     GoogleClientSecret = "1234567890"; 
     PastebinKey = "1234567890"; 
     ... 
    } 
} 

Ignorieren APIKeysLocal.cs Datei in Git und Leute, die diese Datei nicht haben, können trotzdem ein Projekt kompilieren, wenn sie diese Datei aus der Lösung exp entfernen lorer.

auch erstelle ich automatisch leer APIKeysLocal.cs Datei, wenn es nicht bereits Projekt mit existiert Ereignis vor bauen:

cd $(ProjectDir)APIKeys\ 

if not exist APIKeysLocal.cs (
    type nul > APIKeysLocal.cs 
) 

Auf diese Weise Benutzer etwas tun müssen, nicht in der Lage sein Projekt zu kompilieren.

9

Akzeptieren Sie, dass Sie unverschlüsselte private Schlüssel in einem öffentlichen Bereich nicht verbergen können.

Sie können die Schlüssel in ein privates Leerzeichen verschieben und dann auf dieses private Leerzeichen aus dem Code verweisen.

Ihr privater Bereich könnte Umgebungsvariablen oder die Windows-Registrierung sein, sollte es etwas außerhalb des Quellcodes Ihrer App sein.

Ein anderer Ansatz besteht darin, eine neue Konfigurationsdatei (z. B. keys.config) speziell zum Speichern privater Schlüssel zu erstellen und diese Datei dann aus der Quellcodeverwaltung auszuschließen.

Das heißt, Sie Ihre privaten Schlüssel nicht teilen, aber es bedeutet auch, dass Sie (vielleicht in readme.md) dokumentieren müssen, dass die Benutzer ihre eigenen keys.config neu erstellen benötigen. Noch besser (danke @Joey) ist eine Beispiel-Konfigurationsdatei (keys.sample.config) in die Lösung aufzunehmen, die zeigt, was benötigt wird.

Here is an example

+2

Normalerweise benutze ich die config file-Methode und füge ein 'foo.config.sample' in die Quellcodeverwaltung ein, das dann in' foo.config' kopiert werden kann, wo die eigentlichen Schlüssel oder Passwörter oder entwicklerspezifische Einstellungen liegen und auch von ignoriert werden Quellcodeverwaltung. – Joey

+0

Eine leere keys.config ist eine schlechte Idee, da Änderungen unveränderlich ihren Weg in die Quellcodeverwaltung finden werden :-). Die tatsächliche Konfiguration sollte nicht immer eingecheckt werden. – Joey

+0

Ich weiß, dass ich Schlüssel nicht verstecken kann, aber API-Dienstbesitzer haben Regel, Schlüssel in der Öffentlichkeit nicht so zu teilen, sogar wenn es sehr leicht ist, sie zu dekompilieren und sie in C# -Anwendung noch zu sehen muss ich mich verstecken sie in Git. Ich denke nicht, 30 verschiedene Uploader-API-Schlüssel in der Registrierung zu speichern, ist eine gute Idee. – Jaex

3

Sie haben zwei Möglichkeiten bekommen:

  1. Git Sagen Sie Änderungen an APIKeys.cs auf dem lokalen Computer zu ignorieren:

    git update-index --skip-worktree APIKeys.cs 
    

    lokale Änderungen Dies führt dazu, nicht zu bekommen engagiert sein. Wenn Sie jemals tun Änderungen an der Datei festschreiben wollen, müssen Sie dies mit dem --no-skip-worktree Flag rückgängig machen.

  2. Benennen Sie die Datei APIKeys.cs um so etwas wie APIKeys.template.cs, die leeren Zeichenketten enthalten, die Sie teilen möchten. Bewahren Sie diese Datei in Ihrem Repository auf. Kopieren Sie diese Datei in APIKeys.cs. Fügen Sie APIKeys.cs zu Ihrem .gitignore hinzu. Fügen Sie Anweisungen hinzu, um die Vorlagendatei zu kopieren und mit lokalen Einstellungen zu ändern.

    git mv APIKeys.cs APIKeys.template.cs 
    $EDITOR APIKeys.template.cs 
    git commit 
    cat APIKeys.cs >> .gitignore 
    cp APIKeys.template.cs APIKeys.cs 
    
+0

Ich habe versucht-unverändert und es funktioniert perfekt. Wenn ich ziehe, überschreiben Git meine API-Schlüssel-Datei nicht mit leeren und ich kann nicht meine API-Schlüssel an den Server drücken, um leere Datei zu überschreiben, so ist es genau das, was ich will. Aber wenn ein Entwickler vergisst, anzunehmen-unverändert, dann kann diese Person versehentlich api-Tasten drücken, was ein Problem ist. Aber ich glaube nicht, dass ich eine bessere Lösung finden kann als angenommen - unverändert. – Jaex

+0

@ Jaex, ja, das ist ein echtes Risiko mit '--assume-unverändert'. Die andere Methode, die ich vorgeschlagen habe, ist [http://stackoverflow.com/a/21775224/354577] von [Ed Guiness] (http://stackoverflow.com/users/4200/ed-guiness) und [ Joey] (http://stackoverflow.com/users/73070/73070), ist eigentlich mein bevorzugter Ansatz. – Chris

1

Ist das nicht sehr ähnlich dem Problem, eine Build-Nummer in Ihrer Komponente der Injektion? Die Art, wie ich das mache, ist ein Pre-Build-Schritt, der basierend auf einer Umgebungsvariablen eine Datei namens AssemblyVersionInfo.cs generiert. Sie könnten dasselbe mit Ihren API Keys machen.

In der Pre-Build-Schritt für die Komponente, die in den API-Schlüssel erstellt setzen etwas wie folgt aus: -

if not defined API_KEY set API_KEY=DEFAULT_KEY 
echo public class ApiKeys>"$(SolutionDir)src\ApiKeys.cs" 
echo {>>"$(SolutionDir)src\ApiKeys.cs" 
echo public const string Key="%API_KEY%";>>"$(SolutionDir)src\ApiKeys.cs" 
echo }>>"$(SolutionDir)src\ApiKeys.cs" 

Dann setzen Sie entweder ein Benutzer oder Systemumgebungsvariable auf dem lokalen Computer mit der realen Schlüssel drin.

setx API_KEY THE_REAL_KEY

Um zu vermeiden, Git wollen die Datei einzuspielen, nur um es zu dem .gitignore hinzuzufügen.