Aruba Central利用REST API建立訪客帳號

在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除錯。

  1. 關鍵資訊
    1. Customer_ID
    2. username、password
    3. Base_URL
    4. client_id、client_secret 、redirect_url
    5. access_token
    6. Portal_id
  2. 步驟
    1. 取得Portal ID
      1. Aruba Central Web版的API操作
    2. 確認Portal使用Username&Password驗證訪客身份。
      1. Guests > Splash Pages
    3. 利用REST API,登入並建立臨時TOKEN。
    4. 利用REST API與臨時TOKEN,在特定Portal建立訪客帳號。
    5. 產生訪客帳號時,出現Error Code 500

關鍵資訊

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