github.com/grokify/go-ringcentral-client@v0.3.31/engagevoice/v1/util/lite/api_token.go (about) 1 package lite 2 3 import ( 4 "errors" 5 "fmt" 6 "io/ioutil" 7 "log" 8 "net/http" 9 "net/url" 10 "strings" 11 "time" 12 13 "github.com/grokify/mogo/encoding/jsonutil" 14 "github.com/grokify/mogo/errors/errorsutil" 15 "github.com/grokify/mogo/net/http/httputilmore" 16 ) 17 18 // portal.vacd.biz:8081 19 20 const ( 21 EngageVoiceServerURL string = "https://portal.vacd.biz" 22 EngageVoiceLoginURL string = "https://portal.vacd.biz/api/v1/auth/login" 23 EngageVoiceTokenURL string = "https://portal.vacd.biz/api/v1/admin/token" 24 EngageVoiceTokenURLPath string = "/api/v1/admin/token" 25 HeaderEngageVoiceToken string = "x-auth-token" 26 ) 27 28 type LoginSuccess struct { 29 AuthToken string `json:"authToken"` 30 PlatformHost string `json:"platformHost"` 31 Accounts []Account `json:"accounts"` 32 } 33 34 type User struct { 35 UserID int64 `json:"userId"` 36 UserName string `json:"userName"` 37 FirstName string `json:"firstName"` 38 LastName string `json:"lastName"` 39 FullName string `json:"fullName"` 40 CreationDate time.Time `json:"creationDate"` 41 Enabled bool `json:"enabled"` 42 ParentPath string `json:"parentPath"` 43 RcUserID string `json:"rcUserId"` 44 Roles []Role `json:"roles"` 45 RootUser bool `json:"rootUser"` 46 // PhoneNumber string `json:"phoneNumber"` 47 // Children []Children `json:"children"` 48 } 49 50 type Role struct { 51 RoleType string `json:"roleType"` 52 Description string `json:"description"` 53 } 54 55 type Account struct { 56 MainAccountID string `json:"mainAccountId"` 57 AccountID string `json:"accountId"` 58 AccountName string `json:"accountName"` 59 EnableMultiUser bool `json:"enableMultiUser"` 60 EnableSoftphones bool `json:"enableSoftphones"` 61 TcpaSafeMode bool `json:"tcpaSafeMode"` 62 EnableVoiceBroadcast bool `json:"enableVoiceBroadcast"` 63 OutboundPrepay bool `json:"outboundPrepay"` 64 Enable247Dialing bool `json:"enable247Dialing"` 65 EnableFifo bool `json:"enableFifo"` 66 EnableChat bool `json:"enableChat"` 67 EnableInbound bool `json:"enableInbound"` 68 EnableOutbound bool `json:"enableOutbound"` 69 EnableVisualIvr bool `json:"enableVisualIvr"` 70 EnableTracking bool `json:"enableTracking"` 71 EnableCloudRouting bool `json:"enableCloudRouting"` 72 UsePowerBy bool `json:"usePowerBy"` 73 EnableAgentRankRouting bool `json:"enableAgentRankRouting"` 74 EnableHciDialer bool `json:"enableHciDialer"` 75 EnableTcpaSafeMachineDetect bool `json:"enableTcpaSafeMachineDetect"` 76 EmailFromAddress string `json:"emailFromAddress"` 77 DatabaseShardID string `json:"databaseShardId"` 78 DefaultOutdialServerGroupID int64 `json:"defaultOutdialServerGroupId"` 79 DefaultIntellidialServerID int64 `json:"defaultIntellidialServerId"` 80 RcAccountAccess string `json:"rcAccountAccess"` 81 EnableGoodData bool `json:"enableGoodData"` 82 MainAccountName string `json:"mainAccountName"` 83 } 84 85 type LoginError struct { 86 GeneralMessage string `json:"generalMessage"` 87 Details string `json:"details"` 88 RequestURI string `json:"requestUri"` 89 Timestamp int64 `json:"timestamp"` 90 } 91 92 func GenerateAPIToken(username, password string) (string, *LoginSuccess, error) { 93 respSucc, _, resp, err := RequestAuthToken(username, password) 94 if err != nil { 95 return "", nil, err 96 } else if resp.StatusCode != 200 { 97 return "", nil, fmt.Errorf("E_AUTH_RESPONSE_STATUS_CODE_NOT_200 [%v]", resp.StatusCode) 98 } 99 100 if len(strings.TrimSpace(respSucc.AuthToken)) == 0 { 101 return "", nil, errors.New("E_EMPTY_AUTH_TOKEN") 102 } 103 104 apiToken, err := ExchangeAPIToken(respSucc.AuthToken) 105 if err != nil { 106 return "", respSucc, err 107 } 108 return apiToken, respSucc, nil 109 } 110 111 func ExchangeAPIToken(authToken string) (string, error) { 112 req, err := http.NewRequest(http.MethodPost, EngageVoiceTokenURL, nil) 113 if err != nil { 114 return "", err 115 } 116 req.Header.Add(HeaderEngageVoiceToken, authToken) 117 client := &http.Client{} 118 resp, err := client.Do(req) 119 if err != nil { 120 return "", errorsutil.Wrap(err, "ExchangeAPIToken.client.Do()") 121 } else if resp.StatusCode != 200 { 122 return "", fmt.Errorf("TOKEN_RESP_STATUS_CODE_NOT_200 [%v]", resp.StatusCode) 123 } 124 body, err := ioutil.ReadAll(resp.Body) 125 if err != nil { 126 return "", err 127 } 128 token := strings.TrimSpace(string(body)) 129 if len(token) == 0 { 130 return "", fmt.Errorf("E_EMPTY_API_TOKEN") 131 } 132 return token, nil 133 } 134 135 func RequestAuthToken(username, password string) (*LoginSuccess, *LoginError, *http.Response, error) { 136 data := url.Values{} 137 data.Set("username", username) 138 data.Set("password", password) 139 140 resp, err := httputilmore.SendWWWFormURLEncodedSimple(http.MethodPost, EngageVoiceLoginURL, data) 141 if err != nil { 142 return nil, nil, resp, err 143 } 144 bytes, err := ioutil.ReadAll(resp.Body) 145 if err != nil { 146 log.Fatal(err) 147 } 148 fmt.Println(string(bytes)) 149 if resp.StatusCode != 200 { 150 respData := LoginError{} 151 _, err := jsonutil.UnmarshalReader(resp.Body, &respData) 152 if err != nil { 153 return nil, &respData, resp, err 154 } 155 return nil, &respData, resp, fmt.Errorf("AuthUrl Status != 200 [%v]", resp.StatusCode) 156 } 157 authData := LoginSuccess{} 158 _, err = jsonutil.UnmarshalReader(resp.Body, &authData) 159 if err != nil { 160 return nil, nil, resp, err 161 } 162 return &authData, nil, resp, nil 163 } 164 165 func ListTokens(serverURL, authOrApiToken string) ([]string, error) { 166 tokens := []string{} 167 headers, apiURL, err := APIInfo( 168 serverURL, EngageVoiceTokenURLPath, authOrApiToken) 169 if err != nil { 170 return tokens, err 171 } 172 173 resp, err := httputilmore.GetJSONSimple(apiURL, headers, &tokens) 174 if err != nil { 175 return tokens, err 176 } else if resp.StatusCode >= 300 { 177 return tokens, errors.New("E_RESPONSE_STATUS_CODE_NOT_2XX") 178 } 179 return tokens, nil 180 }