在Yesod中使用BrowserId
创建和验证用户。
我还没有改变脚手架网站的身份验证代码。我在Foundation.hs
中阅读以下内容表明,当用户使用browserId进行身份验证时,会创建一个新用户。
getAuthId creds = runDB $ do
x <- getBy $ UniqueUser $ credsIdent creds
case x of
Just (Entity uid _) -> return $ Just uid
Nothing -> Just <$> insert User
{ userIdent = credsIdent creds
, userPassword = Nothing
}
但是当我使用BrowserId / Persona进行身份验证时,我收到一个包含以下错误消息的页面:
TlsException (HandshakeFailed (Error_Protocol ("certificate rejected: [SelfSigned]",True,CertificateUnknown)))
我无法找到生成此文件的文件。起初我认为通过https服务网站可能会解决它,但我现在已经实施了https,但它并没有。我使用的是签名的CA证书。
对现有用户进行身份验证时,应对其进行签名。对以前未知的用户进行身份验证应添加它们。
任何人都可以了解我错过的内容吗?
tls-retreivecertificate
输出正在运行tls-retrievecertificate mydomain.com 443 --verify --chain
表示我的网站正在返回其证书,签名机构已成功返回,但导致UnknownCA
失败。
正在运行tls-retrievecertificate twitter.com 443 --verify --chain
会显示证书和UnknownCA
。
因此我认为这里的问题出在运行我的Yesod应用程序的机器上或我的代理设置中,而不是我在运行Web服务器的机器上安装证书的方式(两者都是Docker容器所以我和# 39; m使用&#39;机器&#39;广泛地说。我正在寻找一个解决方案,如果找到它就会发一个。与此同时,所有的帮助都感激不尽。我的Nginx设置如下:
# see http://serverfault.com/questions/577370/how-can-i-use-environment-variables-in-nginx-conf#comment730384_577370
upstream localhost {
server api_1:3000;
}
server {
listen 80;
listen [::]:80;
server_name example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 default_server ssl;
server_name example.com;
ssl on;
ssl_certificate /etc/nginx/ssl.cert;
ssl_certificate_key /etc/nginx/ssl.dkey;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://localhost;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
}
}
答案 0 :(得分:0)
原来这是一个Docker问题,而不是Yesod问题。运行应用程序的Docker容器没有可信证书,所以我只是重建它并ADD
编辑来自主机的那些证书。问题解决了。