package gosoap import ( "crypto/sha1" "encoding/base64" "encoding/xml" "time" "github.com/elgs/gostrgen" ) /************************* WS-Security types *************************/ const ( passwordType = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest" encodingType = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" ) //Security type :XMLName xml.Name `xml:"http://purl.org/rss/1.0/modules/content/ encoded"` type Security struct { //XMLName xml.Name `xml:"wsse:Security"` XMLName xml.Name `xml:"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd Security"` Auth wsAuth } type password struct { //XMLName xml.Name `xml:"wsse:Password"` Type string `xml:"Type,attr"` Password string `xml:",chardata"` } type nonce struct { //XMLName xml.Name `xml:"wsse:Nonce"` Type string `xml:"EncodingType,attr"` Nonce string `xml:",chardata"` } type wsAuth struct { XMLName xml.Name `xml:"UsernameToken"` Username string `xml:"Username"` Password password `xml:"Password"` Nonce nonce `xml:"Nonce"` Created string `xml:"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd Created"` } /* admin edBuG+qVavQKLoWuGWQdPab4IBE= S7wO1ZFTh0KXv2CR7bd2ZXkLAAAAAA== 2018-04-10T18:04:25.836Z */ //NewSecurity get a new security func NewSecurity(username, passwd string) Security { /** Generating Nonce sequence **/ charsToGenerate := 32 charSet := gostrgen.Lower | gostrgen.Digit nonceSeq, _ := gostrgen.RandGen(charsToGenerate, charSet, "", "") created := time.Now().UTC().Format(time.RFC3339Nano) auth := Security{ Auth: wsAuth{ Username: username, Password: password{ Type: passwordType, Password: generateToken(username, nonceSeq, created, passwd), }, Nonce: nonce{ Type: encodingType, Nonce: nonceSeq, }, Created: created, }, } return auth } //Digest = B64ENCODE( SHA1( B64DECODE( Nonce ) + Date + Password ) ) func generateToken(Username string, Nonce string, Created string, Password string) string { sDec, _ := base64.StdEncoding.DecodeString(Nonce) hasher := sha1.New() hasher.Write([]byte(string(sDec) + Created + Password)) return base64.StdEncoding.EncodeToString(hasher.Sum(nil)) }