cloudsso/user.go (89 lines of code) (raw):
// Copyright (c) 2009-present, Alibaba Cloud All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package cloudsso
import (
"encoding/json"
"fmt"
"github.com/aliyun/aliyun-cli/v3/cli"
"io/ioutil"
"net/http"
"net/url"
"time"
)
type ListUserParameter struct {
BaseUrl string `json:"base_url"`
AccessToken string `json:"access_token"`
HttpClient *http.Client `json:"-"`
}
type AccountDetailResponse struct {
AccountId string `json:"AccountId"`
DisplayName string `json:"DisplayName"`
}
// ListUsersResponse 保存列出用户的响应
type ListUsersResponse struct {
Accounts []AccountDetailResponse `json:"Accounts"`
IsTruncated bool `json:"IsTruncated"`
NextToken string `json:"NextToken"`
}
// ErrorResponse 用于处理错误响应
type ErrorResponse struct {
ErrorCode string `json:"ErrorCode"`
ErrorMessage string `json:"ErrorMessage"`
RequestId string `json:"RequestId"`
}
// ListUsers 获取账户列表,支持分页
func (p *ListUserParameter) ListUsers(nextToken string, maxResults int) (*ListUsersResponse, error) {
apiUrl, err := url.Parse(fmt.Sprintf("%s/access-assignments/accounts", p.BaseUrl))
if err != nil {
return nil, err
}
query := apiUrl.Query()
if nextToken != "" {
query.Add("NextToken", nextToken)
}
if maxResults > 0 {
query.Add("MaxResults", fmt.Sprintf("%d", maxResults))
}
apiUrl.RawQuery = query.Encode()
req, err := http.NewRequest("GET", apiUrl.String(), nil)
if err != nil {
return nil, err
}
req.Header.Add("accept", "application/json")
req.Header.Add("content-type", "application/json")
req.Header.Add("authorization", fmt.Sprintf("Bearer %s", p.AccessToken))
req.Header.Add("user-agent", "aliyun/CLI-"+cli.Version)
p.HttpClient.Timeout = 10000 * time.Millisecond
resp, err := p.HttpClient.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
}
if resp.StatusCode >= 400 && resp.StatusCode < 500 {
var errResp ErrorResponse
if err := json.Unmarshal(body, &errResp); err != nil {
return nil, err
}
return nil, fmt.Errorf("%s: %s %s", errResp.ErrorCode, errResp.ErrorMessage, errResp.RequestId)
}
var result ListUsersResponse
if err := json.Unmarshal(body, &result); err != nil {
return nil, err
}
return &result, nil
}
// ListAllUsers 获取所有账户列表
func (p *ListUserParameter) ListAllUsers() ([]AccountDetailResponse, error) {
var accounts []AccountDetailResponse
response, err := p.ListUsers("", 100)
if err != nil {
return nil, err
}
accounts = append(accounts, response.Accounts...)
for response.IsTruncated {
response, err = p.ListUsers(response.NextToken, 100)
if err != nil {
return nil, err
}
accounts = append(accounts, response.Accounts...)
}
return accounts, nil
}