gpt4 book ai didi

docker - 无法从Docker容器打开URL

转载 作者:行者123 更新时间:2023-12-02 20:10:08 24 4
gpt4 key购买 nike

我无法从Docker容器导航到Google身份验证页面。该应用程序是使用asp.net Core 2.0制作的,其目的是显示从Google Calendar API检索到的即将发生的事件,并在需要时创建事件。

该应用未从Docker容器运行时可按预期工作,
会生成授权码请求URL,并且基于环境(Windows,Linux或OSX),应用程序尝试使用OpenBrowser方法中的Process.start()打开URL。

private bool OpenBrowser(string url)
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
url = System.Text.RegularExpressions.Regex.Replace(url, @"(\\*)" + "\"", @"$1$1\" + "\"");
url = System.Text.RegularExpressions.Regex.Replace(url, @"(\\+)$", @"$1$1");
Process.Start(new ProcessStartInfo("cmd", $"/c start \"\" \"{url}\"") { CreateNoWindow = true });
return true;
}
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
Process.Start("xdg-open", url);
return true;
}
if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
{
Process.Start("open", url);
return true;
}
return false;
}

成功打开浏览器后,用户需要输入其Google帐户凭据并登录以接收用于创建 token 的授权代码。
public async Task<AuthorizationCodeResponseUrl> ReceiveCodeAsync(AuthorizationCodeRequestUrl url, CancellationToken taskCancellationToken)
{
var authorizationUrl = url.Build().AbsoluteUri;
using (var listener = StartListener())
{
bool browserOpenOk;
try
{
browserOpenOk = OpenBrowser(authorizationUrl);
}
catch (Exception e)
{
Logger.Error(e, "Failed to launch browser with \"{0}\" for authorization", authorizationUrl);
throw new NotSupportedException(String.Format("Failed to launch browser with \"{0}\" for authorization. See inner exception for details.", authorizationUrl, e));
}
var ret = await GetResponseFromListener(listener, taskCancellationToken).ConfigureAwait(false);

s_receivedCallback = true;

return ret;
}
}

我的猜测是linux docker容器没有打开URL所必需的工具,这就是问题所在。我的问题是,有人可以告诉我如何转发要在主机上而不是在容器内打开的URL,或者如何在不尝试从docker容器打开URL的情况下获取 token ?

Google默认情况下使用身份验证方式(通过使用Process.start打开url),并且还打开随机端口以侦听身份验证响应代码,因此我必须创建自己的类来实现ICodeReceiver,因为docker要求确切的端口为在容器内运行图像之前指定。

最佳答案

我在编写python脚本并将其打包到docker镜像时遇到了同样的问题。
我发现的唯一解决方案是将以下行添加到参数noauth_local_webserver = True中。

这是python中的示例代码:

if not creds or creds.invalid:
flow = client.flow_from_clientsecrets('.client_secret.json', SCOPES)
args = tools.argparser.parse_args()
args.noauth_local_webserver = True
creds = tools.run_flow(flow, store, args)
service = build('sheets', 'v4', http=creds.authorize(Http()))
else:
service = build('sheets', 'v4', http=creds.authorize(Http()))

使用该选项,它将打印一个URL,您可以将该URL复制到任何Web浏览器中,并且在身份验证之后,它会生成一个需要复制到终端中的代码。

关于docker - 无法从Docker容器打开URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47137948/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com