暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

web调用钉钉登陆认证

不想做程序员 2021-01-09
1280

在网页中嵌入钉钉认证,如果不是在钉钉内打开网站,直接跳转到扫码页面,用手机钉钉完成扫码,交由后端获钉钉取用户uuid;如果是在钉钉内,直接在前端请求临时授权码,并根据临时授权码取得钉钉用户uuid。再根据uuid获取用户信息,,并跳转到首页。


在页面引入钉钉相关js文件:

<script src="https://g.alicdn.com/dingding/dingtalk-jsapi/2.10.3/dingtalk.open.js"></script>
<script type="text/javascript" src="https://g.alicdn.com/dingding/dingtalk-pc-api/2.7.0/index.js"></script>
<script src="https://g.alicdn.com/dingding/dinglogin/0.0.5/ddLogin.js"></script>

构建扫码页面,在页面添加一个id=login_container的html标签,以便加载钉钉二维码;根据变量dd.env.platform可以判断是否在钉钉内,整体页面如下

@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>钉钉扫码登陆</title>
@Styles.Render("~/Content/css")
@Scripts.Render("~/bundles/modernizr")
<script src="https://g.alicdn.com/dingding/dingtalk-jsapi/2.10.3/dingtalk.open.js"></script>
<script type="text/javascript" src="https://g.alicdn.com/dingding/dingtalk-pc-api/2.7.0/index.js"></script>
<script src="https://g.alicdn.com/dingding/dinglogin/0.0.5/ddLogin.js"></script>
</head>
<body>
<div class="container-fluid" style="width:100%;margin:0 auto;padding:0 0">
<div class="text-center">
<input type="hidden" id="reurl" value="@ViewData["ReUrl"]" />
<div id="login_container"></div>
</div>
<div>
<iframe src="" id="autologin" hidden>
</iframe>
</div>
</div>
@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/bootstrap")
@Scripts.Render("~/bundles/service")
<script>
function closePage() {
var userAgent = navigator.userAgent;
if (userAgent.indexOf("Firefox") != -1 || userAgent.indexOf("Chrome") != -1) {
location.href = "about:blank";
} else {
window.opener = null;
window.open('', '_self');
}
window.close();
}
var appid = "@GlobalRes.ServerRuntimeConfig.DDLoginAppId";
var url = encodeURIComponent( '@GlobalRes.ServerRuntimeConfig.SiteLocaltion' + '/ddlogin/dologin?reurl='+$("#reurl").val());
var goto = encodeURIComponent('https://oapi.dingtalk.com/connect/oauth2/sns_authorize?appid=' + appid + '&response_type=code&scope=snsapi_login&state=STATE&redirect_uri=' + url);


if (dd.env.platform !== 'notInDingTalk') {
dd.ready(function () {
var flag = 0;
dd.runtime.permission.requestAuthCode({
corpId: "@GlobalRes.ServerRuntimeConfig.DDConfig.CorpId", // 企业id
onSuccess: function (info) {
$.ajax({
url: '/tdl/DDLogin/DoLogin1?code=' + info.code + '&reurl=' + $("#reurl").val(), //+ '&corpid='+ _config.corpId,
type: 'post',
sync: false,
success: function (data, status, xhr) {
var msg = JSON.parse(data);
if (msg.Code == "Sucess") {
var reurl = $("#reurl").val();
flag = 1;
}
else {
flag = 0;
closePage();
alert(msg.Message);
}
},
error: function (xhr, errorType, error) {
logDDLoginAppIdDDLoginAppIder.e("yinyien:" + _config.corpId);
alert(errorType + ', ' + error);
flag = 0;
//closePage();
}
});
}
});
if (flag == 1) {
var reurl = $("#reurl").val();
if (reurl != "")
top.location.href = reurl;
else
top.location.href = '/tdl/main/index';
}
})
}
else { //浏览器访问扫码登陆
var obj = DDLogin({
id: "login_container",//这里需要你在自己的页面定义一个HTML标签并设置id,例如<div id="login_container"></div>或<span id="login_container"></span>
goto: goto,
style: "border:none;background-color:#FFFFFF;",
width: "365",
height: "400"
});


var handleMessage = function (event) {
var origin = event.origin;
console.log("origin", event.origin);
if (origin == "https://login.dingtalk.com") { //判断是否来自ddLogin扫码事件。
var loginTmpCode = event.data;
window.parent.postMessage(loginTmpCode, '*');
var redirect_uri_check = "https://oapi.dingtalk.com/connect/oauth2/sns_authorize?appid=dingoazjmclpvolnxq3wba&response_type=code&scope=snsapi_login&state=STATE&redirect_uri=http://&loginTmpCode=";
window.location.href = redirect_uri_check + loginTmpCode;
}
};
if (typeof window.addEventListener != 'undefined') {
window.addEventListener('message', handleMessage, false);
} else if (typeof window.attachEvent != 'undefined') {
window.attachEvent('onmessage', handleMessage);
}
}
</script>
</body>
</html>

