curl --request POST \
--url https://iam.basaltic.sh/v1/assume-role \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"role": "crn:iam::production:role/reports",
"duration_seconds": 3600,
"policy": {
"version": "2024-01-01",
"statements": [
{
"effect": "allow",
"actions": [
"storage:GetObject"
],
"resources": [
"crn:storage:sa-saopaulo-1::bucket/reports/*"
]
}
]
}
}
'import requests
url = "https://iam.basaltic.sh/v1/assume-role"
payload = {
"role": "crn:iam::production:role/reports",
"duration_seconds": 3600,
"policy": {
"version": "2024-01-01",
"statements": [
{
"effect": "allow",
"actions": ["storage:GetObject"],
"resources": ["crn:storage:sa-saopaulo-1::bucket/reports/*"]
}
]
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
role: 'crn:iam::production:role/reports',
duration_seconds: 3600,
policy: {
version: '2024-01-01',
statements: [
{
effect: 'allow',
actions: ['storage:GetObject'],
resources: ['crn:storage:sa-saopaulo-1::bucket/reports/*']
}
]
}
})
};
fetch('https://iam.basaltic.sh/v1/assume-role', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://iam.basaltic.sh/v1/assume-role",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'role' => 'crn:iam::production:role/reports',
'duration_seconds' => 3600,
'policy' => [
'version' => '2024-01-01',
'statements' => [
[
'effect' => 'allow',
'actions' => [
'storage:GetObject'
],
'resources' => [
'crn:storage:sa-saopaulo-1::bucket/reports/*'
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://iam.basaltic.sh/v1/assume-role"
payload := strings.NewReader("{\n \"role\": \"crn:iam::production:role/reports\",\n \"duration_seconds\": 3600,\n \"policy\": {\n \"version\": \"2024-01-01\",\n \"statements\": [\n {\n \"effect\": \"allow\",\n \"actions\": [\n \"storage:GetObject\"\n ],\n \"resources\": [\n \"crn:storage:sa-saopaulo-1::bucket/reports/*\"\n ]\n }\n ]\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://iam.basaltic.sh/v1/assume-role")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"role\": \"crn:iam::production:role/reports\",\n \"duration_seconds\": 3600,\n \"policy\": {\n \"version\": \"2024-01-01\",\n \"statements\": [\n {\n \"effect\": \"allow\",\n \"actions\": [\n \"storage:GetObject\"\n ],\n \"resources\": [\n \"crn:storage:sa-saopaulo-1::bucket/reports/*\"\n ]\n }\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://iam.basaltic.sh/v1/assume-role")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"role\": \"crn:iam::production:role/reports\",\n \"duration_seconds\": 3600,\n \"policy\": {\n \"version\": \"2024-01-01\",\n \"statements\": [\n {\n \"effect\": \"allow\",\n \"actions\": [\n \"storage:GetObject\"\n ],\n \"resources\": [\n \"crn:storage:sa-saopaulo-1::bucket/reports/*\"\n ]\n }\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"access_token": "eyJhbGciOiJFUzI1NiIsInR5cCI6ImF0K2p3dCIsImtpZCI6Ii4uLiJ9...",
"token_type": "Bearer",
"expires_in": 3600,
"access_key_id": "AKIA...",
"secret_access_key": "wJalrXUtnFEMI...",
"session_token": "FwoGZXIvYXdzE...",
"expiration": "2026-01-15T09:30:00Z",
"account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"account_handle": "<string>",
"role_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"error": {
"code": "INVALID_INPUT",
"message": "Invalid request parameters",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "Authentication required",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "INVALID_INPUT",
"message": "Invalid request parameters",
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"params": {
"instances": 2,
"pools": 0
}
}
}{
"error": {
"code": "NOT_FOUND",
"message": "Resource not found",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "An internal error occurred",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "SERVICE_UNAVAILABLE",
"message": "The service is temporarily unavailable. Please try again later.",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}Asumir rol
Asumir un rol en esta cuenta u otra cuenta de la misma organización. El llamador necesita el permiso iam:AssumeRole (o una asignación de rol de cuenta de Workspace efectiva), y el rol de destino debe confiar de forma independiente en el llamador.
La cuenta de sesión proviene del rol de destino, no del encabezado selected-account. La sesión usa los permisos de rol de destino y las directivas de organización delegadas, sujetas a los límites aplicables, las denegaciones explícitas y una directiva de sesión de restricción opcional. Los permisos de los principales de origen no se unen en la sesión.
curl --request POST \
--url https://iam.basaltic.sh/v1/assume-role \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"role": "crn:iam::production:role/reports",
"duration_seconds": 3600,
"policy": {
"version": "2024-01-01",
"statements": [
{
"effect": "allow",
"actions": [
"storage:GetObject"
],
"resources": [
"crn:storage:sa-saopaulo-1::bucket/reports/*"
]
}
]
}
}
'import requests
url = "https://iam.basaltic.sh/v1/assume-role"
payload = {
"role": "crn:iam::production:role/reports",
"duration_seconds": 3600,
"policy": {
"version": "2024-01-01",
"statements": [
{
"effect": "allow",
"actions": ["storage:GetObject"],
"resources": ["crn:storage:sa-saopaulo-1::bucket/reports/*"]
}
]
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
role: 'crn:iam::production:role/reports',
duration_seconds: 3600,
policy: {
version: '2024-01-01',
statements: [
{
effect: 'allow',
actions: ['storage:GetObject'],
resources: ['crn:storage:sa-saopaulo-1::bucket/reports/*']
}
]
}
})
};
fetch('https://iam.basaltic.sh/v1/assume-role', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://iam.basaltic.sh/v1/assume-role",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'role' => 'crn:iam::production:role/reports',
'duration_seconds' => 3600,
'policy' => [
'version' => '2024-01-01',
'statements' => [
[
'effect' => 'allow',
'actions' => [
'storage:GetObject'
],
'resources' => [
'crn:storage:sa-saopaulo-1::bucket/reports/*'
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://iam.basaltic.sh/v1/assume-role"
payload := strings.NewReader("{\n \"role\": \"crn:iam::production:role/reports\",\n \"duration_seconds\": 3600,\n \"policy\": {\n \"version\": \"2024-01-01\",\n \"statements\": [\n {\n \"effect\": \"allow\",\n \"actions\": [\n \"storage:GetObject\"\n ],\n \"resources\": [\n \"crn:storage:sa-saopaulo-1::bucket/reports/*\"\n ]\n }\n ]\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://iam.basaltic.sh/v1/assume-role")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"role\": \"crn:iam::production:role/reports\",\n \"duration_seconds\": 3600,\n \"policy\": {\n \"version\": \"2024-01-01\",\n \"statements\": [\n {\n \"effect\": \"allow\",\n \"actions\": [\n \"storage:GetObject\"\n ],\n \"resources\": [\n \"crn:storage:sa-saopaulo-1::bucket/reports/*\"\n ]\n }\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://iam.basaltic.sh/v1/assume-role")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"role\": \"crn:iam::production:role/reports\",\n \"duration_seconds\": 3600,\n \"policy\": {\n \"version\": \"2024-01-01\",\n \"statements\": [\n {\n \"effect\": \"allow\",\n \"actions\": [\n \"storage:GetObject\"\n ],\n \"resources\": [\n \"crn:storage:sa-saopaulo-1::bucket/reports/*\"\n ]\n }\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"access_token": "eyJhbGciOiJFUzI1NiIsInR5cCI6ImF0K2p3dCIsImtpZCI6Ii4uLiJ9...",
"token_type": "Bearer",
"expires_in": 3600,
"access_key_id": "AKIA...",
"secret_access_key": "wJalrXUtnFEMI...",
"session_token": "FwoGZXIvYXdzE...",
"expiration": "2026-01-15T09:30:00Z",
"account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"account_handle": "<string>",
"role_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"error": {
"code": "INVALID_INPUT",
"message": "Invalid request parameters",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "Authentication required",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "INVALID_INPUT",
"message": "Invalid request parameters",
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"params": {
"instances": 2,
"pools": 0
}
}
}{
"error": {
"code": "NOT_FOUND",
"message": "Resource not found",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "An internal error occurred",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "SERVICE_UNAVAILABLE",
"message": "The service is temporarily unavailable. Please try again later.",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}iam:AssumeRole. Consulte permisos de IAM para obtener la lista completa, lo que cubre cada una y un ejemplo de directiva.Autorizaciones
Un token bearer de OAuth 2.0, enviado como Authorization: Bearer <token>. Esta es la forma recomendada de autenticación.
Obtén el token intercambiando el par de claves de acceso de una cuenta de servicio en POST /v1/oauth/token con grant_type=client_credentials. Es el flujo estándar de credenciales de cliente; las bibliotecas compatibles con OAuth pueden obtener y renovar el token por ti.
curl -s -u "$KEY_ID:$SECRET" -d grant_type=client_credentials \
https://iam.basaltic.sh/v1/oauth/token
Los tokens duran una hora por defecto. El mismo par de claves de acceso también sirve como credencial AWS SigV4 para el endpoint de objetos compatible con S3, que solo acepta ese método de autenticación.
Cuerpo
UUID del rol de la cuenta, nombre inmutable en la cuenta seleccionada, o crn:iam:::función/. AssumeRole puede usar un CRN calificado para dirigirse a otra cuenta de la misma organización, y la sesión resultante se vincula a la cuenta de rol de destino.
"crn:iam::production:role/reports"
Duración de validez de la credencial (15 min a 12 horas)
900 <= x <= 432003600
Una política en línea que abarca las credenciales que se están creando. No otorga nada por sí mismo: cada solicitud hecha con las credenciales resultantes debe ser permitida por las políticas efectivas del rol asumido y por este documento, por lo que solo puede restringir los permisos del rol asumido.
El documento es validado en el camino y almacenado con la sesión — un documento inválido falla la llamada con INVALID_INPUT en lugar de ser ignorado. Las declaraciones toman la misma forma que en una política administrada, pero no llevan conditions; una política de sesión se limita a acciones y recursos solamente.
Show child attributes
Show child attributes
{
"version": "2024-01-01",
"statements": [
{
"effect": "allow",
"actions": ["storage:GetObject"],
"resources": [
"crn:storage:sa-saopaulo-1::bucket/reports/*"
]
}
]
}
Respuesta
Función asumida con éxito
Las credenciales de una sesión de rol, en ambas formas que se pueden presentar.
access_token es un token portador para esta API — envíelo como Authorization: Bearer <token>. Los otros cuatro campos son credenciales de AWS SigV4 para el punto final de almacenamiento de objetos compatible con S3, que no dice nada más.
Ambos provienen de la misma sesión y comparten su vencimiento, por lo que revocar la sesión detiene a ambos a la vez. Utilice cualquiera que sea el punto final que está llamando; no hay necesidad de elegir uno en el momento de la solicitud.
Token portador para la API de Basaltic. Presencia en cada sesión de rol.
"eyJhbGciOiJFUzI1NiIsInR5cCI6ImF0K2p3dCIsImtpZCI6Ii4uLiJ9..."
Siempre Bearer cuando access_token está presente.
"Bearer"
Segundos hasta que access_token expira.
3600
Id de clave de acceso SigV4, para el punto final S3.
"AKIA..."
Secreto SigV4, para el punto final S3.
"wJalrXUtnFEMI..."
Token de sesión SigV4, para el punto final S3. Enviar como X-Amz-Security-Token e incluirlo en SignedHeaders.
"FwoGZXIvYXdzE..."
Cuando la sesión —y por lo tanto ambos formularios de credenciales— caduca.
"2026-01-15T09:30:00Z"
UUID de la cuenta propietaria del rol de destino.
Identificador de cuenta de propietario del rol de destino.
UUID inmutable del rol asumido.

