以前寫過一個基於簽名的公網API訪問安全控制,另外一種方式是基於OAuth認證協議作安全控制。api
用戶訪問A客戶端,使用B的服務及資源。B只有徵得用戶的受權,才容許A客戶端使用B上用戶的資源和服務。瀏覽器
第三方客戶端,A客戶端。安全
服務提供商,B服務。服務器
資源全部者,用戶。app
用戶代理,好比瀏覽器。url
認證服務器,B服務上用來提供認證的服務器。.net
資源服務器,B服務上用來存儲用戶的資源的服務器。代理
經過一個權限配置管理界面,業務方配置以後,獲取appid,secret,redirect_url。code
經過受權獲取受權碼。blog
經過受權碼+appid+secret獲取access_token。
經過access_token操做api。
客戶端不直接登錄服務提供商,只登錄受權層,以此將用戶與客戶端區分開。
客戶端登錄受權層所用的令牌,與用戶的密碼不一樣。用戶能夠在登錄的時候,指定受權層令牌的受權範圍和有效期。
客戶端登錄受權層,服務提供商根據令牌的權限範圍和有效期,向客戶端開發對應服務。
用戶打開客戶端,客戶端要求用戶給予受權。
用戶贊成給予客戶端受權。
客戶端使用上一步獲取的受權,向認證服務器申請令牌。
認證服務器對客戶端進行認證後,確認無誤,贊成發放令牌。
客戶端使用令牌,向資源服務器申請獲取資源。
資源服務器確認令牌無誤,贊成向客戶端開發資源。
]
客戶端受權:
/authorize/app-connect?appid=APPID&redirect_url=xxx&response_type=code&state=xxx
驗證經過,受權服務器重定向到配置的REDIRECT_URL&code=xxx 受權碼
經過受權碼獲取access_token:
/authorize/access-token?appid=APPID&secret=SECRET&code=受權碼&grant_type=authorization_code
驗證經過,返回access_token,refresh_token,expires_in(過時時間戳)
經過refresh_token更新access_token:
/authorize/refresh-token?appid=APPID&grant_type=refresh_token&refresh_token=xxx
驗證經過,返回新的access_token,refresh_token,更新成功