# Truy cập API chéo tài khoản

Khi các tài khoản ucloud-global khác yêu cầu bạn cấp quyền truy cập vào tài nguyên thông qua API, bạn có thể gán quyền cho họ thông qua chức năng [Vai trò] (Role) + [STS]. Phạm vi truy cập của họ (ví dụ: phạm vi dự án, phạm vi sản phẩm, v.v.) được xác định bởi vai trò mà bạn gán.

## Kịch bản áp dụng

Bạn có thể cho phép các tài khoản ucloud-global khác của mình giả định các vai trò của tài khoản ucloud-global hiện có và quản lý tài nguyên trong phạm vi quyền hạn của họ bằng cách sử dụng các khóa bảo mật tạm thời được tạo từ các vai trò truy cập chéo tài khoản.

## Điều kiện tiên quyết

Có nhiều tài khoản chính ucloud-global. Trong tài liệu này, giả định rằng bạn có hai tài khoản ucloud-global là tài khoản A (bên ủy quyền) và tài khoản B (bên truy cập), và giả định rằng tài khoản B muốn quản lý tài nguyên thuộc tài khoản A.

## Các bước thực hiện
1. Bên ủy quyền tạo vai trò
- Đăng nhập vào bảng điều khiển bằng tài khoản chính của A và đi tới [Kiểm soát truy cập] (Access Control) -> [Quản lý vai trò] (Role Management).
- Tạo vai trò tùy chỉnh.
- Nhấp vào chi tiết vai trò tương ứng để thêm các chức năng có thể thực hiện và phạm vi quyền hạn tài nguyên cho vai trò.
![img](https://cdn.udelivrs.com/2025/05/314d940f9efb5e90b4d1a01fa60a6ba8_1746675695190.png)<br>

2. Bên ủy quyền thêm bên truy cập vào chính sách tin cậy của vai trò.

- Nhấp vào nút "Chi tiết" (Details) của vai trò tương ứng, chọn "Chính sách tin cậy" (Trust Policies) và nhấp vào "Chỉnh sửa chính sách" (Edit Policy).
- Nhập "ucs:iam::xxxxxxxx:root" vào mục "Chủ thể" (Principal), trong đó xxxxxxxx là số tài khoản của bên truy cập, tức là ID Công ty (bạn có thể xem bằng cách nhấp vào ảnh đại diện trên bảng điều khiển).
![img](https://cdn.udelivrs.com/2025/05/2158c73637051e8b5f252a06477144da_1746675695192.png)<br>
3. Bên truy cập tạo người dùng phụ và thêm quyền gọi STS để tạo khóa bảo mật tạm thời.

- Đăng nhập vào bảng điều khiển bằng tài khoản chính của B, đi tới [Kiểm soát truy cập] (Access Control) -> [Quản lý người dùng] (User Management), và mời người dùng phụ.
- Nhấp vào nút Thêm quyền của người dùng phụ tương ứng.
- Tìm kiếm chính sách "STSCreateOnlyAccess" và thêm chính sách đó.
![img](https://cdn.udelivrs.com/2025/05/6cb19bc9ce626ac7b9fcab8ed48cd057_1746675695193.png)<br>

4. Người dùng gọi giao diện AssumeRole của dịch vụ STS thông qua tài khoản phụ để tạo khóa bảo mật tạm thời
```
Lưu ý: Tài liệu mô tả API STS Lấy thông tin xác thực danh tính tạm thời để đảm nhận vai trò có sẵn tại: https://www.ucloud-global-global.com/en/docs/api/sts-api
```

Gọi giao diện để lấy ba thông tin sau và tiếp tục thực hiện bước 5:
- SecurityToken: Mã thông báo bảo mật (Security Token)
- AccessKeyId: ID Khóa (Access Key ID)
- AccessKeySecret: Khóa bí mật (Access Key Secret)

![img](https://cdn.udelivrs.com/2025/05/7e149e29870bd854e1bc6ae8fe88fd40_1746675695195.png)<br>

5. Sử dụng khóa bảo mật tạm thời được tạo ở bước 4 để đảm nhận vai trò được ủy quyền bởi Tài khoản A. Trong phạm vi đặc quyền của vai trò, bạn có thể gọi giao diện cần thiết để quản lý tài nguyên ucloud-global theo bất kỳ cách nào sau đây:

- Dòng lệnh đám mây CloudShell
- OpenSDK đa ngôn ngữ / Go / Python

Ví dụ CloudShell

```
ucloud-global api  --Action AssumeRole  --RoleUrn ucs:iam::xxxx:role/test  --RoleSessionName test-session

```

Ví dụ SDK

```
package main

import (
    "fmt"
    "os"

    "github.com/ucloud/ucloud-sdk-go/services/sts"
    "github.com/ucloud/ucloud-sdk-go/services/uhost"
    "github.com/ucloud/ucloud-sdk-go/ucloud"
    "github.com/ucloud/ucloud-sdk-go/ucloud/auth"
    "github.com/ucloud/ucloud-sdk-go/ucloud/log"
    "github.com/ucloud/ucloud-sdk-go/ucloud/request"
)

// loadConfig tải cấu hình và thông tin xác thực ucloud
func loadConfig() (*ucloud.Config, *auth.Credential) {
    cfg := ucloud.NewConfig()
    cfg.LogLevel = log.DebugLevel
    cfg.BaseUrl = "https://api.ucloud-global.com

    credential := auth.NewCredential()
    credential.PrivateKey = os.Getenv("UCLOUD_PRIVATE_KEY")
    credential.PublicKey = os.Getenv("UCLOUD_PUBLIC_KEY")

    log.Info("setup clients ...")

    return &cfg, &credential
}

func main() {
    // lấy thông tin xác thực sts
    cfg, credential := loadConfig()
    stsClient := sts.NewClient(cfg, credential)
    var assumeRoleRequest sts.AssumeRoleRequest
    assumeRoleRequest.RoleUrn = ucloud.String("ucs:iam::xxxx:role/test")
    assumeRoleRequest.RoleSessionName = ucloud.String("test-session")
    assumeRoleResponse, err := stsClient.AssumeRole(&assumeRoleRequest)
    if err != nil {
        panic(err)
    }
    fmt.Println(assumeRoleResponse.Credentials.AccessKeyId)
    // mã thông báo từ AssumeRole có thời gian hết hạn
    fmt.Println(assumeRoleResponse.Credentials.Expiration)
    cred := &auth.Credential{
        PublicKey:     assumeRoleResponse.Credentials.AccessKeyId,
        PrivateKey:    assumeRoleResponse.Credentials.AccessKeySecret,
        SecurityToken: assumeRoleResponse.Credentials.SecurityToken,
    }
    // gọi client uhost với thông tin xác thực sts
    uhostClient := uhost.NewClient(cfg, cred)
    cfg.ProjectId = os.Getenv("UCLOUD_PROJECT_ID")
    cfg.Region = "cn-bj2"
    req := &uhost.DescribeUHostInstanceRequest{}
    req.SetEncoder(request.NewJSONEncoder(cfg, cred))
    resp, err := uhostClient.DescribeUHostInstance(&uhost.DescribeUHostInstanceRequest{})
    if err != nil {
        log.Errorf("error: %v", err)
    } else {
        log.Infof("response: %+v", resp)
    }
}
```