大多數朋友剛開始接觸Autodesk Forge,源於‘網頁瀏覽和管理模型’的需求,即,使用Forge的模型轉換服務和前端Forge Viewer。模型的來源一般是開發者利用Forge數據管理服務建立bucket,上傳模型。而這種方式意味着其應用程序(app)是該模型(數據)擁有者。前端
但在不少場景,模型源並非app全部,而是存儲和管理在某些其它雲應用中,例如BOX,DropBox,百度盤,阿里雲盤,或者Autodesk的BIM 360, Fusion 360。這些雲應用的用戶擁有其數據的權限。Forge的app 要對這些模型訪問或操做的話,則要其它雲應用的用戶進行受權,拿到受權後,才能訪問或操做數據(取決於受權的範圍)。這就是通行的oAuth2.0。在咱們日常使用支付驗證的時候,也是這個機制。推薦閱讀這篇文章,對oAuth作了精煉的講解:
https://www.jianshu.com/p/639...node
簡言之,典型的流程是,app發起一個請求,讓用戶在第三方雲應用登陸和受權,給予app必定範圍的數據權限(此過程所有導向第三方,app沒法干預和定製),當用戶完成受權過程後,第三方雲應用將會給app傳回一個受權碼(code)。藉此,app繼續調用第三方的雲服務API,獲取到最終的token。由於有三步走 (發起,受權,獲取token),這也就是爲什麼常常把這樣的token叫作三條腿token。前面提到的建立bucket,自行上傳模型相關的token,叫作兩條腿token。git
Forge全球資料有個教材演示如何一步步的搭建app,訪問Autodesk雲應用數據。
http://learnforge.autodesk.io...github
本文對其中受權認證過程稍微再講解一下:api
1.首先,Autodesk的雲應用也提供了oAuth機制,底層是Forge的身份認證服務(你們常常用它來獲取token)。例如app訪問和操做BIM 360客戶的數據,發起請求的過程,還要有一個回調端口監聽來自Forge認證服務傳回的受權碼。而回調端口必須在建立app的時候設置好。若是您的app只有兩條腿token的須要,此項隨便給一個scheme://host 形式的字串便可。session
2.下載教材提供的完整代碼工程 (以Node.js爲例):app
https://github.com/Autodesk-Forge/learn.forge.viewhubmodels/tree/nodejs
打開工程,定位到config.js,填寫對應的Client ID, Client Secret 和Callback URL (通常設置爲環境變量)。async
3.此工程定義好的發起受權請求的端口在oauth.js中。它實際上是拼接了一個URL,傳回客戶端,讓客戶端訪問。此URL帶有app的client id,受權方式 (response_type=code),回傳地址和受權的權限範圍。當發起請求,Forge認證服務會和app註冊是對應的信息最比對,所以,必須保證client id和回傳地址和app註冊信息一致。函數
router.get('/oauth/url', (req, res) => { const url = 'https://developer.api.autodesk.com' + '/authentication/v1/authorize?response_type=code' + '&client_id=' + config.credentials.client_id + '&redirect_uri=' + config.credentials.callback_url + '&scope=' + config.scopes.internal.join(' '); res.end(url); });
router.get('/callback/oauth', async (req, res, next) => { //從Autodesk認證傳回的受權碼,用於獲取最終的token const { code } = req.query; const oauth = new OAuth(req.session); try { await oauth.setCode(code); res.redirect('/'); } catch(err) { next(err); } });
token有兩個,一個是執行其餘API操做的token(和兩條腿的token相似,JWT),有效期也是60分鐘。而另一個是refresh token(用戶受權令牌),用於保留用戶受權,有效期14天。因此,當用戶受權一次後,並不用每次都有受權過程,在refresh token有效期間,能夠用此再調用Forge API獲取新的訪問token。 阿里雲
注: