为了账号安全,请及时绑定邮箱和手机立即绑定

如何在戈朗中将秘密作为配置文件拉取

如何在戈朗中将秘密作为配置文件拉取

Go
森栏 2022-09-12 16:56:34
因此,我对Go非常陌生,我很好奇如何动态导入密码和URL而不会在我的脚本中公开它们。在python中,我能够使用JSON有效负载来实现这一点,并且基本上会导入JSON,加载有效载荷,并指定何时需要传递需要保密的规范。这是我的Go脚本:package mainimport (    "io/ioutil"    "net/http"    "fmt"    "gopkg.in/yaml.v2")// curl -u <username>:<password> <some_url>func main() {    type Config struct {    URL      string `yaml:"url"`    Username string `yaml:"username"`    Token    string `yaml:"token"`    }    func readConfig() (*Config, error) {    config := &Config{}    cfgFile, err := ioutil.ReadFile("config.yaml")    if err != nil {        return nil, err    }    err = yaml.Unmarshal(cfgFile, config)    return config, err    }    req, err := http.NewRequest("GET", config.URL, nil)    if err != nil {        // handle err    }    req.SetBasicAuth(config.Username, config.Token)    resp, err := http.DefaultClient.Do(req)    if err != nil {        // handle err    }    defer resp.Body.Close()    body, _ := ioutil.ReadAll(resp.Body)    fmt.Println(string(body))}可以想象,我在加载密码时运气不佳,当我使用直接令牌更改以下内容时,它会在脚本中公开我的密码,并在Jira中生成JSON有效负载。config.URLconfig.Usernameconfig.Token因此,如果我在YAML中有一个配置文件, 如下所示:config:    URL: "<some_URL>"    Username: "<some_username>"    Token: "<some_token>"如何将 YAML 文件加载到脚本中?如何加载 JSON 等效项?{  "config": {    "URL": "<some_URL>"    "Username": "<some_username>",    "Token": "<some_token>"  }}
查看完整描述

2 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

好吧,这里有几个问题。


除非使用变量声明语法,否则不能在另一个函数中声明函数

func main() {

    // This

    var myFunc = func() {

        // ...

    }

    // Not this

    func myFunc() {

        // ...

    }

}

该结构告诉 YAML 解封船者期望。您的结构应具有与 yaml 文件的大小写和结构匹配的 yaml 标记。Config

// It is expecting this

url: "<some_URL>"

username: "<some_username>"

token: "<some_token>"


// Your yaml looks like this

config:

  Url: "<some_URL>"

  Username: "<some_username>"

  Token: "<some_token>"

以下对我有用:


package main


import (

    "fmt"

    "io/ioutil"

    "net/http"


    "gopkg.in/yaml.v2"

)


type YAMLFile struct {

    Config Config `yaml:"config"`

}

type Config struct {

    URL      string `yaml:"url"`

    Username string `yaml:"username"`

    Token    string `yaml:"token"`

}


func main() {

    config, err := readConfig()

    if err != nil {

        panic(err)

    }

    fmt.Printf("%+v", config)

    req, err := http.NewRequest("GET", config.URL, nil)

    if err != nil {

        panic(err)

    }

    req.SetBasicAuth(config.Username, config.Token)

    resp, err := http.DefaultClient.Do(req)

    if err != nil {

        panic(err)

    }

    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)

    if err != nil {

        panic(err)

    }

    fmt.Println(string(body))

}


func readConfig() (*Config, error) {

    config := &YAMLFile{}

    cfgFile, err := ioutil.ReadFile("./config.yaml")

    if err != nil {

        return nil, err

    }

    err = yaml.Unmarshal(cfgFile, config)

    return &config.Config, err

}


查看完整回答
反对 回复 2022-09-12
?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

巴雷特


这是我前段时间为解决这个问题而制作的配置库:https://github.com/fulldump/goconfig。


用法很简单:


使用您需要的所有配置定义一个结构:

type Config struct {

    URL      string

    Username string

    Token    string

}

实例化具有该类型的变量,并使用默认值填充它:

c := &Config{

    URL:     "http://default/url"

    Username: "default username"

}

使用来自环境、命令行参数和/或 json 文件的数据自动填充配置变量:使用 follog 行:

goconfig.Read(c)

例如,在您的情况下,您可以按如下方式传递 JSON 文件,以从文件中读取所有配置密钥,但在启动时使用参数覆盖令牌。./my-binary -token "my_secret_token" -config my-config-file.json


查看完整回答
反对 回复 2022-09-12
  • 2 回答
  • 0 关注
  • 71 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号