天天看點

基于springboot架構 釘釘掃碼登入第三方應用擷取appId及appSecret

基于springboot架構 釘釘掃碼登入第三方應用

點選進入

釘釘開發者平台

的頁面,點選左側菜單的【移動接入應用-登入】,然後點選右上角的【建立掃碼登入應用授權】,建立用于免登過程中驗證身份的appId及appSecret,建立後即可看到appId和appSecret。

基于springboot架構 釘釘掃碼登入第三方應用擷取appId及appSecret

基于springboot架構 釘釘掃碼登入第三方應用擷取appId及appSecret

下載下傳位址:

https://ding-doc.dingtalk.com/doc#/faquestions/vzbp02

在resources下建立lib檔案夾,放入下載下傳的sdk

基于springboot架構 釘釘掃碼登入第三方應用擷取appId及appSecret

pom.xml引入sdk jar包

基于springboot架構 釘釘掃碼登入第三方應用擷取appId及appSecret

基于springboot架構 釘釘掃碼登入第三方應用擷取appId及appSecret

基于springboot架構 釘釘掃碼登入第三方應用擷取appId及appSecret
基于springboot架構 釘釘掃碼登入第三方應用擷取appId及appSecret
基于springboot架構 釘釘掃碼登入第三方應用擷取appId及appSecret
基于springboot架構 釘釘掃碼登入第三方應用擷取appId及appSecret

dingding.css檔案

#background { position:fixed;left:0px;top:0px;
    background-color:black;
    width:100%;
    height:100%;
    opacity:0.5;
    display:none;
    z-Index:3;
}
#content { position:fixed;
    width:420px;
    height:420px;
    top:0;
    bottom:0;
    left:0;
    right:0;
    margin:auto;
    display:none;
    cursor:pointer;
    z-Index:3;
}
#close {
    float: right;
    margin-right: 50px;
    display: block;
    width: 32px;
    height: 32px;
    background: url(../img/close.png) no-repeat 0px 0px;
}      

dingding.js檔案

//釘釘掃碼登入
function show()  //顯示隐藏層和彈出層
{
    var background=document.getElementById("background");
    background.style.display="block";  //顯示隐藏層
    document.getElementById("content").style.display="block";  //顯示彈出層
    //此處不采用初始加載辦法,根據需要加載,提高加載速度
    var appId = $("#appId").val();
    var projectUrl = $("#projectUrl").val();
    /*
     * 解釋一下goto參數,參考以下例子:
     * var url = encodeURIComponent('http://localhost.me/index.php?test=1&aa=2');
     * var goto = encodeURIComponent('https://oapi.dingtalk.com/connect/oauth2/sns_authorize?appid=appid&response_type=code&scope=snsapi_login&state=STATE&redirect_uri='+url)
     */
    var redirectUrl = projectUrl+'loginSys';
    var goto = encodeURIComponent('https://oapi.dingtalk.com/connect/oauth2/sns_authorize?appid='+appId+'&response_type=code&scope=snsapi_login&state=STATE&redirect_uri='+redirectUrl);
    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; //拿到loginTmpCode後就可以在這裡構造跳轉連結進行跳轉了
            //console.log("loginTmpCode", loginTmpCode);
            window.location.href = 'https://oapi.dingtalk.com/connect/oauth2/sns_authorize?appid='+appId+'&response_type=code&scope=snsapi_login&state=STATE&redirect_uri='+redirectUrl+'&loginTmpCode='+ loginTmpCode;
        }
    };
    if (typeof window.addEventListener != 'undefined') {
        window.addEventListener('message', handleMessage, false);
    } else if (typeof window.attachEvent != 'undefined') {
        window.attachEvent('onmessage', handleMessage);
    }
}
function hide()  //去除隐藏層和彈出層
{
    document.getElementById("background").style.display="none";
    document.getElementById("content").style.display="none";
}
      

/**
     * 掃碼登入并跳轉到index
     * @param request
     * @return
     */
    @RequestMapping("/loginSys")
    public String loginSys(HttpServletRequest request)
    {
        String code = request.getParameter("code");
        //String state = request.getParameter("state");
        String appId = ConstantConfig.dingtalkAppId;
        String appSecret = ConstantConfig.dingtalkAppSecret;
        String msg = "";
        //掃碼登入
        try {
            //擷取簽名值
            String timestamp = String.valueOf(System.currentTimeMillis());
            String urlEncodeSignature = DingDingUtil.urlEncodeSignature(timestamp,appSecret);
            //擷取unionId
            String url = ConstantConfig.dingtalkUserInfoUrl+"?accessKey="+appId+"&timestamp="+timestamp+"&signature="+urlEncodeSignature;
            DefaultDingTalkClient client = new DefaultDingTalkClient(url);
            OapiSnsGetuserinfoBycodeRequest req = new OapiSnsGetuserinfoBycodeRequest();
            req.setTmpAuthCode(code);
            OapiSnsGetuserinfoBycodeResponse response = client.execute(req,appId,appSecret);
            OapiSnsGetuserinfoBycodeResponse.UserInfo userInfo = response.getUserInfo();
            String unionId = userInfo.getUnionid();
            User use = sysService.selectUserByUnionId(unionId);
            //根據unionId 擷取使用者資訊
            if (use != null && StringUtils.isNotEmpty(use.getUnionId())) {
                //已綁定賬号則直接登入操作
                MyUsernamePasswordToken token = new MyUsernamePasswordToken(use.getLoginName(), use.getPassword(),false,true);
                Subject subject = SecurityUtils.getSubject();
                subject.login(token);
                return redirect("/index");
            }else {
                //未綁定
                msg = "one";
            }
        } catch (Exception e) {
            e.printStackTrace();
            msg = "two";
        }
        return redirect("/login?msg="+msg);
    }      

