利用 Curl.exe 提交 Box 的 JWT 請求獲取 Access Token
這邊比較難搞的是JWT,比較無腦一點就是直接載人家函式來弄,編碼之後會變成一長串文字,由Post送出去呼叫伺服器的API。
下面是用 PowerShell 寫的 Curl 請求代碼。這邊要注意一個坑是如果沒有加上 .exe 的話預設會呼叫內建的指令,內建會直接回傳 PowerShell 物件而不是文字,然後參數用法有不同不能直接換過去。
請求 Access Token 的指令
function RequestBoxToken {
param (
[string]$Assertion,
[string]$ConfigPath
)
# Read configuration from JSON file
$configContent = Get-Content $ConfigPath -Raw
$config = ConvertFrom-Json $configContent
# Generate Request queryString
$url = 'https://api.box.com/oauth2/token'
$proxyUrl = $env:http_proxy
$response = curl.exe `
-x $proxyUrl `
-X POST $url `
-d 'grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer' `
-d "assertion=$Assertion" `
-d "client_id=$($config.boxAppSettings.clientID)" `
-d "client_secret=$($config.boxAppSettings.clientSecret)"
# RequestBoxAccessToken
$response = ConvertFrom-Json $response
return $response
}
$assertion 是 JWT 簽名後的字串,要快速看內容有網站可以看
JSON Web Tokens - jwt.io
$config 是直接從BOX上抓下來的Json檔案,他格式大概會長這樣子
{
"boxAppSettings": {
"clientID": "clientID",
"clientSecret": "clientSecret",
"appAuth": {
"publicKeyID": "publicKeyID",
"privateKey": "-----BEGIN ENCRYPTED PRIVATE KEY-----\nSTRING\n-----END ENCRYPTED PRIVATE KEY-----",
"passphrase": "secret_passphrase"
}
},
"enterpriseID": "enterpriseID"
}
裡面包含私鑰會需要用這個私鑰簽名,才能組合出JWT。
然後其實$config有點多餘的,因為JWT裡面是有包含client_id跟url的,唯一有需要的是client_secret這個沒有被包進去,只是要把JWT解包有點麻煩,懶人法就直接再傳一次了。
Python對應的方法
import requests
import os
import json
def request_box_token(assertion, config_path):
# 讀取設定檔
with open(config_path, 'r') as file:
config = json.load(file)
url = 'https://api.box.com/oauth2/token'
# 設置代理
http_proxy = os.getenv('http_proxy')
https_proxy = os.getenv('https_proxy')
proxies = {}
if http_proxy:
proxies['http'] = http_proxy
if https_proxy:
proxies['https'] = https_proxy
payload = {
'grant_type': 'urn:ietf:params:oauth:grant-type:jwt-bearer',
'assertion': assertion,
'client_id': config['boxAppSettings']['clientID'],
'client_secret': config['boxAppSettings']['clientSecret']
}
response = requests.post(url, data=payload, proxies=proxies if proxies else None)
return response.json()
# 使用方法
assertion = '你的assertion'
config_path = 'config.json' # 設定檔路徑
response = request_box_token(assertion, config_path)
print(response)