IBM Cloud で IMS_TOKEN を取得する


# ibmcloud コマンドから取得

## IAM_TOKEN を取得

```shell:

export IAM_TOKEN=`ibmcloud iam oauth-tokens | head -n 1 | awk '{print $4}'`
```

## IAM_TOKEN を使って IMS_TOKEN を取得
`IAM_TOKEN` を使って、IaaS (SoftLayer API) で認証可能な `IMS_TOKEN` を取得できます。

```shell:

export IMS_TOKEN=`curl -s -u 'bx:bx' -k -X POST \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Accept: application/json' \
-d "grant_type=urn:ibm:params:oauth:grant-type:derive&access_token=$IAM_TOKEN&response_type=ims_portal" \
https://iam.cloud.ibm.com/identity/token | jq -r .ims_token`

export IMS_USER_ID=`curl -s -u 'bx:bx' -k -X POST \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Accept: application/json' \
-d "grant_type=urn:ibm:params:oauth:grant-type:derive&access_token=$IAM_TOKEN&response_type=ims_portal" \
https://iam.cloud.ibm.com/identity/token | jq -r .ims_user_id`
```

上記の方法で `IAM_TOKEN` を取得した場合、 IBM id に紐づく IMS アカウントを指定して `IMS_TOKEN` を取得することもできます。

```shell:

export IMS_TOKEN=`curl -s -u 'bx:bx' -k -X POST \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Accept: application/json' \
-d "grant_type=urn:ibm:params:oauth:grant-type:derive&access_token=$IAM_TOKEN&ims_account=xxxxxxx&response_type=ims_portal" \
https://iam.cloud.ibm.com/identity/token | jq -r .ims_token`
```

```json:result.json

{
  "ims_token": "***",
  "ims_user_id": xxxxxxx,
  "token_type": "Bearer",
  "expires_in": 3130,
  "expiration": 1594400735
}
```

# API_KEY から取得
API_KEY を準備します。

```shell:

ibmcloud iam api-key-create khayama-test -d "for token test" --file khayama-test-api-key.json
export IAM_API_KEY =`cat khayama-test-api-key.json |  jq -r '.apikey'`
export IAM_API_URL="https://iam.cloud.ibm.com/identity/token"
```

## API_KEY を使って IMS_TOKEN を取得
API_KEY から `IMS_TOKEN` を発行できます。

```shell:

export IMS_TOKEN=`curl -s -u "bx:bx" -k -X POST \
--header "Content-Type: application/x-www-form-urlencoded" \
--header "Accept: application/json" \
-d "grant_type=urn:ibm:params:oauth:grant-type:apikey&response_type= ims_portal&apikey=$IAM_API_KEY" \
"$IAM_API_URL" | jq -r .ims_token`
```

## IAM_TOKEN を取得
API_KEY からアカウントに閉じた `IAM_TOKEN` を発行できます。
> account-specific token that was created using an API key

```shell:

export IAM_TOKEN=`curl -s -u "bx:bx" -k -X POST \
--header "Content-Type: application/x-www-form-urlencoded" \
--header "Accept: application/json" \
-d "grant_type=urn:ibm:params:oauth:grant-type:apikey&response_type=cloud_iam&apikey=$IAM_API_KEY" \
"$IAM_API_URL" | jq -r .access_token`
```

```json:result.json

{
  "access_token": "***",
  "refresh_token": "***",
  "ims_user_id": xxxxxxx,
  "token_type": "Bearer",
  "expires_in": 3600,
  "expiration": 1594399799,
  "scope": "ibm openid"
}
```

## IAM_TOKEN を使って IMS_TOKEN を取得
`IAM_TOKEN` を使って、IaaS (SoftLayer API) で認証可能な `IMS_TOKEN` を取得できます。

```shell

export IMS_TOKEN=`curl -s -u 'bx:bx' -k -X POST \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Accept: application/json' \
-d "grant_type=urn:ibm:params:oauth:grant-type:derive&access_token=$IAM_TOKEN&response_type=ims_portal" \
https://iam.cloud.ibm.com/identity/token | jq -r .ims_token`
```

# IMS_TOKEN を使った IaaS (SoftLayer API) 操作例

```shell

curl -u $IMS_USER_ID:$IMS_TOKEN 'https://api.softlayer.com/mobile/v3.1/SoftLayer_Account/getObject'
```

# 参考

- [Authenticating to the SoftLayer API - https://sldn.softlayer.com/](https://sldn.softlayer.com/article/authenticating-softlayer-api/)