package com.ruoyi.framework.shiro.authc;

import org.apache.shiro.authc.UsernamePasswordToken;

/**
 * Created by nao'nao on 2020/3/19.
 * @author
 */
public class MyUsernamePasswordToken extends UsernamePasswordToken {
    private String username;
    private char[] password;
    private boolean rememberMe;
    private String host;
    private boolean encryption;
    private String passwords;

    public MyUsernamePasswordToken() {
        this.rememberMe = false;
        this.encryption = false;
    }

    public MyUsernamePasswordToken(String username, char[] password) {
        this(username, (char[])password, false, (String)null, false);
    }

    public MyUsernamePasswordToken(String username, String password) {
        this(username, (char[])(password != null?password.toCharArray():null), false, (String)null, false);
    }

    public MyUsernamePasswordToken(String username, char[] password, String host) {
        this(username, password, false, host, false);
    }

    public MyUsernamePasswordToken(String username, String password, String host) {
        this(username, password != null?password.toCharArray():null, false, host, false);
    }

    public MyUsernamePasswordToken(String username, char[] password, boolean rememberMe) {
        this(username, (char[])password, rememberMe, (String)null, false);
    }

    public MyUsernamePasswordToken(String username, String password, boolean rememberMe) {
        this(username, (char[])(password != null?password.toCharArray():null), rememberMe, (String)null,false);
    }

    public MyUsernamePasswordToken(String username, String password, boolean rememberMe, String host) {
        this(username, password != null?password.toCharArray():null, rememberMe, host,false);
    }

    public MyUsernamePasswordToken(String username, String passwords, boolean rememberMe, boolean encryption) {
        this(username, passwords, rememberMe, (String)null, encryption);
    }

    public MyUsernamePasswordToken(String username, char[] password, boolean rememberMe, String host, boolean encryption) {
        this.rememberMe = false;
        this.encryption = false;
        this.username = username;
        this.password = password;
        this.rememberMe = rememberMe;
        this.host = host;
        this.encryption = encryption;
    }

    public MyUsernamePasswordToken(String username, String passwords, boolean rememberMe, String host, boolean encryption) {
        this.rememberMe = false;
        this.encryption = false;
        this.username = username;
        this.passwords = passwords;
        this.rememberMe = rememberMe;
        this.host = host;
        this.encryption = encryption;
    }

    @Override
    public String getUsername() {
        return username;
    }

    @Override
    public void setUsername(String username) {
        this.username = username;
    }

    @Override
    public char[] getPassword() {
        return password;
    }

    @Override
    public void setPassword(char[] password) {
        this.password = password;
    }

    @Override
    public boolean isRememberMe() {
        return rememberMe;
    }

    @Override
    public void setRememberMe(boolean rememberMe) {
        this.rememberMe = rememberMe;
    }

    @Override
    public String getHost() {
        return host;
    }

    @Override
    public void setHost(String host) {
        this.host = host;
    }

    public boolean isEncryption() {
        return encryption;
    }

    public void setEncryption(boolean encryption) {
        this.encryption = encryption;
    }

    public String getPasswords() {
        return passwords;
    }

    public void setPasswords(String passwords) {
        this.passwords = passwords;
    }

    @Override
    public Object getPrincipal() {
        return this.getUsername();
    }

    @Override
    public Object getCredentials() {
        if (this.isEncryption()) {
            return this.getPasswords();
        }else {
            return this.getPassword();
        }
    }

    @Override
    public void clear() {
        this.username = null;
        this.host = null;
        this.rememberMe = false;
        this.encryption = false;
        if(this.password != null) {
            for(int i = 0; i < this.password.length; ++i) {
                this.password[i] = 0;
            }

            this.password = null;
        }
        if (this.passwords != null) {
            this.passwords = null;
        }

    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(this.getClass().getName());
        sb.append(" - ");
        sb.append(this.username);
        sb.append(", rememberMe=").append(this.rememberMe);
        sb.append(", encryption=").append(this.encryption);
        if(this.host != null) {
            sb.append(" (").append(this.host).append(")");
        }

        return sb.toString();
    }
}
      

以上為整合釘釘掃碼的主要代碼,并不是全部代碼,僅供參考