openid 釘釘_釘釘開發入門,微應用識別用戶身份,獲取用戶免登授權碼code,獲取用戶userid,獲取用戶詳細信息...

最近有個需求,在釘釘內,點擊微應用,獲取用戶身份,根據獲取到的用戶身份去企業內部的用戶中心做校驗,校驗通過,相關子系統直接登陸;

就是在獲取這個用戶身份的時候,網上的資料七零八落的,找的人煩躁的很,所以自己記錄一下;

實現這個要求,有好幾種方式,使用ISV方式相對來說比較簡單一點,獲取的到的信息雖然沒有其他方式那么全,但是也包含了百分之七八十的信息,少了角色信息之類的;

效果:(demo的GIT地址在文末)

20180511192632550642.png

20180511192632909054.png

說說步驟:

20180511192633379776.png

這個首頁跳轉地址,信任了以后,就可以直接使用js-sdk來獲取用戶code等相關信息,最方便的一種.

如果是別的頁面,使用js-sdk 需要進行dd.config的初始化,這個初始化里面,包含了相關的權限校驗.

2.應用創建完了以后,會生成一個agentID,

如果僅僅只是為了獲取當前點擊用戶的信息,并且獲取的位置是在這個首頁地址的js里面,則大可以不用管這個信息,但是,如果需要更加復雜的操作,就需要獲取這個ID,獲取方法在創建完了以后,右上角的小三角下拉,有個設置,點進去就能看到

另外,關于js-sdk的需要鑒權的api信息查詢地址:jsapi列表(是否需要dd.config校驗)

列表里面不需要的接口調用,都不需要進行dd.config()

3.獲取釘釘開發的corpID和corpSecert

20180511192633508687.png

一般獲取上面的足夠.web sso免登可能需要下面的SSOSecert;

4.準備工作做完

現在我們有以下信息:

corpID:

corpSecert:

agentID:

url:這個url就是你需要獲取用戶code的那個頁面url

當然如果只是簡單的獲取用戶信息,不需要進行dd.config的話,可以不用管agrntID和url

5.進入開發(這里只是做獲取當前用戶信息的示例)

(1).前端頁面引入dingtalk.js

(2).在頁面添加 獲取code 的 js 代碼,

(3).將獲取的 code發送到后臺處理

后臺根據上一步返回的簡單的,包含userid的信息,拿到userid

(5).返回給前臺顯示,或者進行后續開發

貼一貼這個流程中關鍵一點的代碼:

前端頁面在引入js 后,或有一個dd的全局變量,這個就是js-sdk,如果需要權限校驗的,就要放在最前邊

dd.ready(function() {

dd.runtime.permission.requestAuthCode({

corpId :"這里是你的corpID",

onSuccess :function(result) {var code =result.code;

alert(code);

//將code 發往后臺處理

},

onFail :function(err) {

alert(‘出錯了, ‘ +err);

}

});

});

后臺處理部分:

AuthHelper.java 文末提供

在接收到授權碼以后:

String accessToken =AuthHelper.getAccessToken(CORP_ID, CORP_SECRET);

String user= AuthHelper.getUserInfo(code, accessToken);

當返回正確的時候,這個user 里面結果大致是這樣的:

{"errcode": 0,"errmsg": "ok","userid": "USERID","deviceId":"DEVICEID","is_sys": true,"sys_level": 0|1|2}

然后根據里面的userid,獲取詳細的用戶信息:

String userall = AuthHelper.getUser(userid, accessToken);

返貨正確的話,這個userall里面的結果大致是:(具體查看釘釘開發文檔)

{"errcode": 0,"unionid": "PiiiPyQqBNBii0HnCJ3zljcuAiEiE","openId": "PiiiPyQqBNBii0HnCJ3zljcuAiEiE","roles": [{"id": 23003585,"name": "財務","groupName": "職務"}],"remark": "備注","userid": "04232334556237185","isLeaderInDepts": "{1:false}","isBoss": false,"hiredDate": 1520265600000,"isSenior": false,"tel": "010-88996533","department": [1,2],"workPlace": "北京市朝陽區","email": "ceshi@aliyun.com","orderInDepts": "{1:71738366882504}","dingId": "$:LWCP_v1:$aTPvVHhhsCMtDZRQ1xbYGg==","mobile": "15901516821","errmsg": "ok","active": false,"avatar": "dingtalk.com/abc.jpg","isAdmin": false,"isHide": false,"jobnumber": "001","name": "測試名字","extattr": {},"stateCode": "86","position": "總監"}

