Skip to content

Instantly share code, notes, and snippets.

@DrMetallius
Created August 31, 2019 20:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save DrMetallius/4ea45f0012ba93c649c6f462da6af523 to your computer and use it in GitHub Desktop.
Save DrMetallius/4ea45f0012ba93c649c6f462da6af523 to your computer and use it in GitHub Desktop.
Backup Authentication
package main
type IdentityProviderLocation struct {
ServerUrl string `json:"server_url"`
Id int `json:"id"`
Login string `json:"login"`
}
type OpenIdentityProviderSessionResponse struct {
AccessToken string `json:"access_token"`
RefreshToken string `json:"refresh_token"`
IdToken string `json:"id_token"`
TokenType string `json:"token_type"`
Error string `json:"error"`
}
package main
import (
"encoding/json"
"io/ioutil"
"net/http"
"net/url"
"errors"
)
const (
cloudRootUrl = "https://trueimage.acronis.com"
testLogin = "test45@mfsa.ru"
testPassword = "qwe123QWE"
)
type IdentityProviderSession struct {
IdToken string
RefreshToken string
}
func main() {
result, err := retrieveIdentityProviderUrl(cloudRootUrl, testLogin)
if err != nil {
println("Error: " + err.Error())
return
}
println(result)
session, err := openIdentityProviderSession(result, testLogin, testPassword)
if err != nil {
println("Error: " + err.Error())
return
}
println(session.IdToken)
}
func retrieveIdentityProviderUrl(cloudRootUrlStr, login string) (string, error) {
cloudRootUrl, err := url.Parse(cloudRootUrlStr)
if err != nil {
return "", err
}
cloudRootUrl.Path += "/api/1/accounts"
query := url.Values{}
query.Add("login", login)
cloudRootUrl.RawQuery = query.Encode()
response, err := http.Get(cloudRootUrl.String())
if err != nil {
return "", err
}
defer response.Body.Close()
data, err := ioutil.ReadAll(response.Body)
if err != nil {
return "", err
}
var providerLocation IdentityProviderLocation
if err := json.Unmarshal(data, &providerLocation); err != nil {
return "", err
}
return providerLocation.ServerUrl, nil
}
func openIdentityProviderSession(identityProviderUrlStr, userName, password string) (*IdentityProviderSession, error) {
identityProviderUrl, err := url.Parse(identityProviderUrlStr)
if err != nil {
return nil, err
}
identityProviderUrl.Path += "/api/idp/v1/token"
params := url.Values{}
params.Add("grant_type", "password")
params.Add("client_id", "backupAgent")
params.Add("username", userName)
params.Add("password", password)
response, err := http.PostForm(identityProviderUrl.String(), params)
if err != nil {
return nil, err
}
defer response.Body.Close()
data, err := ioutil.ReadAll(response.Body)
if err != nil {
return nil, err
}
var openSessionResponse OpenIdentityProviderSessionResponse
if err := json.Unmarshal(data, &openSessionResponse); err != nil {
return nil, err
}
if openSessionResponse.Error != "" {
return nil, errors.New(openSessionResponse.Error)
}
return &IdentityProviderSession{openSessionResponse.IdToken, openSessionResponse.RefreshToken}, nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment