首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法从停靠容器打开URL

问无法从停靠容器打开URL
EN

Stack Overflow用户
提问于 2017-11-06 21:20:14
回答 1查看 1.6K关注 0票数 2

我在从docker容器导航到Google身份验证页面时遇到了问题。该应用程序是使用asp.net核心2.0制作的,它的目的是显示从Google Calendar API检索到的即将到来的事件,还可以在需要时创建事件。

当应用程序不是从docker容器运行时,它会按预期工作,生成授权码请求网址,并根据环境(Windows,Linux或OSX),应用程序尝试在OpenBrowser方法中使用Process.start()打开网址。

代码语言:javascript
复制
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帐户凭据并登录,以获得用于创建令牌的授权码。

代码语言:javascript
复制
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的情况下获得令牌?

Google默认使用这种方式对用户进行身份验证(通过使用Process.start打开url ),并且还会打开随机端口来监听身份验证响应码,因此我必须创建自己的实现docker的类,因为docker需要在容器内运行镜像之前指定确切的端口。

EN

回答 1

Stack Overflow用户

发布于 2018-06-15 16:40:08

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

以下是python中的示例代码:

代码语言:javascript
复制
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浏览器中,并且在身份验证之后,它会生成一个您需要复制到终端中的代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47137948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档