C#开发BIMFACE系列3 服务端API之获取应用访问凭证AccessToken
BIMFACE 平台为开发者提供了大量的服务器端 API 与 JavaScript API,用于二次开发 BIM 的相关应用。
BIMFACE 所有的 RESTful API 都有对应的鉴权机制保护,目前 BIMFACE 支持两种鉴权方式:
- Access token
-
代表自身应用的身份,使用应用的 appkey, secret,通过调用/oauth2/token接口获取。
- View token
-
代表对单个模型/集成模型/模型对比的访问权限,使用 access token,通过调用/view/token或其他相关接口获得。
使用 Access token,可以对自己应用内的文件发起文件上传,下载,删除,模型转换,模型集成,模型对比等操作, 同时也能访问所有 BIMFACE 的数据接口获取转换后的模型BIM信息;而 View token 只代表对单个模型/集成模型/模型对比的临时的访问凭证, 只能访问对应模型的数据接口,通过使用应用的 Access token 调用下面的接口可以获得。 通常情况下,View token 可以直接传入前端 JSSDK 用来加载/浏览模型。
Access token 有效期为7天, 除非 token 被注销,Access token 在7天内不会发生改变; 而 View token 只是一个临时的访问凭证,有效期为12小时。但是为了减少用户重复请求 View token 的次数, 每次使用 View token 都会重置有效期为12小时。这样如果你的模型持续有人访问,View token 会一直有效, 只有在12小时内,没有使用 View token 的任何调用,View token 才会失效。
Access token 只能使用 appkey, secret 通过/oauth2/token接口获取; 类似的,View token 必须通过有效的 Access token 并提供对应的源文件Id以及集成模型Id信息来获取。
获取 Access token 接口中使用的 Authorization,是将字符串 appKey:appSecret 拼接后(中间用冒号连接),对其进行BASE64编码, 然后在编码后的字符串前添加字符串Basic和一个空格, 即:“Basic [Base64Encode(“appKey:appSecret”)]“。
其他接口中使用的 Header Authorization, 是将你的 Access token 的字符串前添加字符串bearer和一个空格,
即:“bearer [access token]" 。
BASE64编码与解码的方法:
/// <summary> /// 使用 UTF8 编码格式,对字符串进行进行 Base64 方式编码(加密) /// </summary> /// <param name="this">扩展对象</param> /// <returns>编码后的字符串</returns> public static string EncryptByBase64(this string @this) { byte[] bytes = Encoding.UTF8.GetBytes(@this); return Convert.ToBase64String(bytes); }
/// <summary> /// 使用 UTF8 编码格式,对字符串进行进行 Base64 方式解码(解密) /// </summary> /// <param name="this">扩展对象</param> /// <returns>解码后的字符串</returns> public static string DecryptByBase64(this string @this) { byte[] bytes = Convert.FromBase64String(@this); return Encoding.UTF8.GetString(bytes); }
请求地址:POST https://api.bimface.com/oauth2/token
说明:在调用其他API之前,必须先获取Access Token。Access Token的有效期为7天。
参数:
获取AccessToken的方法:
1 /// <summary> 2 /// 获取访问服务端其他API的令牌 3 /// </summary> 4 /// <param name="appKey">秘钥</param> 5 /// <param name="appSecret">密码</param> 6 /// <returns></returns> 7 public AccessTokenResponse GetAccessToken(string appKey, string appSecret) 8 { 9 //POST https://api.bimface.com/oauth2/token 10 string url = BimfaceConstants.API_HOST + "/oauth2/token"; 11 12 BimFaceHttpHeaders headers = new BimFaceHttpHeaders(); 13 headers.AddBasicAuthHeader(appKey, appSecret); 14 15 try 16 { 17 AccessTokenResponse response; 18 HttpManager httpManager = new HttpManager(headers); 19 HttpResult httpResult = httpManager.Post(url); 20 if (httpResult.Status == HttpResult.STATUS_SUCCESS) 21 { 22 response = httpResult.Text.DeserializeJsonToObject<AccessTokenResponse>(); 23 } 24 else 25 { 26 response = new AccessTokenResponse 27 { 28 Message = httpResult.RefText 29 }; 30 } 31 32 return response; 33 } 34 catch (Exception ex) 35 { 36 throw new Exception("获取 AccessToken 时发生异常!", ex); 37 } 38 }
在网页中测试上面的方法:
1 /// <summary> 2 /// 获取 AccessToken 3 /// </summary> 4 protected void btnGetAccessToken_Click(object sender, EventArgs e) 5 { 6 string token = string.Empty; 7 string appKey = ConfigUtility.GetAppSettingValue("BIMFACE_AppKey"); 8 string appSecret = ConfigUtility.GetAppSettingValue("BIMFACE_AppSecret"); 9 10 IBasicApi api = new BasicApi(); 11 AccessTokenResponse response = api.GetAccessToken(appKey, appSecret); 12 if (response != null) 13 { 14 token = response.Data.Token; 15 } 16 }
在监视窗口中可以看到,接口调用返回了正确的结果:
在调试窗口中也可以看到正确的响应结果:
上述方法中调用到的 httpManger.Post(url)方法
1 /// <summary> 2 /// HTTP-POST方法,(不包含body数据)。 3 /// 发送 HTTP 请求并返回来自 Internet 资源的响应(HTML代码) 4 /// </summary> 5 /// <param name="url">请求目标URL</param> 6 /// <returns>HTTP-POST的响应结果</returns> 7 public HttpResult Post(string url) 8 { 9 return RequestString(url, null, WebRequestMethods.Http.Post, null); 10 }
1 /// <summary> 2 /// HTTP请求(包含文本的body数据) 3 /// </summary> 4 /// <param name="url">请求目标URL</param> 5 /// <param name="data">主体数据(普通文本或者JSON文本)。如果参数中有中文,请使用合适的编码方式进行编码,例如:gb2312或者utf-8</param> 6 /// <param name="method">请求的方法。请使用 WebRequestMethods.Http 的枚举值</param> 7 /// <param name="contentType"><see langword="Content-type" /> HTTP 标头的值。请使用 ContentType 类的常量来获取</param> 8 /// <returns></returns> 9 private HttpResult RequestString(string url, string data, string method, string contentType) 10 { 11 HttpResult httpResult = new HttpResult(); 12 HttpWebRequest httpWebRequest = null; 13 14 try 15 { 16 httpWebRequest = WebRequest.Create(url) as HttpWebRequest; 17 httpWebRequest.Method = method; 18 httpWebRequest.Headers = HeaderCollection; 19 httpWebRequest.CookieContainer = CookieContainer; 20 if (!string.IsNullOrWhiteSpace(contentType)) 21 { 22 httpWebRequest.ContentType = contentType;// 此属性的值存储在WebHeaderCollection中。如果设置了WebHeaderCollection,则属性值将丢失。所以放置在Headers 属性之后设置 23 } 24 httpWebRequest.UserAgent = _userAgent; 25 httpWebRequest.AllowAutoRedirect = _allowAutoRedirect; 26 httpWebRequest.ServicePoint.Expect100Continue = false; 27 28 if (data != null) 29 { 30 httpWebRequest.AllowWriteStreamBuffering = true; 31 using (Stream requestStream = httpWebRequest.GetRequestStream()) 32 { 33 requestStream.Write(EncodingType.GetBytes(data), 0, data.Length);//将请求参数写入请求流中 34 requestStream.Flush(); 35 } 36 } 37 38 HttpWebResponse httpWebResponse = httpWebRequest.GetResponse() as HttpWebResponse; 39 if (httpWebResponse != null) 40 { 41 GetResponse(ref httpResult, httpWebResponse); 42 httpWebResponse.Close(); 43 } 44 } 45 catch (WebException webException) 46 { 47 GetWebExceptionResponse(ref httpResult, webException); 48 } 49 catch (Exception ex) 50 { 51 GetExceptionResponse(ref httpResult, ex, method, contentType); 52 } 53 finally 54 { 55 if (httpWebRequest != null) 56 { 57 httpWebRequest.Abort(); 58 } 59 } 60 61 return httpResult; 62 }
成在管理,败在经验;嬴在选择,输在不学! 贵在坚持!
个人作品
BIMFace.SDK.NET
开源地址:https://gitee.com/NAlps/BIMFace.SDK
系列博客:https://www.cnblogs.com/SavionZhang/p/11424431.html
系列视频:https://www.cnblogs.com/SavionZhang/p/14258393.html
技术栈
1、Visual Studio、.NET Core/.NET、MVC、Web API、RESTful API、gRPC、SignalR、Java、Python
2、jQuery、Vue.js、Bootstrap、ElementUI
3、数据库:分库分表、读写分离、SQLServer、MySQL、PostgreSQL、Redis、MongoDB、ElasticSearch、达梦DM
4、架构:DDD、ABP、SpringBoot、jFinal
5、环境:跨平台、Windows、Linux、Nginx
6、移动App:Android、IOS、HarmonyOS、微信小程序、钉钉、uni-app、MAUI
分布式、高并发、云原生、微服务、Docker、CI/CD、DevOps、K8S;Dapr、RabbitMQ、Kafka、RPC、Elasticsearch。
欢迎关注作者头条号 张传宁IT讲堂,获取更多IT文章、视频等优质内容。
出处:www.cnblogs.com/SavionZhang
作者:张传宁 技术顾问、培训讲师、微软MCP、系统架构设计师、系统集成项目管理工程师、科技部创新工程师。
专注于企业级通用开发平台、工作流引擎、自动化项目(代码)生成器、SOA 、DDD、 云原生(Docker、微服务、DevOps、CI/CD);PDF、CAD、BIM 审图等研究与应用。
多次参与电子政务、图书教育、生产制造等企业级大型项目研发与管理工作。
熟悉中小企业软件开发过程:可行调研、需求分析、架构设计、编码测试、实施部署、项目管理。通过技术与管理帮助中小企业实现互联网转型升级全流程解决方案。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如有问题,可以通过邮件905442693@qq.com联系。共同交流、互相学习。
如果您觉得文章对您有帮助,请点击文章右下角【推荐】。您的鼓励是作者持续创作的最大动力!