后端代码,钉钉扫码登陆逻辑

/// <summary>
/// 扫码登陆
/// </summary>
public string DoLogin(string code, string state)
{
string reurl = Request.Params["reurl"];
DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/sns/getuserinfo_bycode");
OapiSnsGetuserinfoBycodeRequest req = new OapiSnsGetuserinfoBycodeRequest();
req.TmpAuthCode = code;
OapiSnsGetuserinfoBycodeResponse response = client.Execute(req, GlobalRes.ServerRuntimeConfig.DDLoginAppId, GlobalRes.ServerRuntimeConfig.DDLoginAppSecret);
if (response.Errcode == 0)
{
dynamic msg = JsonConvert.DeserializeObject(response.Body);
string unionid = msg.user_info.unionid;
try
{
string token = GlobalRes.ServerRuntimeConfig.DDConfig.EApps[0].RequestToken();
var userResponse = DDHelper.GetUserInfoByUnionid(token, unionid);
if (userResponse.Errcode == 0)
{
HttpCookie cookie = new HttpCookie("TDL");
cookie["HasLogin"] = "1";
cookie["DDUserId"] = userResponse.Userid;
cookie["DDIsAdmin"] = userResponse.IsAdmin ? "1" : "0";
cookie["DDUserInfo"] = userResponse.Body;
cookie["Depts"] =JsonConvert.SerializeObject(userResponse.Department);
Response.SetCookie(cookie);
if (!string.IsNullOrEmpty(reurl))
Response.Redirect(reurl);
else
Response.Redirect($"/inv/scrapsubmit/INDEX?HasLogin=1&DDUserId={userResponse.Userid}");
}
else
throw new Exception(userResponse.Errmsg);
}
catch (Exception exp)
{
Response.Write(exp.Message);
Response.End();
}
}
return response.Body;
}

钉钉免登,后端处理逻辑

/// <summary>
/// 钉钉微应用免登
/// </summary>
[HttpPost]
public ActionResult DoLogin1(string code, string reurl)
{
string token = GlobalRes.ServerRuntimeConfig.DDConfig.EApps[0].RequestToken();
var client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/getuserinfo");
OapiUserGetuserinfoRequest request = new OapiUserGetuserinfoRequest();
request.Code = code;
request.SetHttpMethod("GET");
Message<dynamic> msg = new Message<dynamic>();
Logger.Info("钉钉免登");
try
{
OapiUserGetuserinfoResponse response = client.Execute(request, token);
if (response.Errcode == 0)
{
OapiUserGetResponse userResponse = DDHelper.GetUserDetail(token, response.Userid);
if (userResponse.Errcode == 0)
{
HttpCookie cookie = new HttpCookie("TDL");
cookie["HasLogin"] = "1";
cookie["DDUserId"] = userResponse.Userid;
cookie["DDIsAdmin"] = userResponse.IsAdmin ? "1" : "0";
cookie["DDUserInfo"] = userResponse.Body;
cookie["Depts"] = JsonConvert.SerializeObject(userResponse.Department);
Response.SetCookie(cookie);
msg.ReturnObject = userResponse;
Logger.Info(cookie.Value);
}
else
throw new Exception($"获取钉钉用户信息失败{ response.Errmsg } { response.ErrMsg}");
}
else
throw new Exception($"登陆失败{ response.Errmsg } { response.ErrMsg}");
}
catch (Exception exp)
{
Logger.Error(exp, "DoLogin1");
return Json(JsonConvert.SerializeObject(Message<string>.SetFaultMsg(exp)), JsonRequestBehavior.AllowGet);
}
return Json(JsonConvert.SerializeObject(msg), JsonRequestBehavior.AllowGet);
}


文章转载自不想做程序员,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论