diff --git a/jpress-commons/src/main/java/io/jpress/commons/oauth2/connector/DingdingConnector.java b/jpress-commons/src/main/java/io/jpress/commons/oauth2/connector/DingdingConnector.java index d14a3084660f0e5cb6788280264230e3e166820d..4c677b10777aebc8c31349309fc4317e2d607995 100644 --- a/jpress-commons/src/main/java/io/jpress/commons/oauth2/connector/DingdingConnector.java +++ b/jpress-commons/src/main/java/io/jpress/commons/oauth2/connector/DingdingConnector.java @@ -19,52 +19,95 @@ import com.alibaba.fastjson.JSONObject; import io.jpress.commons.oauth2.OauthConnector; import io.jpress.commons.oauth2.OauthUser; +import java.util.HashMap; +import java.util.Map; + public class DingdingConnector extends OauthConnector { - public DingdingConnector(String name, String appkey, String appSecret) { - super(name, appkey, appSecret); - } + public DingdingConnector(String name, String appkey, String appSecret) { + super(name, appkey, appSecret); + } + + @Override + public String createAuthorizeUrl(String state) { + //https://oapi.dingtalk.com/connect/oauth2/sns_authorize?appid=APPID&response_type=code&scope=snsapi_login&state=STATE&redirect_uri=REDIRECT_URI + StringBuilder sb = new StringBuilder("https://oapi.dingtalk.com/connect/oauth2/sns_authorize?"); + sb.append("scope=user"); + sb.append("&appid=" + getClientId()); + sb.append("&redirect_uri=" + getRedirectUri()); + sb.append("&response_type=code"); + sb.append("&state=" + state); + + return sb.toString(); + } + + @Override + protected OauthUser getOauthUser(String code) { + String accessToken = getAccessToken(code); + + Map result = getPersistentCode(code, accessToken); + String openId = result.get("openid"); + String persistentCode = result.get("persistent_code"); + + String snsToken = getSnsToken(accessToken, openId, persistentCode); + + //https://oapi.dingtalk.com/sns/getuserinfo?sns_token=SNS_TOKEN + String url = "https://oapi.dingtalk.com/sns/getuserinfo?sns_token=" + snsToken; + + String httpString = httpGet(url); + JSONObject json = JSONObject.parseObject(httpString); + + OauthUser user = new OauthUser(); + //user.setAvatar(json.getString("avatar_url")); + user.setOpenId(json.getString("openid")); + user.setNickname(json.getString("nick")); + user.setSource(getName()); - @Override - public String createAuthorizeUrl(String state) { - StringBuilder sb = new StringBuilder("https://github.com/login/oauth/authorize?"); - sb.append("scope=user"); - sb.append("&client_id=" + getClientId()); - sb.append("&redirect_uri=" + getRedirectUri()); - sb.append("&state=" + state); + return null; + } - return sb.toString(); - } + protected String getAccessToken(String code) { - @Override - protected OauthUser getOauthUser(String code) { - String accessToken = getAccessToken(code); + StringBuilder urlBuilder = new StringBuilder("https://oapi.dingtalk.com/sns/gettoken?"); + urlBuilder.append("appid=" + getClientId()); + urlBuilder.append("&appsecret=" + getClientSecret()); - String url = "https://api.github.com/user?access_token=" + accessToken; + String url = urlBuilder.toString(); - String httpString = httpGet(url); - JSONObject json = JSONObject.parseObject(httpString); + String httpString = httpGet(url); + JSONObject json = JSONObject.parseObject(httpString); + return json.getString("access_token"); + } - OauthUser user = new OauthUser(); - user.setAvatar(json.getString("avatar_url")); - user.setOpenId(json.getString("id")); - user.setNickname(json.getString("login")); - user.setSource(getName()); + protected Map getPersistentCode(String code, String access_token) { + //https://oapi.dingtalk.com/sns/get_persistent_code?access_token=ACCESS_TOKEN + StringBuilder urlBuilder = new StringBuilder("https://oapi.dingtalk.com/sns/get_persistent_code?"); + urlBuilder.append("access_token=" + access_token); + String url = urlBuilder.toString(); - return null; - } + Map param = new HashMap<>(); + param.put("tmp_auth_code", code); - protected String getAccessToken(String code) { + String httpString = httpPost(url, param); + JSONObject json = JSONObject.parseObject(httpString); + Map result = new HashMap(); + result.put("openid", json.getString("openid")); + result.put("persistent_code", json.getString("persistent_code")); + return result; + } - StringBuilder urlBuilder = new StringBuilder("https://github.com/login/oauth/access_token?"); - urlBuilder.append("client_id=" + getClientId()); - urlBuilder.append("&client_secret=" + getClientSecret()); - urlBuilder.append("&code=" + code); + protected String getSnsToken(String access_token, String openId, String persistentCode) { + //https://oapi.dingtalk.com/sns/get_sns_token?access_token=ACCESS_TOKEN + StringBuilder urlBuilder = new StringBuilder("https://oapi.dingtalk.com/sns/get_sns_token?"); + urlBuilder.append("access_token=" + access_token); + String url = urlBuilder.toString(); - String url = urlBuilder.toString(); + Map param = new HashMap<>(); + param.put("openid", openId); + param.put("persistent_code", persistentCode); - String httpString = httpGet(url); - JSONObject json = JSONObject.parseObject(httpString); - return json.getString("access_token"); - } + String httpString = httpPost(url, param); + JSONObject json = JSONObject.parseObject(httpString); + return json.getString("sns_token"); + } } diff --git a/jpress-web/src/main/webapp/WEB-INF/views/admin/setting/reg.html b/jpress-web/src/main/webapp/WEB-INF/views/admin/setting/reg.html index bba69b19417d230e3c32bc079821f35daee3851f..2155307c77c08fad05b60861094e245c32ca6b1c 100755 --- a/jpress-web/src/main/webapp/WEB-INF/views/admin/setting/reg.html +++ b/jpress-web/src/main/webapp/WEB-INF/views/admin/setting/reg.html @@ -123,7 +123,7 @@ type="input" value="#option('login_weibo_appsecret')">

- 微博 的 AppKey 和 AppSecret 请去 https://connect.qq.com 申请。 + 微博 的 AppKey 和 AppSecret 请去 https://open.weibo.com 申请。

@@ -153,7 +153,7 @@ type="input" value="#option('login_github_appsecret')">

- GitHub 的 AppKey 和 AppSecret 请去 https://connect.qq.com 申请。 + GitHub 的 AppKey 和 AppSecret 请去 https://github.com/settings/applications/new 申请。

@@ -183,7 +183,7 @@ type="input" value="#option('login_gitee_appsecret')">

- 码云 的 AppKey 和 AppSecret 请去 https://connect.qq.com 申请。 + 码云 的 AppKey 和 AppSecret 请去 https://gitee.com/oauth/applications 申请。

@@ -213,7 +213,7 @@ type="input" value="#option('login_dingding_appsecret')">

- 钉钉 的 AppKey 和 AppSecret 请去 https://connect.qq.com 申请。 + 钉钉 的 AppKey 和 AppSecret 请去 https://t.dingtalk.com/invite/index?code=86d9eaf4ff 申请。