如何使用环境变量中的客户端 ID 和机密配置 Google OAuth?

How to configure Google OAuth with client ID and secret from environment variables?

我不希望我的应用程序的客户端 ID 和机密 ID 成为我的源代码的一部分。因此,如果我在运行时从环境变量中读取这些设置,它们将始终被包装在 IO 中。这会导致一个问题,因为那样他们将无法组合:

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

另一种提出这个问题的方法是:如何从 http://www.yesodweb.com/book/authentication-and-authorization

给出的第一个示例代码中的环境中读取 clientIdclientSecret

未测试,但这应该有效:完整示例:http://lpaste.net/167997

  1. 将客户端 ID 和机密的字段添加到您的应用程序记录中:

    data App = App { ...
                   , gmailClientId :: Text
                   , gmailClientSecret :: Text
                   }
    
  2. 修改authPlugins方法,从App记录中查找client id和secret值:

    instance YesodAuth App where
      ...
      authPlugins app = [ ...
                        , authGoogleEmail (gmailClientId app)  (gmailClientSecret app)
                        ]
    
  3. 在调用warp前初始化main中的App记录:

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