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中给出的第一个示例代码中读取clientId和clientSecret从环境中读取
没有测试,但这应该工作:完整示例:http://lpaste.net/167997
在您的App记录中添加客户端ID和密码的字段:
data App = App { ...
, gmailClientId :: Text
, gmailClientSecret :: Text
}
Run Code Online (Sandbox Code Playgroud)修改authPlugins方法以从App记录中查找客户端ID和机密值:
instance YesodAuth App where
...
authPlugins app = [ ...
, authGoogleEmail (gmailClientId app) (gmailClientSecret app)
]
Run Code Online (Sandbox Code Playgroud)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)