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

Sau*_*nda 1 monads haskell yesod

我希望我的应用程序的客户端ID和密码ID不属于我的源代码.因此,如果我在运行时从环境变量中读取这些设置,它们将始终包含在IO中.这会导致问题,因为他们将无法撰写:

authPlugins :: master -> [AuthPlugin master]
authGoogleEmail :: YesodAuth m => Text -> Text -> AuthPlugin m
getEnv :: String -> IO String
Run Code Online (Sandbox Code Playgroud)

提出这个问题的另一种方法是:如何在http://www.yesodweb.com/book/authentication-and-authorization中给出的第一个示例代码中读取clientIdclientSecret从环境中读取

Eri*_*ikR 5

没有测试,但这应该工作:完整示例:http://lpaste.net/167997

  1. 在您的App记录中添加客户端ID和密码的字段:

    data App = App { ...
                   , gmailClientId :: Text
                   , gmailClientSecret :: Text
                   }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 修改authPlugins方法以从App记录中查找客户端ID和机密值:

    instance YesodAuth App where
      ...
      authPlugins app = [ ...
                        , authGoogleEmail (gmailClientId app)  (gmailClientSecret app)
                        ]
    
    Run Code Online (Sandbox Code Playgroud)
  3. main在调用之前初始化App记录warp:

    main = do
      clientId <- getEnv "CLIENT_ID"
      clientSecret <- getEnv "CLIENT_SECRET"
      ...
      let app = App { ..., gmailClientId = clientId, gmailClientSecret = clientSecret }
      warp 3000 app
    
    Run Code Online (Sandbox Code Playgroud)