钉钉微应用接入钉钉免登陆配置记录。NET实现
在這里記錄一下我配置的釘釘接入微應用遇到的坑。搞了我幾天天才調通。頭皮發麻,現在梳理一下,以免別人也入坑。
1.釘釘接入主要要獲取釘釘企業員工的ID,然后去自己的應用的數據庫里進行匹配然后實現免登陸的操作。
2.這里面主要有2個重要操作:一個是鑒權,一個是免登。如果只是簡單的免登操作,其實不需要鑒權的,鑒權的目的是為了可以調用其他jsapi接口使用釘釘其他接口。
3.如果要鑒權,要放在免登操作的前面。
4.下面是釘釘上文檔找來的圖片,這張圖的已經有點落伍了,圖上的CorpSecret已經沒有了。獲取Token已經變成通過AgentId和AppSecret來獲得,具體看下文。
?
?5.下面來說一下從頭到位的具體流程
a.首先登陸釘釘創建應用,獲取到4個我們要用到的重要的值:corpId,AgentId,AppKey,AppSecret, 這個四個值分別為企業ID,應用ID,應用Key,應用密鑰。
b.我們來說下這個四個值的作用:企業ID?corpId 是為了獲取Code碼,Code碼是為了獲取到用戶的基礎信息UserId,然后通過UserId,就可以獲取到完整的信息。AppKey和AppSecret是為了獲取Token值,前面Code 和userId要獲取用戶的信息必須要和Token一起才能獲取用戶信息。
6.現在來看一下具體的獲取Token操作
public string GetDingToken(){string token = string.Empty;if (string.IsNullOrEmpty(token)){string url = string.Format("https://oapi.dingtalk.com/gettoken?corpid={0}&corpsecret={1}", _appId, _appSecret);string json = HttpHelper.GetDataGetHtml(url);//HTTP請求的幫助類,這個類跟本文沒有關系,就不貼上來了。Access_Token access_token = JsonHelper.JsonDeserialize<Access_Token>(json);token = access_token.access_token;}return token;}
7.獲取通過Code基礎信息的操作(獲取的信息非常有限只有一個userId有用為了獲取整個用戶的信息)
public Access_UserInfo GetUserInfo(string code){string url = string.Format("https://oapi.dingtalk.com/user/getuserinfo?access_token={0}&code={1}", GetDingToken(), code);string json = HttpHelper.GetDataGetHtml(url);return JsonHelper.JsonDeserialize<Access_UserInfo>(json);}8.通過 userId獲取釘釘用戶信息的操作(關于免登陸的操作相關的后臺代碼就這些了,剩下還有鑒權相關的一些代碼后臺代碼和前臺獲獲取Code的一些前端請求代碼)
public DingUser GetUeser(string uid){string url = string.Format("https://oapi.dingtalk.com/user/get?access_token={0}&userid={1}", GetDingToken(), uid);string json = HttpHelper.GetDataGetHtml(url);return JsonHelper.JsonDeserialize<DingUser>(json);}
?9.鑒權的前端配置代碼(這里要先引用釘釘JS文件,以前區分手機可客戶端后來不區分了)
dd.config({agentId: '', // 必填,微應用IDcorpId: '',//必填,企業IDtimeStamp: , // 必填,生成簽名的時間戳nonceStr: '', // 必填,生成簽名的隨機串signature: '', // 必填,簽名type:0/1, //選填。0表示微應用的jsapi,1表示服務窗的jsapi;不填默認為0。該參數從dingtalk.js的0.8.3版本開始支持 jsApiList : ['runtime.info','biz.contact.choose','device.notification.confirm','device.notification.alert','device.notification.prompt','biz.ding.post','biz.util.openLink',] // 必填,需要使用的jsapi列表,注意:不要帶dd。 });這個幾個的參數說明上面已經有備注,這些需要從后臺返回這些參數。agentId,和CorpId是現成的,timeStamp生成一個就好了,nonceStrye也是隨機生成的一個編碼,
,主要是signature是需要幾個參數拼成一起生成的。下面看看鑒權的后臺代碼(signature需要ticket+noncestr+timestamp+當前url一起生成)JSAPI鑒權官方文檔
下面是NET實現的代碼
private Access_Sdk GetSdk(string url){string noncestr = GuidTo16String();string timestamp = DateTime.Now.Ticks.ToString();Access_Ticket access_Ticket = GetTicket();string str1 = "jsapi_ticket=" + access_Ticket.ticket + "&noncestr=" + noncestr + "×tamp=" + timestamp + "&url=" + url + "";string signature = str1.Sha1();Access_Sdk sdk = new Access_Sdk();sdk.Noncestr = noncestr;sdk.Timestamp = timestamp;sdk.Signature = signature;return sdk;}這段代碼主要有2個要說明的地方一個就是生成Ticket,一個就是 Sha1進行編碼。
生成Ticket的編碼
private Access_Ticket GetTicket(){string url = string.Format("https://oapi.dingtalk.com/get_jsapi_ticket?access_token={0}", GetDingToken());string json = HttpHelper.GetDataGetHtml(url);return JsonHelper.JsonDeserialize<Access_Ticket>(json);}sha1加密
public static string Sha1(this string str){var buffer = Encoding.UTF8.GetBytes(str);var data = SHA1.Create().ComputeHash(buffer);var sb = new StringBuilder();foreach (var t in data){sb.Append(t.ToString("X2"));}return sb.ToString().ToLower();}后臺的主要代碼我都貼上了,下面貼下前臺的獲取Code的代碼
dd.ready(function() {dd.runtime.permission.requestAuthCode({corpId: _config.corpId, // 企業id onSuccess: function (info) {code = info.code // 通過該免登授權碼可以獲取用戶身份 }}); });?
到這里就結束了,本來想寫的詳細點,但是感覺還挺難得,其實這個東西不難,主要是第一次搞的時候,沒有清楚的文檔,遇到一兩個坑很煩人。心態都爆炸了。
后面我盡量放一份完整的demo實例上來,說的不清楚的大家可以留言,我一定會回復的。
?
轉載于:https://www.cnblogs.com/DingKing/p/10500246.html
總結
以上是生活随笔為你收集整理的钉钉微应用接入钉钉免登陆配置记录。NET实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2018-08-13 Head Firs
- 下一篇: IOS mac入门