Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';无法从docker容器打开URL_Docker_Asp.net Core_Google Calendar Api_Google Oauth - Fatal编程技术网

Can';无法从docker容器打开URL

Can';无法从docker容器打开URL,docker,asp.net-core,google-calendar-api,google-oauth,Docker,Asp.net Core,Google Calendar Api,Google Oauth,从docker容器导航到Google身份验证页面时遇到问题。该应用程序使用asp.net Core 2.0制作,其目的是显示从Google日历API检索到的即将到来的事件,并在需要时创建事件 当应用程序不是从docker容器运行时,它会按预期工作, 授权码请求URL是根据环境(Windows、Linux或OSX)生成的,应用程序尝试使用OpenBrowser方法中的Process.start()打开URL private bool OpenBrowser(string url) {

从docker容器导航到Google身份验证页面时遇到问题。该应用程序使用asp.net Core 2.0制作,其目的是显示从Google日历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帐户凭据并登录以接收用于创建令牌的授权代码

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;
        }
    }
public async Task ReceiveCodeAsync(AuthorizationCodeRequestUrl url,CancellationToken Task CancellationToken)
{
var authorizationUrl=url.Build().AbsoluteUri;
使用(var listener=StartListener())
{
布尔·布劳瑟罗佩诺;
尝试
{
browserOpenOk=OpenBrowser(授权URL);
}
捕获(例外e)
{
Logger.Error(e,“无法启动带有\“{0}\”用于授权的浏览器”,authorizationUrl);
抛出新的NotSupportedException(String.Format(“无法使用\“{0}\”启动浏览器进行授权。有关详细信息,请参阅内部异常。”,authorizationUrl,e));
}
var ret=await GetResponseFromListener(listener,taskCancellationToken);
s_receivedCallback=真;
返回ret;
}
}
我猜想linux docker容器没有必要的工具来打开URL,这就是问题的原因。我的问题是,有人能告诉我如何将URL转发到主机而不是容器中打开,或者如何在不尝试从docker容器中打开URL的情况下获取令牌


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

我在编写python脚本并将其打包到docker映像中时遇到了同样的问题。 我找到的唯一解决方案是在参数
noauth\u local\u 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,您可以将其复制到任何web浏览器中,并且在身份验证之后,它会生成一个代码,您需要将其复制到终端中。

我在编写python脚本并将其打包到docker映像中时遇到了同样的问题。 我找到的唯一解决方案是在参数
noauth\u local\u 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,您可以将其复制到任何web浏览器中,并在验证后生成一个代码,您需要将该代码复制到终端中