在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可能是因爲訪客帳號已經註冊過了
