最近,Google禁止嵌入式浏览器身份验证,以支持Loopback IP方法
我的站点具有一个桌面客户端,该客户端使用与该站点相同的登录系统。基本上,我将嵌入式浏览器视图弹出到我的网站上,并在登录完成后获取Cookie。然后,我的网站的auth cookie被桌面客户端用于API访问。
现在Google禁止使用嵌入式浏览器,为此我需要一种新方法(如果我想维护Google外部登录名)。
如果我理解正确,那么新过程将类似于
1.桌面客户端收听localhost::port
2.桌面客户端启动Url进入网站的登录页面,并打开用户的默认浏览器
3.用户使用自己喜欢的浏览器登录网站
4. Web服务器检测到登录成功,并以某种方式将带有身份验证令牌的重定向发送到localhost::port
5.桌面客户端从本地主机读取令牌
但是,如果重定向URL是localhost,如何显示登录成功页面以指示用户关闭浏览器并返回桌面应用程序?我应该如何在服务器和桌面客户端上实现此功能?
答案 0 :(得分:0)
找到了两种方法。一种是使用TcpListener
并绑定到回送IP。响应以流的形式返回,您需要进一步对其进行解析以获取所需的数据,这是一个巨大的痛苦。
另一种方法是使用HttpListener
using (HttpListener listener = new HttpListener())
{
listener.Prefixes.Add("http://localhost:{port}/"); //Only listen to this particular address
listener.Start();
//blocking call. Feel free to use async version
HttpListenerContext context = listener.GetContext();
HttpListenerRequest request = context.Request;
HttpListenerResponse response = context.Response;
//Here is the response url. The token should be inside url query param.
Console.WriteLine(request.Url);
//redirects user back to your site and show a login success screen
response.Redirect("{yourdomain}/loginsuccess");
//Important! call close to send out the response
response.Close();
//Important! If listener is stopped before response is sent out then it will abort.
Thread.Sleep(1000);
listener.Stop();
}
在服务器端,只需在登录完成后将用户重定向到http://localhost:{port}/?token=xxxx
。
使用此方法,用户甚至都不会注意到我们已将他/她温和地重定向到了本地主机。浏览器的URL会一直显示您网站的域。