2016-06-25 26 views
1

Ich möchte, dass die Client-ID und die geheime ID meiner Anwendung NICHT Teil meines Quellcodes sind. Wenn ich diese Einstellungen während der Laufzeit von Umgebungsvariablen lese, werden sie daher immer in IO eingebettet. Dies führt zu einem Problem, denn dann werden sie komponieren fehlschlagen:Wie wird Google OAuth mit Client-ID und geheimen Umgebungsvariablen konfiguriert?

authPlugins :: master -> [AuthPlugin master] 
authGoogleEmail :: YesodAuth m => Text -> Text -> AuthPlugin m 
getEnv :: String -> IO String 

Eine andere Möglichkeit, diese Frage zu stellen: Wie clientId und clientSecret aus der Umgebung in dem ersten Beispiel-Code bei http://www.yesodweb.com/book/authentication-and-authorization

Antwort

5

lesen gegeben Nicht getestet, aber dies sollte funktionieren: Voll Beispiel: http://lpaste.net/167997

  1. hinzufügen Felder in Ihrem App-Eintrag für das Client-ID und Geheimnis:

    data App = App { ... 
           , gmailClientId :: Text 
           , gmailClientSecret :: Text 
           } 
    
  2. ändern Sie die authPlugins Methode, um die Client-ID und geheime Werte aus dem App Datensatz suchen:

    instance YesodAuth App where 
        ... 
        authPlugins app = [ ... 
            , authGoogleEmail (gmailClientId app) (gmailClientSecret app) 
            ] 
    
  3. den Rekord App initialisieren in main vor warp Aufruf:

    main = do 
        clientId <- getEnv "CLIENT_ID" 
        clientSecret <- getEnv "CLIENT_SECRET" 
        ... 
        let app = App { ..., gmailClientId = clientId, gmailClientSecret = clientSecret } 
        warp 3000 app 
    
+0

Danke, das funktioniert. Ich wusste nicht, dass man den Record-Typ "App" für solche Sachen verwenden könnte. –