ConnectyCube / connectycube-reactnative-samples

Chat and Video Chat code samples for React Native, ConnectyCube
https://connectycube.com
Apache License 2.0
124 stars 111 forks source link

Create session GOlang #309

Closed banshiAnton closed 1 year ago

banshiAnton commented 1 year ago
package main

import (
    "crypto/hmac"
    "crypto/sha1"
    "encoding/hex"
    "fmt"
    "log"
    "math/rand"
    "reflect"
    "sort"
    "strconv"
    "strings"
    "time"
)

func arrayParams(params map[string]interface{}, prefix string) []string {
    paramsArr := []string{}
    for k, v := range params {
        var keyName string
        if len(prefix) == 0 {
            keyName = k
        } else {
            keyName = prefix + "[" + k + "]"
        }
        if reflect.TypeOf(v) != reflect.TypeOf("") {
            paramsArr = append(paramsArr, arrayParams(v.(map[string]interface{}), keyName)...)
        } else {
            paramsArr = append(paramsArr, keyName+"="+fmt.Sprintf("%v", v))
        }
    }
    return paramsArr
}

func cbSessionSignature(params map[string]interface{}, authKey string) string {
    paramsArr := arrayParams(params, "")
    sort.Strings(paramsArr)
    paramsString := strings.Join(paramsArr, "&")

    log.Println(paramsString)

    mac := hmac.New(sha1.New, []byte(authKey))
    mac.Write([]byte(paramsString))
    expectedMAC := mac.Sum(nil)
    sign := hex.EncodeToString(expectedMAC)

    fmt.Println("cbSessionSignature sign var is: ", sign)

    return sign
}

func createCBSessionBody(application_id string, auth_key string, auth_secret string, nonce string, timestamp string, user map[string]interface{}) map[string]interface{} {
    bodyParams := map[string]interface{}{
        "application_id": application_id,
        "auth_key":       auth_key,
        "nonce":          nonce,
        "timestamp":      timestamp,
        "user":           user,
    }

    signature := cbSessionSignature(bodyParams, auth_secret)
    bodyParams["signature"] = signature

    return bodyParams
}

func main() {
    now := time.Now()
    secs := now.Unix()

    application_id := "00000000"        // APP CREDS
    auth_key := "xxxxxxxxxxxxxxxxx"     // APP CREDS
    auth_secret := "yyyyyyyyyyyyyyyyyy" // APP CREDS

    nonce := strconv.Itoa(int(rand.Intn(9999))) // randon value
    timestamp := strconv.Itoa(int(secs))        // date timestamp

    user := map[string]interface{}{
        "email":    "user_email",
        "password": "user_password",
    }

    postBody := createCBSessionBody(application_id, auth_key, auth_secret, nonce, timestamp, user)

    fmt.Println(postBody)
}