kong Hmac auth 认证

package main

import (
	"bytes"
	"crypto/hmac"
	"crypto/sha256"
	"crypto/tls"
	"encoding/base64"
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"net/http/httputil"
	"time"
)

func main() {

	algorithm := "hmac-sha256"
	username := "hmac_username"
	secret := "hmac_secret"
	url := "https://ssl.hunangl.com"
	path := "/ok"
	method := "POST"
	uuid := "9b83f786-5a70-11eb-ae93-0242ac130002"

	// request path
	url = url + path

	// date
	loc, _ := time.LoadLocation("GMT")
	date := time.Now().In(loc)
	layout := "Mon, 02 Jan 2006 15:04:05 GMT"
	dateFormat := date.Format(layout)

	// body
	requestBody := []byte("{\"foo\":\"bar\"}")
	digestBody := sha256.New()
	digestBody.Write([]byte(requestBody))
	digestBodyContent := base64.StdEncoding.EncodeToString(digestBody.Sum(nil))
	digestBodyHeader := "SHA-256=" + digestBodyContent

	signingString := "x-date: " + dateFormat + "\n" + method + " " + path + " HTTP/1.1" + "\n" + "x-uuid: " + uuid + "\n" + "digest: " + digestBodyHeader
	digest := hmac.New(sha256.New, []byte(secret))
	digest.Write([]byte(signingString))
	signature := base64.StdEncoding.EncodeToString(digest.Sum(nil))

	// ignore server certificate
	tr := &http.Transport{
		TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
	}
	client := &http.Client{Transport: tr}
	request, err := http.NewRequest(method, url, bytes.NewBuffer(requestBody))
	if err != nil {
		log.Fatalln(err)
	}

	//header
	authorization := "hmac username=\"" + username + "\", algorithm=\"" + algorithm + "\", headers=\"x-date request-line x-uuid digest\", signature=\"" + signature + "\""

	log.Println("variables:")
	fmt.Println("url: " + url)
	fmt.Println("username: " + username)
	fmt.Println("secret: " + secret)
	fmt.Println("body: " + string(requestBody))
	fmt.Println("signingString: " + signingString)
	fmt.Println("signature: " + signature)
	fmt.Println("authorization: " + authorization)

	request.Header.Set("Digest", digestBodyHeader)
	request.Header.Set("Authorization", authorization)
	request.Header.Set("X-Date", dateFormat)
	request.Header.Set("X-UUID", uuid)
	request.Header.Set("Content-Type", "application/json")

	requestDump, err := httputil.DumpRequest(request, true)

	if err == nil {
		log.Println("request:", string(requestDump))
	}

	resp, err := client.Do(request)
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatalln(err)
	}

	log.Println("response header:")
	for k, v := range resp.Header {
		fmt.Println(k, ":", v)
	}

	log.Println("response:", string(body))

}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值