在AOS8利用Script建立訪客帳號的客戶有好幾個,好處是可以定時更換,不會一直用同一個,定期執行也可以減少網管人員的日常負擔。
上到Central之後,沒有internal DB可以儲存資料,而且也無法透過SSH到Central進行設定,SSH連進Mobility Gateway也無法調整。
Central少了傳統的CLI操作,但卻有提供REST API可以使用,如果能使用REST API操作,就能用Script去調整Central上的設定,或是新增訪客帳號。
Central訪客帳號是隨着Guest Network每個獨立,意即可看成每個訪客網路都有一個專屬的訪客帳密資料庫。以往訪客資料庫都是共享或混用,Central讓訪客網路都擁有獨立的資料庫可以避免訪客帳號與其他帳號混淆。
接下來,本文章將示範如何在指定的Guest Network中新增一個Visitor,程式語言使用python。
Central REST API限制每個應用只能30分鐘存取一次。 在部署探索階段時,可以新增多個應用,並產生多個Access Token。方便進行Script除錯。
關鍵資訊
Customer_ID

username、password
用於登入HPE GreenLake的帳號與密碼,將用於在每次存取時產生新的Token,Token有效期限爲7200秒。
Base_URL
Aruba Central部署的地區不同,就會有不同的網址。
需要依據Aruba Central部署地區,並從以下網址查詢Base_URL。

https://developer.arubanetworks.com/hpe-aruba-networking-central/docs/api-oauth-access-token
client_id、client_secret 、redirect_url
應用程式使用Token需要填入的資訊。
左鍵雙擊值,可以正確選取該格所有文字,再複製貼上到程式碼中。


access_token
REST API發出請求時,需要帶入有效的Access Token,才能進行操作。
如果有產生新token,會以json格式回傳token資訊。可從Download Token取得該Token資訊。

Portal_id
訪客網路的Portal ID,可以透過API查詢,該值不會更改。
可以參考步驟,取得目標Portal的ID。
步驟
取得Portal ID
Aruba Central Web版的API操作

點擊連結,選擇自己的Workspace,最終會轉導到以下頁面

切換CATEGORY到「Guest」。
輸入有效的Access Token,按下 ACCESS TOKEN旁的「→」,將ACCESS TOKEN帶入到參數中。
選擇Portals > Get all portals with limited data。
offset填入0。
視窗往下捲動,按下「TRY」,發送API。

如果我要在Guset Network中的「jn」新增訪客帳號,複製其id爲portal_id。

"id": "014bf903-7a5f-4e65-8e0e-adffec9e0e0e"
確認Portal使用Username&Password驗證訪客身份。
Guests > Splash Pages
要用API新增的Guest帳號的Portal,Type需要爲「Username/Password」。


利用REST API,登入並建立臨時TOKEN。
透過三個步驟,建立臨時Toekn。完成之後,可以透過臨時Token去執行其他API。
以下程式碼透過ChatGPT搭配API Reference Guide寫出。
💡範例的Aruba Central部署在APAC East。
import requests
import base64
customer_id = ""
username = ""
password = ""
client_id = ""
client_secret = ""
redirect_uri = ""
# 基礎 URL(請根據您的實際 API 網關替換)
base_url = "<https://apigw-apaceast.central.arubanetworks.com>"
# 創建一個會話對象以保持 cookies
session = requests.Session()
# 第一步:使用用戶憑據進行身份驗證並創建用戶會話
def authenticate_user():
login_endpoint = '/oauth2/authorize/central/api/login'
login_url = f"{base_url}{login_endpoint}?client_id={client_id}"
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
payload = {
'username': username,
'password': password
}
response = session.post(login_url, headers=headers, json=payload)
if response.status_code == 200:
print('登入成功!')
# 從 cookies 中獲取 CSRF 和 Session 令牌
csrf_token = session.cookies.get('csrftoken')
session_token = session.cookies.get('session')
return csrf_token,session
else:
print('登入失敗,狀態碼:', response.status_code)
print('響應內容:', response.text)
return None
# 第二步:生成授權碼
def generate_authorization_code(session, csrf_token):
authorize_endpoint = '/oauth2/authorize/central/api'
authorize_url = f"{base_url}{authorize_endpoint}"
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-CSRF-Token': csrf_token,
'Cookie': f'session={session.cookies.get("session")}'
}
params = {
'client_id': client_id,
'response_type': 'code',
'scope': 'all'
}
payload = {
'customer_id': customer_id
}
response = session.post(authorize_url, headers=headers, params=params, json=payload)
if response.status_code == 200:
auth_code = response.json().get('auth_code')
if auth_code:
print('獲取授權碼成功!')
return auth_code
else:
print('未在響應中找到授權碼。')
print('響應內容:', response.text)
return None
else:
print('獲取授權碼失敗,狀態碼:', response.status_code)
print('響應內容:', response.text)
return None
# 第三步:使用授權碼獲取訪問令牌
def get_access_token(session, auth_code):
token_endpoint = '/oauth2/token'
token_url = f"{base_url}{token_endpoint}"
# 使用 Basic Auth 進行身份驗證
auth_str = f"{client_id}:{client_secret}"
b64_auth_str = base64.b64encode(auth_str.encode('utf-8')).decode('utf-8')
headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': 'application/json',
'Authorization': f"Basic {b64_auth_str}"
}
payload = {
'grant_type': 'authorization_code',
'code': auth_code,
'redirect_uri': redirect_uri # 如果需要
}
response = session.post(token_url, headers=headers, data=payload)
if response.status_code == 200:
response_data = response.json()
access_token = response_data.get('access_token')
refresh_token = response_data.get('refresh_token')
print('獲取訪問令牌成功!')
print('訪問令牌:', access_token)
return access_token, refresh_token
else:
print('獲取訪問令牌失敗,狀態碼:', response.status_code)
print('響應內容:', response.text)
return None, None
# 主程序執行
def main():
csrf_token, s1 = authenticate_user()
if csrf_token:
auth_code = generate_authorization_code(s1, csrf_token)
if auth_code:
access_token, refresh_token = get_access_token(s1, auth_code)
if __name__ == "__main__":
main()
利用REST API與臨時TOKEN,在特定Portal建立訪客帳號。
在上方經過API查詢,已經得到目標Portal id,在建立訪客帳號時需要帶入。
username跟password依照需求調整。
其餘payload參數可以參考以下網址 https://developer.arubanetworks.com/hpe-aruba-networking-central/reference/apiviewsexternal_apicreate_api_visitor
def create_visitor(access_token, portal_id):
url = "{:}/guest/v1/portals/{:}/visitors".format(base_url, portal_id)
username, password = "username", "yourpassword"
payload = {
"name": username,
"is_enabled": True,
"valid_till_days": 1,
"password": password
}
headers = {
"accept": "application/json",
"content-type": "application/json",
"authorization": "Bearer "+access_token
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)

如果執行成功,會回傳新增的訪客帳號的ID。
然後可以上Aruba Central查看到新增的訪客帳號。

產生訪客帳號時,出現Error Code 500
出現 Error code 500可能是因爲訪客帳號已經註冊過了
