扫码登录第三方网站 - 钉钉开放平台

资格申请

在钉钉平台申请称为开发者,并创建相关的应用(小程序或者网页Web应用)

配置回调

扫码登录其实也是OAuth2登录的一种,因此要对回调的地址进行配置,从而拿到钉钉发配给我们的授权码,从而去获取用户的信息

实现

共有两种方式实现钉钉扫码登录

  • 直接使用钉钉提供的扫码登录页面

    1. https://oapi.dingtalk.com/connect/qrconnect?appid=SuiteKey&response_type=code&scope=snsapi_login&state=STATE&redirect_uri=REDIRECT_URI

    其中:

  • SuiteKey为应用的AppKey

  • REDIRECT_URI为应用的重定向地址(必须和应用配置的地址相同,否则会提示无权限访问)

访问扫码登录页面,可以看到如下所示页面:
image.png

获取用户信息

根据sns临时授权码获取用户信息 - 钉钉开放平台
获取基本信息的接口:[https://oapi.dingtalk.com/sns/getuserinfo_bycode](https://oapi.dingtalk.com/sns/getuserinfo_bycode)

请求参数

image.png
image.png

响应

image.png

签名计算方法

个人免登场景的签名计算方法 - 钉钉开放平台

  1. @Component
  2. public class SignatureUtil {
  3. public String makeDingSignature(String timestamp, String secret) throws NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException {
  4. Mac mac = Mac.getInstance("HmacSHA256");
  5. mac.init(new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
  6. byte[] signatureBytes = mac.doFinal(timestamp.getBytes(StandardCharsets.UTF_8));
  7. String signature = new String(Base64.encodeBase64(signatureBytes));
  8. if ("".equals(signature)) {
  9. return "";
  10. }
  11. String encoded = URLEncoder.encode(signature, "UTF-8");
  12. String urlEncodeSignature = encoded.replace("+", "%20").replace("*", "%2A").replace("~", "%7E").replace("/", "%2F");
  13. return urlEncodeSignature;
  14. }
  15. }