大多数朋友刚开始接触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。 阿里云
注: