无法在 Docker 容器内从 Google API 交换 AccessToken

2024-03-03

我有一个用 Go 编写的网络应用程序,使用 oauth2 (包golang.org/x/oauth2)通过 Google 登录用户(按照本教程操作https://developers.google.com/identity/sign-in/web/server-side-flow https://developers.google.com/identity/sign-in/web/server-side-flow).

当我在本地测试应用程序时,它工作正常,但是当我部署应用程序并在 Docker 容器内运行时(基于alpine:latest,运行二进制文件),出现错误:Post https://accounts.google.com/o/oauth2/token: x509: certificate signed by unknown authority

这是我交换 accessToken 的代码:

ctx = context.Background()

config := &oauth2.Config{
    ClientID:     config.GoogleClientId,
    ClientSecret: config.GoogleClientSecret,
    RedirectURL:  config.GoogleLoginRedirectUrl,
    Endpoint:     google.Endpoint,
    Scopes:       []string{"email", "profile"},
}

accessToken, err := config.Exchange(ctx, req.Code)
if err != nil {
    log.Println(err.Error())   // Error here
}

该问题不是 Go 造成的,而是 Alpine 镜像造成的。

默认的 Alpine 镜像没有证书,因此应用程序无法调用 https 地址(本例为https://accounts.google.com/o/oauth2/token https://accounts.google.com/o/oauth2/token).

要解决此问题,请安装 2 个软件包openssl and ca-certificates。 Dockerfile 中的示例:

apk add --no-cache ca-certificates openssl
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法在 Docker 容器内从 Google API 交换 AccessToken 的相关文章

随机推荐

  • 如何使用 mat-autocomplete 完全重置 mat-input

    这里在这个斯塔克闪电战 https stackblitz com edit angular rppvg8 jsvfqa file app 2Fasync complete 2Fasync complete component html我有一
  • 我可以将元类对象转换为 Swift 中的协议类型吗?

    Swift 继承了 Objective C 的元类概念 类本身也被视为对象 一类Foo的对象的类是Foo self 它的类型是Foo Type If Foo继承自Bar then Foo self可以分配给类型的变量Bar Type 也 这
  • 具有通用处理程序和查询的 Mediatr

    我正在使用 Mediatr 开发 ASP NET Core 2 2 Web API 应用程序 我有一个看起来像这样的处理程序 public class MyQueryHandler
  • com.esri.arcgis.android:arcgis-android:10.2.6-2 带有 proguard

    如何在启用 proguard 的情况下使用 com esri arcgis android arcgis android 10 2 6 2 我在尝试 保留类 com esri 保留接口 com esri 但这没有帮助 最后我找到了工作答案
  • 当我们单击“选择 2”下拉菜单时,将焦点设置为搜索文本字段

    我正在使用 select2 js 版本 3 4 3 和 bootstrap 我有一个下拉菜单 当我单击下拉菜单时 我会得到一个包含搜索文本字段的列表 但我的光标没有集中在搜索文本字段上
  • 来自另一个字段的 mongoengine 默认值

    我正在为一个项目尝试 MongoEngine 它非常好 我想知道是否可以为另一个字段的字段设置默认值 像这样的东西 import mongoengine as me class Company me Document short name
  • IIS 会话超时与 ASP.NET 会话超时

    在 IIS 6 以及其他版本 中 属性 gt 主目录选项卡 gt 配置按钮 gt 选项选项卡中有一个会话超时设置 看起来像这样 在 ASP NET web config 中有一个 SessionState 设置 如下所示
  • iOS 如何合并两个mp3文件?

    我的应用程序中有一个用户录音和另一个 mp3 文件 我希望用户能够将这两个文件作为一个导出 这意味着这两个文件将以某种方式合并或相互叠加 如果不明白的话 这两个 mp3 文件将同时播放 就像用户可以通过乐器录制歌曲 例如歌曲 的任何应用程序
  • SQLite 查询问题

    2个问题 首先 在 MSSQL 中 我可以通过执行以下操作将 nvarchar 转换为 datetime cast 5 31 2011 12 00 00 AM as datetime as convertedtodate 结果 2011 0
  • 单击编程按钮会引发“System.StackOverflowException”异常

    我在 C Net 中编写了一个 WinForms 程序 用于以编程方式单击密码表单中的按钮 Form1加载并显示Form2作为对话框 如果 DialogResult 不是 DialogResult OK 则应用程序将关闭 到目前为止我有一个
  • 在具有多个目录的项目结构中使用 Python 单元测试

    我需要使用unittestpython 库来执行有关 3 个函数的测试src arithmetics py文件 这是我的项目结构 src arithmetics py test lcm init py test lcm exception
  • 使用 linq 过滤 List

    我有一个包含 Id 值的 List 对象 例如它包含 1 2 10 1 23 11 1 4 2 2 等我需要找出 1 2 等发生了多少次 在 C 中使用 Linq 请帮忙 使用起来非常简单Enumerable GroupBy http ms
  • 为什么多个等待像 Task.WhenAll() 一样花费相同的时间

    据我了解 当您有任务列表时 建议使用await Task WhenAll 超过多个await 由于这样的方式Task WhenAll 处理异常 然而 根据我对 async await 工作方式的理解 我想知道为什么下面的代码块具有相同的执行
  • 如何在 tidyverse 中转置数据框?

    使用基本的 R 我可以转置数据框 比如说mtcars 其中具有同一类的所有列 as data frame t mtcars 或者用管道 library magrittr mtcars gt t gt as data frame 如何在 ti
  • 在 JQuery AJAX 发布之前暂停

    因为我正在处理的页面是一个内联网页面 所以我的 AJAX 调用和响应非常快 出于可用性目的 我想要短暂的 1 2 秒暂停来显示加载动画 下面是我尝试过的 但动画几乎不可见 document ready function wait hide
  • CSS?这个箭头是怎么做出来的?

    这让我发疯 我一直在使用 Firefox 检查器来尝试找出这个箭头是如何在进展现场 http headwaythemes com 我通过检查器删除块来削减代码 并将其简化为 无论我在哪里检查 我都可以not找到任何这样的形状 没有背景图像
  • windows mingw下使用zlib

    我似乎无法让 zlib 在 Windows 下的 mingw 上执行任何操作 我下载了zlib http sourceforge net projects mingw files beta MinGW zlib zlib 1 2 3 1 m
  • 设计在不同的屏幕上破碎[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我设计了一个网页 其中很少有HTML元素没有响应 这些元素是动态生成的jQuery我相信 应该有一种方法可以让他们看起来反应灵敏 Me
  • 如何针对 TextReader 使用正则表达式?

    在 可能 非常大的文本中查找模式的最佳方法是什么 我可以使用正则表达式 但它接受字符串作为参数 有没有办法将它与 TextReader 或某种流一起使用 不 正则表达式可能需要进行回溯 由于流只能向前读取 这意味着无论如何它都必须将整个流保
  • 无法在 Docker 容器内从 Google API 交换 AccessToken

    我有一个用 Go 编写的网络应用程序 使用 oauth2 包golang org x oauth2 通过 Google 登录用户 按照本教程操作https developers google com identity sign in web