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

从戈朗脚本中检索带有空格的 Github 机密

从戈朗脚本中检索带有空格的 Github 机密

Go
墨色风雨 2022-09-12 16:09:49
我想通过戈朗从脚本中检索一个Github秘密内容,该内容是从Github操作执行的。在这种特殊情况下,存储在 Github 机密中的机密值具有空间。我的意思是秘密值是:.JWT <token-string>从任何语言的任何脚本中检索 Github 机密(只要它们在 Github 操作运行器中执行)的方法是将它们作为环境变量读取。所以我正在做的是以这种方式阅读它:(请参阅下面字符串切片中的元素)Authorization:func MyTestFunction(t *testing.T, serverURL string) {    type AppLogin struct {        token string    }    method := "GET"        headers := map[string][]string{        "Content-Type": []string{"application/json, text/plain, */*"},        "Authorization": []string{os.Getenv("USER_JWT")},    }问题是,在运行 Github 操作运行器时,我没有从 Github 机密中获取值。我知道自从我试图以这种方式打印它以来,这种情况正在发生,但没有任何结果:fmt.Println("My JWT", os.Getenv("USER_JWT"))我担心它正在发生,因为令牌和令牌之间的空间,我的意思是。"JWT "JWT <token-string>这里说:机密名称只能包含字母数字字符([a-z]、[A-Z]、[0-9])或下划线 (_)。不允许使用空格。作为一个重要的事实,我的令牌秘密值在其值中也包含字符。该值如下所示:.JWT xxxxxxx8888xxxxdsdsfsfsf9.eyJxxxxxxx8888xxxxdsdsfsfsf9.Tfgxadsdsfsfsasasad_s7sdsdsfgsgcs所以我相信,这就是我无法获得秘密价值的原因。我不确定如何从我的Golang脚本中获取它,我甚至试图修改Github秘密值,只是为了避免值中的空格,我以这种方式从go调用它:<token-string>"Authorization": []string{"JWT ", os.Getenv("SPECKLE_USER_JWT")}但它没有奏效。我在这里读到,当从github操作中调用具有特殊字符的机密时,我们必须用单引号转义它们,但此过程来自文件github操作。' '.yaml我正在尝试以前的解决方案替代方案,它们适用于我的本地计算机,因为我的bash cli能够获取值中带有空格的环境变量。我不确定我 - 让我们说“逃脱” - 一个在字符串中留有空间的秘密,就像我从golang那里得到的那样。
查看完整描述

1 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

我设法从执行戈兰泰拉泰坦代码的GitHub操作中读取了存储在GitHub秘密中的JWT秘密。


如前所述,由于Github机密不允许空格和点字符,并且令牌有一些点加一个空格,因此我首先做的是对其进行编码" ".


echo -n '<token-value>' | base64

这将生成一个没有空格的整个字符串,然后我将此值存储在Github机密上。我从戈朗这样读:.



func main() {

   var t *testing.T

   serverURL := os.Getenv("SERVER_URL")

   MyTestFunction(t, serverURL)


}

func MyTestFunction(t *testing.T, serverURL string) {


    type SpeckleLogin struct {

        token string

    }

    method := "GET"


    // The encoded token is read from github secrets

    b64EncodeJwt := os.Getenv("USER_JWT_ENCODE")

    // fmt.Println("The encode JWT is:", b64EncodeJwt)


    // The encoded read token is decoded

    b64DecodeJwt, _ := b64.StdEncoding.DecodeString(b64EncodeJwt)

    // fmt.Println("JWT Decoded", string(b64DecodeJwt))

    // fmt.Println()

    

    headers := map[string][]string{

        "Content-Type": []string{"application/json, text/plain, */*"},

        

        // The content of the token already decoded is included in the headers slice of strings. 

        "Authorization": []string{(string(b64DecodeJwt))},

    }



    jsonLogin := []byte(fmt.Sprintf(`{

        "email":"%s",

        "password": "%s"

    }`, os.Getenv("USER_EMAIL"), os.Getenv("USER_PASSWORD")))

    

    // The HTTP request is created

    reqLogin, errReq := http.NewRequest(method, serverURL+"/api/accounts", bytes.NewBuffer(jsonLogin))


    // The headers are added to the HTTP request

    reqLogin.Header = headers


    if errReq != nil {

        messageReq := fmt.Sprintf("Error GET login request: %s", errReq.Error())

        t.Fatal(messageReq)

    }


    clientLogin := &http.Client{

        Transport: &http.Transport{

            TLSClientConfig: &tls.Config{

                InsecureSkipVerify: true,

            },

        },

    }

    // Sending the request

    respLogin, errResp := clientLogin.Do(reqLogin)


    if errResp != nil {

        messageResp := fmt.Sprintf("Error GET login response: %s", errResp.Error())

        t.Fatal(messageResp)

    }


    defer respLogin.Body.Close()


    body, _ := ioutil.ReadAll(respLogin.Body)


    // fmt.Println("BODY IS:")

    // fmt.Println(string(body))


    var speckleLogin map[string]interface{}


    if err := json.Unmarshal([]byte(body), &speckleLogin); err != nil {

        t.Fatal("Could not unmarshal json")

    }


    // We take the API token from the response

    data := speckleLogin["resource"].(map[string]interface{})["apitoken"]   


    if speckleToken, ok := data.(string); ok {


        // Here we assert the token is not empty

        assert.NotEmpty(t, speckleToken)

}


但除此之外,正如@WishwaPerera试图告诉我的那样,我从上面调用的gorang中使用的新环境变量必须包含在我的github操作中,以便从命令运行这些测试。所以我的github操作文件最终是这样:SPECKLE_USER_JWT_ENCODEgo test.yaml


name: Preview_Workflow


on:

  pull_request:

    branches:

    - master


jobs:

  build-and-deploy:

    runs-on: ubuntu-latest

    steps:

    - name: 'Checkout GitHub Action'

      uses: actions/checkout@master


    - name: Install terraform 

      uses: hashicorp/setup-terraform@v1

      with:

        terraform_version: 0.13.5

        terraform_wrapper: false


    - name: 'Terraform Version'

      shell: bash

      run: |

        terraform version


    - name: 'Login via Azure CLI'

      uses: azure/login@v1

      with:

        creds: ${{ secrets.AZURE_CREDENTIALS }}


    - name: 'Setup Go'

      id: go

      uses: actions/setup-go@v2

      with:

        go-version: '^1.16.5'


    - name: 'Run Terratest'

      id: terratest

      run: |

        cd tests

        go get -u github.com/Azure/azure-storage-blob-go/azblob

        go get -u github.com/gruntwork-io/terratest/modules/terraform

        go get -u github.com/stretchr/testify/assert

        // executing the test

        go test

      env:

        SERVER_URL: "https://my-service-application-url"

        USER_EMAIL: ${{ secrets.USER_EMAIL }}

        USER_PASSWORD: ${{ secrets.USER_PASSWORD }}

        USER_JWT_ENCODE: ${{ secrets.USER_JWT_ENCODE }}


        # I am using these other ones to connect to azure.

        ARM_CLIENT_ID: ${{ secrets.ARM_CLIENT_ID }}

        ARM_CLIENT_SECRET: ${{ secrets.ARM_CLIENT_SECRET }}

        ARM_SUBSCRIPTION_ID: ${{ secrets.ARM_SUBSCRIPTION_ID }}

        ARM_TENANT_ID: ${{ secrets.ARM_TENANT_ID }}


    - name: Azure logout

      run: |

        az logout

一个很好的参考,以了解一些如何处理HTTP包


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

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信