第三方登录之钉钉
1,登陆钉钉开发者后台
2,选择登陆然后创建应用
第一步拉起授权页面,即扫码登陆页面,扫码后回调到你自己写好的回调地址
<a href="https://oapi.dingtalk.com/connect/qrconnect?appid=APPID&response_type=code&scope=snsapi_login&state=STATE&redirect_uri=REDIRECT_URI">钉钉登录</a>
第二步 发请求:准备signature 和 timestamp.,tmp_auth_code就是回调过来的code
做完以后就拿到信息了,他这个就2步
回调地址:
@RequestMapping("/callback") public String callback(String code, Model model) throws Exception{ System.out.println("得到的code为:" + code); Map<String, String> params = new HashMap<>(4); String url = "https://oapi.dingtalk.com/sns/getuserinfo_bycode"; //申请应用时分配的AppKey params.put("client_id", "你自己的APPID"); params.put("code", code); params.put("timestamp", Signature.getTimestamp()); params.put("signature", Signature.signature());try { String result = HttpUtil.post(url, params); System.out.println("得到的结果为:" + result); } catch (IOException e) { e.printStackTrace(); } // 否则返回到登陆页面 return "/user/success"; }
HttpUtil:
package alu.util; import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicHeader; import org.apache.http.protocol.HTTP; import org.apache.http.util.EntityUtils; import com.alibaba.fastjson.JSONObject; import java.io.IOException; import java.text.ParseException; import java.util.HashMap; import java.util.Map; public class HttpUtil { /** * 发送POST请求 * @param url 请求的接口路径 * @param params 参数 * @return * @throws IOException */ public static String post(String url, Map<String, String> params) throws IOException { CloseableHttpClient client = HttpClients.createDefault(); StringBuilder stringBuilder = new StringBuilder(url); //code stringBuilder.append("?accessKey="); stringBuilder.append(params.get("client_id")); stringBuilder.append("×tamp="); stringBuilder.append(params.get("timestamp")); stringBuilder.append("&signature="); stringBuilder.append(params.get("signature")); System.out.println("stringBuilder.toString():"+stringBuilder.toString()); HttpPost httpPost = new HttpPost(stringBuilder.toString()); JSONObject jsonObject = new JSONObject(); Map<String, String> param = new HashMap<>(); param.put("tmp_auth_code", params.get("code")); httpPost.setHeader("Content-type", "application/json"); StringEntity s = new StringEntity(jsonObject.toJSONString(param), "utf-8"); httpPost.setEntity(s); //HttpGet httpGet = new HttpGet(stringBuilder.toString()); //发送请求返回响应的信息 CloseableHttpResponse response = client.execute(httpPost); HttpEntity entity = response.getEntity(); if (entity != null) { String result = EntityUtils.toString(entity, "UTF-8"); return result; } return null; } }
SignatureUtil:具体见官方文档:https://ding-doc.dingtalk.com/doc#/faquestions/hxs5v9
package alu.util; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.Date; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; public class Signature { private static final long TIMESTAMP=new Date().getTime(); private static final String APPSECRET=" 你自己的APPSECRET"; public static String signature(){ String urlEncodeSignature=""; try{ // 根据timestamp, appSecret计算签名值 String stringToSign = String.valueOf(TIMESTAMP); Mac mac = Mac.getInstance("HmacSHA256"); mac.init(new SecretKeySpec(APPSECRET.getBytes("UTF-8"), "HmacSHA256")); byte[] signatureBytes = mac.doFinal(stringToSign.getBytes("UTF-8")); String signature = new String(Base64.encodeBase64(signatureBytes)); urlEncodeSignature = urlEncode(signature); }catch(Exception e){ e.printStackTrace(); } return urlEncodeSignature; } // encoding参数使用utf-8 public static String urlEncode(String value) { if (value == null) { return ""; } try { String encoded = URLEncoder.encode(value, "utf-8"); return encoded.replace("+", "%20").replace("*", "%2A") .replace("~", "%7E").replace("/", "%2F"); } catch (UnsupportedEncodingException e) { throw new IllegalArgumentException("FailedToEncodeUri", e); } } public static String getTimestamp(){ return String.valueOf(TIMESTAMP); } }
如果有错误欢迎指正
具体参见官方文档:https://ding-doc.dingtalk.com/doc#/serverapi3/mrugr3