然后簡單的獲取信息到此結束;

注意的是:

如果需要更多的操作,就需要在前端頁面進行dd.config的初始化,這個里面的所需要的sign,可以在后臺根據相關信息生成,是必不可少的,生成規則見AuthHelper.java(其他工具類見文末的 git 地址)

importjava.io.IOException;importjava.io.UnsupportedEncodingException;importjava.security.MessageDigest;importjava.security.NoSuchAlgorithmException;importjava.util.Formatter;importcn.jlhd.util.HttpHelper;importcn.jlhd.util.JsonUtil;importcn.jlhd.util.ReturnUtil;/***

* 1.獲取accessToken

* 2.獲取jsapi中的ticket

* 3.生成jsapiz中的鑒權sign

* 4.根據傳入的臨時code獲取用戶的基本信息,入userinfo

* 5.根據userid獲取詳細用戶信息

*

*@authorlnexin

**/

public classAuthHelper {//釘釘api相關

static String TOKEN_URL = "https://oapi.dingtalk.com/gettoken";static String TICKET_URL = "https://oapi.dingtalk.com/get_jsapi_ticket";static String USER_INFO_URL = "https://oapi.dingtalk.com/user/getuserinfo";static String USER_ALL_URL = "https://oapi.dingtalk.com/user/get";//調整到1小時50分鐘

public static final long cacheTime = 1000 * 60 * 55 * 2;private static String ACCESS_TOKEN = null;private static String JSAPI_TICKET = null;private static long LAST_TIME = 0;/***

*@paramcorpId

*@paramcorpSecert

*@return與釘釘服務器請求生成的accessToken*/

public staticString getAccessToken(String corpId, String corpSecert) {long curTime =System.currentTimeMillis();long differ = curTime -LAST_TIME;if (ACCESS_TOKEN != null && differ

ACCESS_TOKEN=requestAccessToken(corpId, corpSecert);

LAST_TIME=curTime;returnACCESS_TOKEN;

}/***

*@paramaccessToken

*

*@seegetAccess_Token(String corpId, String corpSecert) 生成的access_token

*@return一個用于js鑒權的ticket*/

public staticString getJsapiTicket(String accessToken) {long curTime =System.currentTimeMillis();long differ = curTime -LAST_TIME;if (JSAPI_TICKET != null && differ

}

JSAPI_TICKET=requestJsapiTicket(accessToken);returnJSAPI_TICKET;

}/*** 根據傳入的相關參數生成sign

*

*@paramticket

*@paramnonceStr

*@paramtimeStamp

*@paramurl

*@return

*/

public static String sign(String ticket, String nonceStr, longtimeStamp, String url) {

StringBuffer plain= newStringBuffer();

plain.append("jsapi_ticket=").append(ticket);

plain.append("&noncestr=").append(nonceStr);

plain.append("&timestamp=").append(String.valueOf(timeStamp));

plain.append("&url=").append(url);

MessageDigest sha;try{

sha= MessageDigest.getInstance("SHA-1");

sha.reset();

sha.update(plain.toString().getBytes("UTF-8"));returnbytesToHex(sha.digest());

}catch(NoSuchAlgorithmException e) {

e.printStackTrace();

}catch(UnsupportedEncodingException e) {

e.printStackTrace();

}return null;

}private staticString requestAccessToken(String corpId, String corpSecert) {

StringBuffer url= newStringBuffer(TOKEN_URL);

url.append("?corpid=").append(corpId);

url.append("&corpsecret=").append(corpSecert);

String result= null;try{

result=HttpHelper.sendGet(url.toString());

}catch(IOException e) {

result= ReturnUtil.result("-1","請求accessTokenc出錯!corpid:" + corpId + ",corpsecert:" + corpSecert + "異常信息:" +e);

}

return JsonUtil.getJsonNode(result).get("access_token").asText();

}private staticString requestJsapiTicket(String accessToken) {

StringBuffer url= newStringBuffer(TICKET_URL);

url.append("?access_token=").append(accessToken);

String result= null;try{

result=HttpHelper.sendGet(url.toString());

}catch(IOException e) {

result= ReturnUtil.result("-1", "請求JsapiTicket出錯!accessToken:" + accessToken + "異常信息:" +e);

}

return JsonUtil.getJsonNode(result).get("ticket").asText();

}private static String bytesToHex(byte[] hash) {

Formatter formatter= newFormatter();for (byteb : hash) {

formatter.format("%02x", b);

}

String result=formatter.toString();

formatter.close();returnresult;

}/*** 獲取用戶信息

*

*@paramcode

* 用戶相應的臨時code

*@paramtoken

* 根據相應corpid和corpsecret生成的access_token

*@return用戶ID等相關信息*/

public staticString getUserInfo(String code, String accessToken) {

StringBuffer url= newStringBuffer(USER_INFO_URL);

url.append("?access_token=").append(accessToken);

url.append("&code=").append(code);

String result= null;try{

result=HttpHelper.sendGet(url.toString());

}catch(IOException e) {

result= ReturnUtil.result("-1", "請求User信息出錯!code:" + code + "異常信息:" +e);

}returnresult;

}/*** 獲取用戶詳細信息

*@paramuserid 在某個corpid下的唯一用戶userid

*@paramaccessToken 據相應corpid和corpsecret生成的access_token

*@return

*/

public staticString getUser(String userid, String accessToken) {

StringBuffer url= newStringBuffer(USER_ALL_URL);

url.append("?access_token=").append(accessToken);

url.append("&userid=").append(userid);

String result= null;try{

result=HttpHelper.sendGet(url.toString());

}catch(IOException e) {

result= ReturnUtil.result("-1", "請求User信息出錯!userid:" + userid + "異常信息:" +e);

}returnresult;

}

}

做了一個簡單demo獲取用戶信息:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/287674.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287674.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287674.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

趣味二維碼生成

1背景介紹 最近在 Github 看到了一個有趣的項目 amazing-qr,它支持生成普通二維碼,帶圖片的藝術二維碼,動態二維碼。項目是用 python 編寫的,以命令行的方式運行生成,不太方便調用,因此,我…

學習進度博客十二

本周學習軟件工程所花時間為:4小時 代碼:200行 博客發表篇數:3 了解到的知識點:這周我們開始了第二次沖刺階段 轉載于:https://www.cnblogs.com/wulun/p/5610433.html

Android Studio提示No virtual method asBitmap()Lcom/bumptech/glide/RequestBuilder

1 問題 android studio導入別人項目的module,運行點擊app,程序奔潰,錯誤日志如下 Process: com.example.chenyu, PID: 6302java.lang.NoSuchMethodError: No virtual method asBitmap()Lcom/bumptech/glide/RequestBuilder; in class Lcom/bumptech/glide/RequestM…

電腦開機后,就會自動運行chkdsk,我想取消chkdsk,怎么取消

每次開機都自動檢查磁盤,檢測通過后下次還是一樣,NTFS/FAT32分區都有可能有這樣的情況,即使重裝系統,仍可能出現同樣情況,但是硬盤可以通過Dell 隨機帶的檢測程序解決方法:在命令行窗口中輸入…

《零基礎看得懂的C++入門教程 》——(1)第一個C++程序就讓你知其所以然

一、學習目標 了解第一個C程序了解第一個C程序結構了解什么是注釋了解什么是命名空間了解C語言的輸出(如何在程序運行時顯示內容)了解語句結束后需要使用什么符號表示結束 了解程序入口 目錄 預備第一篇,使用軟件介紹在這一篇,…

1、Locust壓力測試環境搭建

環境準備:阿里云服務器一臺、python2.7、pip Locust 介紹Locust 是一個開源負載測試工具。使用 Python 代碼定義用戶行為,也可以仿真百萬個用戶。 Locust 簡單易用,分布式,用戶負載測試工具。Locust 主要為網站或者其他系統進行負…

MicroStation V8i簡體中文版完全補丁安裝教程(附安裝包下載)

MicroStation是一款非常不錯的二維和三維設計軟件,由奔特力(Bentley)工程軟件系統有限公司開發的一款軟件。在CAD設計上該軟件是和AutoCAD是齊名的軟件,其專用的文件格式是DGN,當然該軟件還兼容AutoCAD的DWG/DXF等格式,該軟件的應用已經非常廣泛,在建筑、土木工程、交通…

交互式 .Net

1名詞解析 1. 交互式交互式是指輸入代碼后可直接運行該代碼,然后持續輸入運行代碼。2. 交互式 .Net.Net 是一種編譯型語言,不像 python 這類的腳本型語言,可以邊輸入代碼邊運行結果。幸運的是,軟微推出了 interactive 這個項…

Android Studio之編譯t提示Invoke-customs are only supported starting with Android O (--min-api 26)

1 問題 編譯別人的項目,錯誤提示如下 Invoke-customs are only supported starting with Android O (--min-api 26) 2 解決辦法 在app的build.gradle的android節點下添加如下代碼 android {compileSdkVersion 28defaultConfig {}buildTypes {}//需要添加如下代碼…

mysql signed 長度_淺談mysql字段長度設置

mysql 中最常用的數據類型是tinyint,smallint,int,bigint,char,varchar;char(n)和varchar(n)存儲固定長度的字符數據,長度最大為254字節。使用 ‘n’字節的存儲空間;有符號和無符號區別:有符號可以存儲負值,無符號只能存儲0和非負值數值;tinyint 占用1字節的存儲空間…

R語言-異常數據處理2

在R中進行基于穩健馬氏距離的異常檢驗 前言 我們研究的數據中經常包含著一些不同尋常的樣本,這稱之為異常值(Outlier)。這些異常值會極大的影響回歸或分類的效果。異常值產生的原因有很多,其中可能是人為錯誤、數據測量誤差,或者是實際確實存…

【遙感數字圖像處理】實驗:遙感影像增強方法大全處理看過來(Erdas版)

目錄 1、空間增強(spatial enhancement) 1.1 卷積增強(convolution) 1.2 非定向邊緣增強(non-directional edge)

《零基礎看得懂的C++入門教程 》——(2)什么是數據類型、變量?一看便會

一、學習目標 了解基本常用的數據類型了解什么是變量 目錄 預備第一篇,使用軟件介紹在這一篇,C與C使用的軟件是一樣的,查看這篇即可:《軟件介紹》 想了解編譯原理和學習方法點這篇,學習方法和一些原理C與C都是相同的…

pycharm 快捷鍵介紹

CtrlN (Navigate | Class) 打開輸入框輸入要查找的類名 Ctrl空格 代碼自動補全 Ctrl空格(按兩次)對于沒有導入的類自動完成導入代碼并自動補全 AltF7 查找方法變量在工程中的所有應用 CtrlQ (View | Quick Documentation). 快速查看文檔 …

【遙感數字圖像處理】實驗:遙感圖像分析方法大全(Erdas版)

一.實驗目的: 掌握遙感數字圖像分析的機理與方法,理解遙感數字圖像分析在遙感圖像計算機自動解譯中的重要作用。 二.實驗平臺:ERDAS IMAGINE 9.1 三.實驗要求:掌握遙感數字圖像的鄰域分析;查找分析;指標分析;疊加分析;歸納分析;坡度、坡向提取;高程分帶和地形陰…

db2和mysql語句區別_db2和mysql語法的區別是什么

MySQL默認使用大小寫敏感的數據庫名、表名和列名(可以通過lower_case_table_names參數控制是否大小寫敏感),DB2數據庫對大小寫不敏感。雖然MySQL與DB2都遵循并符合SQL92標準且大多數SQL相互兼容,但是在一些細節的實現上有一些不同的地方。比如&#xff1…

查缺補漏系統學習 EF Core 6 - 數據查詢

這是 EF Core 系列的第四篇文章,上一篇文章講述了 EF Core 中的實體遷移與數據播種。這篇文章盤點一下 EF Core 的幾種數據查詢方式,內容較多分上下兩篇。點擊上方或后方藍字,閱讀 EF Core 系列合集。簡單查詢在 EF Core 中,每個查…

Android Studio之導入別人的module后config.gradle配置文件沒有生效

1 問題 導入了別人項目的module,但是在別人項目里面的根目錄有config.gradle文件,里面有些版本信息,其他module的build.gradle文件用到了這里面的配置,如下,我把module導入我的項目,怎么讓這個文件生效呢?…

《零基礎看得懂的C++入門教程 》——(3)表達式花樣挺多鴨

一、學習目標 了解變量之間的計算了解什么是表達式了解什么是自增、自減 目錄 預備第一篇,使用軟件介紹在這一篇,C與C使用的軟件是一樣的,查看這篇即可:《軟件介紹》 想了解編譯原理和學習方法點這篇,學習方法和一些…

php 設計模式 - 單例

概述: 作為對象的創建模式,單例確保某一個內在系統中只存在一個實例,它不可以創建副本。 克隆函數(__clone )以及構造函數(__construct )必須聲明為私用, 防止外部程序 創建一個新類 ,而失去…