From 37179e7b5aecc2137c025952d3696363999fcdb4 Mon Sep 17 00:00:00 2001 From: "yadong.zhang" Date: Thu, 31 Jan 2019 17:44:42 +0800 Subject: [PATCH] =?UTF-8?q?:tada:=20=E5=88=9D=E5=A7=8B=E5=8C=96=E6=8F=90?= =?UTF-8?q?=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/me/zhyd/oauth/config/AuthConfig.java | 47 +++++++ .../me/zhyd/oauth/consts/ApiUrlConst.java | 59 ++++++++ .../zhyd/oauth/exception/AuthException.java | 36 +++++ .../me/zhyd/oauth/model/AuthResponse.java | 19 +++ .../java/me/zhyd/oauth/model/AuthSource.java | 16 +++ .../java/me/zhyd/oauth/model/AuthToken.java | 20 +++ .../java/me/zhyd/oauth/model/AuthUser.java | 26 ++++ .../me/zhyd/oauth/model/AuthUserGender.java | 40 ++++++ .../zhyd/oauth/request/AuthGiteeRequest.java | 83 +++++++++++ .../zhyd/oauth/request/AuthGithubRequest.java | 76 ++++++++++ .../me/zhyd/oauth/request/AuthRequest.java | 42 ++++++ .../zhyd/oauth/request/AuthWeiboRequest.java | 90 ++++++++++++ .../me/zhyd/oauth/request/ResponseStatus.java | 32 +++++ .../zhyd/oauth/utils/AuthConfigChecker.java | 60 ++++++++ .../java/me/zhyd/oauth/utils/IpUtils.java | 32 +++++ .../java/me/zhyd/oauth/utils/StringUtils.java | 19 +++ .../java/me/zhyd/oauth/utils/UrlBuilder.java | 132 ++++++++++++++++++ 17 files changed, 829 insertions(+) create mode 100644 src/main/java/me/zhyd/oauth/config/AuthConfig.java create mode 100644 src/main/java/me/zhyd/oauth/consts/ApiUrlConst.java create mode 100644 src/main/java/me/zhyd/oauth/exception/AuthException.java create mode 100644 src/main/java/me/zhyd/oauth/model/AuthResponse.java create mode 100644 src/main/java/me/zhyd/oauth/model/AuthSource.java create mode 100644 src/main/java/me/zhyd/oauth/model/AuthToken.java create mode 100644 src/main/java/me/zhyd/oauth/model/AuthUser.java create mode 100644 src/main/java/me/zhyd/oauth/model/AuthUserGender.java create mode 100644 src/main/java/me/zhyd/oauth/request/AuthGiteeRequest.java create mode 100644 src/main/java/me/zhyd/oauth/request/AuthGithubRequest.java create mode 100644 src/main/java/me/zhyd/oauth/request/AuthRequest.java create mode 100644 src/main/java/me/zhyd/oauth/request/AuthWeiboRequest.java create mode 100644 src/main/java/me/zhyd/oauth/request/ResponseStatus.java create mode 100644 src/main/java/me/zhyd/oauth/utils/AuthConfigChecker.java create mode 100644 src/main/java/me/zhyd/oauth/utils/IpUtils.java create mode 100644 src/main/java/me/zhyd/oauth/utils/StringUtils.java create mode 100644 src/main/java/me/zhyd/oauth/utils/UrlBuilder.java diff --git a/src/main/java/me/zhyd/oauth/config/AuthConfig.java b/src/main/java/me/zhyd/oauth/config/AuthConfig.java new file mode 100644 index 0000000..9ea8b3b --- /dev/null +++ b/src/main/java/me/zhyd/oauth/config/AuthConfig.java @@ -0,0 +1,47 @@ +package me.zhyd.oauth.config; + +/** + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @version 1.0 + * @website https://www.zhyd.me + * @date 2019/1/31 14:03 + * @since 1.8 + */ +public class AuthConfig { + /** + * github应用的Client ID + */ + public static String githubClientId = null; + /** + * github应用的Client Secret + */ + public static String githubClientSecret = null; + /** + * github应用的redirect_uri 登陆成功后的回调地址 + */ + public static String githubRedirectUri = null; + /** + * weibo应用的App Key + */ + public static String weiboClientId = null; + /** + * weibo应用的App Secret + */ + public static String weiboClientSecret = null; + /** + * weibo应用的redirect_uri 登陆成功后的回调地址 + */ + public static String weiboRedirectUri = null; + /** + * gitee应用的Client ID + */ + public static String giteeClientId = null; + /** + * gitee应用的Client Secret + */ + public static String giteeClientSecret = null; + /** + * gitee应用的redirect_uri 登陆成功后的回调地址 + */ + public static String giteeRedirectUri = null; +} diff --git a/src/main/java/me/zhyd/oauth/consts/ApiUrlConst.java b/src/main/java/me/zhyd/oauth/consts/ApiUrlConst.java new file mode 100644 index 0000000..36f1c89 --- /dev/null +++ b/src/main/java/me/zhyd/oauth/consts/ApiUrlConst.java @@ -0,0 +1,59 @@ +package me.zhyd.oauth.consts; + +/** + * 各api需要的url常量类 + * + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @version 1.0 + * @website https://www.zhyd.me + * @date 2019/1/31 12:26 + * @since 1.0 + */ +public class ApiUrlConst { + + /** + * 获取github access_token的地址 + */ + public static final String GITHUB_ACCESS_TOKEN_URL = "https://github.com/login/oauth/access_token"; + + /** + * 获取github用户信息的地址 + */ + public static final String GITHUB_USER_INFO_URL = "https://api.github.com/user"; + + /** + * 获取github授权地址 + */ + public static final String GITHUB_AUTHORIZE_URL = "https://github.com/login/oauth/authorize"; + + /** + * 获取weibo access_token的地址 + */ + public static final String WEIBO_ACCESS_TOKEN_URL = "https://api.weibo.com/oauth2/access_token"; + + /** + * 获取weibo用户信息的地址 + */ + public static final String WEIBO_USER_INFO_URL = "https://api.weibo.com/2/users/show.json"; + + /** + * 获取weibo授权地址 + */ + public static final String WEIBO_AUTHORIZE_URL = "https://api.weibo.com/oauth2/authorize"; + + /** + * 获取gitee access_token的地址 + */ + public static final String GITEE_ACCESS_TOKEN_URL = "https://gitee.com/oauth/token"; + + /** + * 获取gitee用户信息的地址 + */ + public static final String GITEE_USER_INFO_URL = "https://gitee.com/api/v5/user"; + + /** + * 获取gitee授权地址 + */ + public static final String GITEE_AUTHORIZE_URL = "https://gitee.com/oauth/authorize"; + +} diff --git a/src/main/java/me/zhyd/oauth/exception/AuthException.java b/src/main/java/me/zhyd/oauth/exception/AuthException.java new file mode 100644 index 0000000..a7a6c8f --- /dev/null +++ b/src/main/java/me/zhyd/oauth/exception/AuthException.java @@ -0,0 +1,36 @@ +package me.zhyd.oauth.exception; + +import me.zhyd.oauth.request.ResponseStatus; + +/** + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @version 1.0 + * @website https://www.zhyd.me + * @date 2019/1/31 16:05 + * @since 1.8 + */ +public class AuthException extends RuntimeException { + public AuthException() { + super(); + } + + public AuthException(String message) { + super(message); + } + + public AuthException(ResponseStatus status) { + super(status.getMsg()); + } + + public AuthException(String message, Throwable cause) { + super(message, cause); + } + + public AuthException(Throwable cause) { + super(cause); + } + + protected AuthException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/src/main/java/me/zhyd/oauth/model/AuthResponse.java b/src/main/java/me/zhyd/oauth/model/AuthResponse.java new file mode 100644 index 0000000..ecce59b --- /dev/null +++ b/src/main/java/me/zhyd/oauth/model/AuthResponse.java @@ -0,0 +1,19 @@ +package me.zhyd.oauth.model; + +import lombok.Builder; +import lombok.Data; + +/** + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @version 1.0 + * @website https://www.zhyd.me + * @date 2019/1/31 15:43 + * @since 1.8 + */ +@Builder +@Data +public class AuthResponse { + private int code = 200; + private String msg; + private T data; +} diff --git a/src/main/java/me/zhyd/oauth/model/AuthSource.java b/src/main/java/me/zhyd/oauth/model/AuthSource.java new file mode 100644 index 0000000..794ee48 --- /dev/null +++ b/src/main/java/me/zhyd/oauth/model/AuthSource.java @@ -0,0 +1,16 @@ +package me.zhyd.oauth.model; + +/** + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @version 1.0 + * @website https://www.zhyd.me + * @date 2019/1/31 13:52 + * @since 1.8 + */ +public enum AuthSource { + GITHUB, + GITEE, + WEIBO, + QQ, + WEIXIN +} diff --git a/src/main/java/me/zhyd/oauth/model/AuthToken.java b/src/main/java/me/zhyd/oauth/model/AuthToken.java new file mode 100644 index 0000000..5a3dd54 --- /dev/null +++ b/src/main/java/me/zhyd/oauth/model/AuthToken.java @@ -0,0 +1,20 @@ +package me.zhyd.oauth.model; + +import lombok.Builder; +import lombok.Data; + +/** + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @version 1.0 + * @website https://www.zhyd.me + * @date 2019/1/31 15:43 + * @since 1.8 + */ +@Data +@Builder +public class AuthToken { + private String accessToken; + private String expireIn; + private String refreshToken; + private String uid; +} diff --git a/src/main/java/me/zhyd/oauth/model/AuthUser.java b/src/main/java/me/zhyd/oauth/model/AuthUser.java new file mode 100644 index 0000000..c522dc2 --- /dev/null +++ b/src/main/java/me/zhyd/oauth/model/AuthUser.java @@ -0,0 +1,26 @@ +package me.zhyd.oauth.model; + +import lombok.Builder; +import lombok.Data; + +/** + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @version 1.0 + * @website https://www.zhyd.me + * @date 2019/1/31 13:47 + * @since 1.8 + */ +@Builder +@Data +public class AuthUser { + private String username; + private String avatar; + private String blog; + private String nickname; + private String company; + private String location; + private String email; + private String remark; + private AuthUserGender gender; + private AuthSource source; +} diff --git a/src/main/java/me/zhyd/oauth/model/AuthUserGender.java b/src/main/java/me/zhyd/oauth/model/AuthUserGender.java new file mode 100644 index 0000000..10c7cfa --- /dev/null +++ b/src/main/java/me/zhyd/oauth/model/AuthUserGender.java @@ -0,0 +1,40 @@ +package me.zhyd.oauth.model; + +/** + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @version 1.0 + * @website https://www.zhyd.me + * @date 2019/1/31 17:24 + * @since 1.8 + */ +public enum AuthUserGender { + MALE(1, "男"), FEMALE(0, "女"), UNKNOW(-1, ""); + private int code; + private String desc; + + AuthUserGender(int code, String desc) { + this.code = code; + this.desc = desc; + } + + public static AuthUserGender getRealGender(String code) { + if (code == null) { + return UNKNOW; + } + if ("m".equals(code) || "男".equals(code) || "1".equals(code) || "male".equalsIgnoreCase(code)) { + return MALE; + } + if ("f".equals(code) || "女".equals(code) || "0".equals(code) || "female".equalsIgnoreCase(code)) { + return FEMALE; + } + return UNKNOW; + } + + public int getCode() { + return code; + } + + public String getDesc() { + return desc; + } +} diff --git a/src/main/java/me/zhyd/oauth/request/AuthGiteeRequest.java b/src/main/java/me/zhyd/oauth/request/AuthGiteeRequest.java new file mode 100644 index 0000000..4d851e5 --- /dev/null +++ b/src/main/java/me/zhyd/oauth/request/AuthGiteeRequest.java @@ -0,0 +1,83 @@ +package me.zhyd.oauth.request; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import com.alibaba.fastjson.JSONObject; +import me.zhyd.oauth.config.AuthConfig; +import me.zhyd.oauth.exception.AuthException; +import me.zhyd.oauth.model.AuthResponse; +import me.zhyd.oauth.model.AuthSource; +import me.zhyd.oauth.model.AuthUser; +import me.zhyd.oauth.utils.AuthConfigChecker; +import me.zhyd.oauth.utils.UrlBuilder; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @version 1.0 + * @website https://www.zhyd.me + * @date 2019/1/31 16:31 + * @since 1.8 + */ +public class AuthGiteeRequest implements AuthRequest { + + @Override + public void authorize(HttpServletResponse response) { + if (!AuthConfigChecker.isSupportedGitee()) { + throw new AuthException(ResponseStatus.UNSUPPORTED); + } + String authorizeUrl = UrlBuilder.getGiteeAuthorizeUrl(AuthConfig.giteeClientId, AuthConfig.giteeRedirectUri); + try { + response.sendRedirect(authorizeUrl); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public String authorize() { + if (!AuthConfigChecker.isSupportedGitee()) { + throw new AuthException(ResponseStatus.UNSUPPORTED); + } + return UrlBuilder.getGiteeAuthorizeUrl(AuthConfig.giteeClientId, AuthConfig.giteeRedirectUri); + } + + @Override + public AuthResponse login(String code) { + if (!AuthConfigChecker.isSupportedGitee()) { + return AuthResponse.builder() + .code(ResponseStatus.UNSUPPORTED.getCode()) + .msg(ResponseStatus.UNSUPPORTED.getMsg()) + .build(); + } + String accessTokenUrl = UrlBuilder.getGiteeAccessTokenUrl(AuthConfig.giteeClientId, AuthConfig.giteeClientSecret, code, AuthConfig.giteeRedirectUri); + HttpResponse response = HttpRequest.post(accessTokenUrl).execute(); + String accessTokenStr = response.body(); + JSONObject accessTokenObject = JSONObject.parseObject(accessTokenStr); + if (accessTokenObject.containsKey("error")) { + return AuthResponse.builder() + .code(500) + .msg("Unable to get token from gitee using code [" + code + "]") + .build(); + } + String accessToken = accessTokenObject.getString("access_token"); + response = HttpRequest.get(UrlBuilder.getGiteeUserInfoUrl(accessToken)).execute(); + String userInfo = response.body(); + JSONObject object = JSONObject.parseObject(userInfo); + return AuthResponse.builder() + .data(AuthUser.builder() + .username(object.getString("login")) + .avatar(object.getString("avatar_url")) + .blog(object.getString("blog")) + .nickname(object.getString("name")) + .company(object.getString("company")) + .location(object.getString("address")) + .email(object.getString("email")) + .remark(object.getString("bio")) + .source(AuthSource.GITEE) + .build()) + .build(); + } +} diff --git a/src/main/java/me/zhyd/oauth/request/AuthGithubRequest.java b/src/main/java/me/zhyd/oauth/request/AuthGithubRequest.java new file mode 100644 index 0000000..69e49f4 --- /dev/null +++ b/src/main/java/me/zhyd/oauth/request/AuthGithubRequest.java @@ -0,0 +1,76 @@ +package me.zhyd.oauth.request; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import com.alibaba.fastjson.JSONObject; +import me.zhyd.oauth.config.AuthConfig; +import me.zhyd.oauth.exception.AuthException; +import me.zhyd.oauth.model.AuthResponse; +import me.zhyd.oauth.model.AuthSource; +import me.zhyd.oauth.model.AuthUser; +import me.zhyd.oauth.utils.AuthConfigChecker; +import me.zhyd.oauth.utils.UrlBuilder; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @version 1.0 + * @website https://www.zhyd.me + * @date 2019/1/31 16:31 + * @since 1.8 + */ +public class AuthGithubRequest implements AuthRequest { + + @Override + public void authorize(HttpServletResponse response) { + if (!AuthConfigChecker.isSupportedGithub()) { + throw new AuthException(ResponseStatus.UNSUPPORTED); + } + String authorizeUrl = UrlBuilder.getGithubAuthorizeUrl(AuthConfig.githubClientId, AuthConfig.githubRedirectUri); + try { + response.sendRedirect(authorizeUrl); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public String authorize() { + if (!AuthConfigChecker.isSupportedGithub()) { + throw new AuthException(ResponseStatus.UNSUPPORTED); + } + return UrlBuilder.getGithubAuthorizeUrl(AuthConfig.githubClientId, AuthConfig.githubRedirectUri); + } + + @Override + public AuthResponse login(String code) { + if (!AuthConfigChecker.isSupportedGithub()) { + return AuthResponse.builder() + .code(ResponseStatus.UNSUPPORTED.getCode()) + .msg(ResponseStatus.UNSUPPORTED.getMsg()) + .build(); + } + String accessTokenUrl = UrlBuilder.getGithubAccessTokenUrl(AuthConfig.githubClientId, AuthConfig.githubClientSecret, code, AuthConfig.githubRedirectUri); + HttpResponse response = HttpRequest.post(accessTokenUrl).execute(); + String accessTokenStr = response.body(); + String accessToken = accessTokenStr.split("&")[0]; + response = HttpRequest.get(UrlBuilder.getGithubUserInfoUrl(accessToken)).execute(); + String userInfo = response.body(); + JSONObject object = JSONObject.parseObject(userInfo); + return AuthResponse.builder() + .data(AuthUser.builder() + .username(object.getString("login")) + .avatar(object.getString("avatar_url")) + .blog(object.getString("blog")) + .nickname(object.getString("name")) + .company(object.getString("company")) + .location(object.getString("location")) + .email(object.getString("email")) + .remark(object.getString("bio")) + .source(AuthSource.GITHUB) + .build()) + .build(); + } +} diff --git a/src/main/java/me/zhyd/oauth/request/AuthRequest.java b/src/main/java/me/zhyd/oauth/request/AuthRequest.java new file mode 100644 index 0000000..76d10fa --- /dev/null +++ b/src/main/java/me/zhyd/oauth/request/AuthRequest.java @@ -0,0 +1,42 @@ +package me.zhyd.oauth.request; + +import me.zhyd.oauth.exception.AuthException; +import me.zhyd.oauth.model.AuthResponse; + +import javax.servlet.http.HttpServletResponse; + +/** + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @version 1.0 + * @website https://www.zhyd.me + * @date 2019/1/31 15:45 + * @since 1.8 + */ +public interface AuthRequest { + + /** + * 自动跳转到认证页面 + * + * @param response response + */ + default void authorize(HttpServletResponse response) { + throw new AuthException(ResponseStatus.NOT_IMPLEMENTED); + } + + /** + * 返回认证url,可自行跳转页面 + */ + default String authorize() { + throw new AuthException(ResponseStatus.NOT_IMPLEMENTED); + } + + /** + * 第三方登录 + * + * @param code 通过authorize换回的code + * @return 返回登陆成功后的用户信息 + */ + default AuthResponse login(String code) { + throw new AuthException(ResponseStatus.NOT_IMPLEMENTED); + } +} diff --git a/src/main/java/me/zhyd/oauth/request/AuthWeiboRequest.java b/src/main/java/me/zhyd/oauth/request/AuthWeiboRequest.java new file mode 100644 index 0000000..7862549 --- /dev/null +++ b/src/main/java/me/zhyd/oauth/request/AuthWeiboRequest.java @@ -0,0 +1,90 @@ +package me.zhyd.oauth.request; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import com.alibaba.fastjson.JSONObject; +import me.zhyd.oauth.config.AuthConfig; +import me.zhyd.oauth.exception.AuthException; +import me.zhyd.oauth.model.AuthResponse; +import me.zhyd.oauth.model.AuthSource; +import me.zhyd.oauth.model.AuthUser; +import me.zhyd.oauth.model.AuthUserGender; +import me.zhyd.oauth.utils.AuthConfigChecker; +import me.zhyd.oauth.utils.IpUtils; +import me.zhyd.oauth.utils.StringUtils; +import me.zhyd.oauth.utils.UrlBuilder; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.net.InetAddress; + +/** + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @version 1.0 + * @website https://www.zhyd.me + * @date 2019/1/31 16:31 + * @since 1.8 + */ +public class AuthWeiboRequest implements AuthRequest { + + @Override + public void authorize(HttpServletResponse response) { + if (!AuthConfigChecker.isSupportedWeibo()) { + throw new AuthException(ResponseStatus.UNSUPPORTED); + } + String authorizeUrl = UrlBuilder.getWeiboAuthorizeUrl(AuthConfig.weiboClientId, AuthConfig.weiboRedirectUri); + try { + response.sendRedirect(authorizeUrl); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public String authorize() { + if (!AuthConfigChecker.isSupportedWeibo()) { + throw new AuthException(ResponseStatus.UNSUPPORTED); + } + return UrlBuilder.getWeiboAuthorizeUrl(AuthConfig.weiboClientId, AuthConfig.weiboRedirectUri); + } + + @Override + public AuthResponse login(String code) { + if (!AuthConfigChecker.isSupportedWeibo()) { + return AuthResponse.builder() + .code(ResponseStatus.UNSUPPORTED.getCode()) + .msg(ResponseStatus.UNSUPPORTED.getMsg()) + .build(); + } + String accessTokenUrl = UrlBuilder.getWeiboAccessTokenUrl(AuthConfig.weiboClientId, AuthConfig.weiboClientSecret, code, AuthConfig.weiboRedirectUri); + HttpResponse response = HttpRequest.post(accessTokenUrl).execute(); + String accessTokenStr = response.body(); + JSONObject accessTokenObject = JSONObject.parseObject(accessTokenStr); + if (accessTokenObject.containsKey("error")) { + return AuthResponse.builder() + .code(500) + .msg("Unable to get token from gitee using code [" + code + "]") + .build(); + } + String accessToken = accessTokenObject.getString("access_token"); + String uid = accessTokenObject.getString("uid"); + response = HttpRequest.get(UrlBuilder.getWeiboUserInfoUrl(uid, accessToken)) + .header("Authorization", "OAuth2 " + accessToken) + .header("API-RemoteIP", IpUtils.getIp()) + .execute(); + String userInfo = response.body(); + JSONObject object = JSONObject.parseObject(userInfo); + return AuthResponse.builder() + .data(AuthUser.builder() + .username(object.getString("name")) + .avatar(object.getString("profile_image_url")) + .blog(StringUtils.isEmpty(object.getString("url")) ? "https://weibo.com/" + object.getString("profile_url") : object.getString("url")) + .nickname(object.getString("screen_name")) + .location(object.getString("location")) + .remark(object.getString("description")) + .gender(AuthUserGender.getRealGender(object.getString("gender"))) + .source(AuthSource.GITHUB) + .build()) + .build(); + } +} diff --git a/src/main/java/me/zhyd/oauth/request/ResponseStatus.java b/src/main/java/me/zhyd/oauth/request/ResponseStatus.java new file mode 100644 index 0000000..570c321 --- /dev/null +++ b/src/main/java/me/zhyd/oauth/request/ResponseStatus.java @@ -0,0 +1,32 @@ +package me.zhyd.oauth.request; + +/** + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @version 1.0 + * @website https://www.zhyd.me + * @date 2019/1/31 16:37 + * @since 1.8 + */ +public enum ResponseStatus { + FAILURE(5000, "Authentication failure"), + NOT_IMPLEMENTED(5001, "Not Implemented"), + UNSUPPORTED(5002, "Unsupported authentication, please check the configuration."), + ; + + private int code; + private String msg; + + ResponseStatus(int code, String msg) { + this.code = code; + this.msg = msg; + } + + public int getCode() { + return code; + } + + public String getMsg() { + return msg; + } +} + diff --git a/src/main/java/me/zhyd/oauth/utils/AuthConfigChecker.java b/src/main/java/me/zhyd/oauth/utils/AuthConfigChecker.java new file mode 100644 index 0000000..f4cc60a --- /dev/null +++ b/src/main/java/me/zhyd/oauth/utils/AuthConfigChecker.java @@ -0,0 +1,60 @@ +package me.zhyd.oauth.utils; + +import me.zhyd.oauth.config.AuthConfig; + +/** + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @version 1.0 + * @website https://www.zhyd.me + * @date 2019/1/31 15:46 + * @since 1.8 + */ +public class AuthConfigChecker { + + /** + * 是否支持微博 + * + * @return true or false + */ + public static boolean isSupportedWeibo() { + return StringUtils.isNotEmpty(AuthConfig.weiboClientId) && StringUtils.isNotEmpty(AuthConfig.weiboClientSecret) && StringUtils.isNotEmpty(AuthConfig.weiboRedirectUri); + } + + /** + * 是否支持Github + * + * @return true or false + */ + public static boolean isSupportedGithub() { + return StringUtils.isNotEmpty(AuthConfig.githubClientId) && StringUtils.isNotEmpty(AuthConfig.githubClientSecret) && StringUtils.isNotEmpty(AuthConfig.githubRedirectUri); + } + + /** + * 是否支持Gitee + * + * @return true or false + */ + public static boolean isSupportedGitee() { + return StringUtils.isNotEmpty(AuthConfig.giteeClientId) && StringUtils.isNotEmpty(AuthConfig.giteeClientSecret) && StringUtils.isNotEmpty(AuthConfig.giteeRedirectUri); + } + + /** + * 是否支持QQ + * + * @return true or false + */ + @Deprecated + public static boolean isSupportedQq() { + return false; + } + + /** + * 是否支持微信 + * + * @return true or false + */ + @Deprecated + public static boolean isSupportedWeixin() { + return false; + } +} diff --git a/src/main/java/me/zhyd/oauth/utils/IpUtils.java b/src/main/java/me/zhyd/oauth/utils/IpUtils.java new file mode 100644 index 0000000..da3dab9 --- /dev/null +++ b/src/main/java/me/zhyd/oauth/utils/IpUtils.java @@ -0,0 +1,32 @@ +package me.zhyd.oauth.utils; + +import lombok.extern.slf4j.Slf4j; + +import javax.servlet.http.HttpServletRequest; +import java.net.InetAddress; +import java.net.UnknownHostException; + +/** + * 获取IP的工具类 + * + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @version 1.0 + * @website https://www.zhyd.me + * @date 2019/1/31 16:31 + * @since 1.0 + */ +@Slf4j +public class IpUtils { + + /** + * 获取IP + */ + public static String getIp() { + try { + return InetAddress.getLocalHost().getHostAddress(); + } catch (UnknownHostException e) { + e.printStackTrace(); + return null; + } + } +} \ No newline at end of file diff --git a/src/main/java/me/zhyd/oauth/utils/StringUtils.java b/src/main/java/me/zhyd/oauth/utils/StringUtils.java new file mode 100644 index 0000000..2255c96 --- /dev/null +++ b/src/main/java/me/zhyd/oauth/utils/StringUtils.java @@ -0,0 +1,19 @@ +package me.zhyd.oauth.utils; + +/** + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @version 1.0 + * @website https://www.zhyd.me + * @date 2019/1/31 15:48 + * @since 1.8 + */ +public class StringUtils { + + public static boolean isEmpty(String str) { + return null == str || str.isEmpty(); + } + + public static boolean isNotEmpty(String str) { + return !isEmpty(str); + } +} diff --git a/src/main/java/me/zhyd/oauth/utils/UrlBuilder.java b/src/main/java/me/zhyd/oauth/utils/UrlBuilder.java new file mode 100644 index 0000000..5f69e3c --- /dev/null +++ b/src/main/java/me/zhyd/oauth/utils/UrlBuilder.java @@ -0,0 +1,132 @@ +package me.zhyd.oauth.utils; + +import me.zhyd.oauth.consts.ApiUrlConst; + +import java.text.MessageFormat; + +/** + * Url构建工具类 + * + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @version 1.0 + * @website https://www.zhyd.me + * @date 2019/1/31 12:26 + * @since 1.0 + */ +public class UrlBuilder { + + private static final String GITHUB_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&code={3}&redirect_uri={4}"; + private static final String GITHUB_USER_INFO_PATTERN = "{0}?{1}"; + private static final String GITHUB_AUTHORIZE_PATTERN = "{0}?client_id={1}&state=1&redirect_uri={2}"; + + private static final String WEIBO_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&grant_type=authorization_code&code={3}&redirect_uri={4}"; + private static final String WEIBO_USER_INFO_PATTERN = "{0}?uid={1}&access_token={2}"; + private static final String WEIBO_AUTHORIZE_PATTERN = "{0}?client_id={1}&response_type=code&redirect_uri={2}"; + + private static final String GITEE_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&grant_type=authorization_code&code={3}&redirect_uri={4}"; + private static final String GITEE_USER_INFO_PATTERN = "{0}?access_token={1}"; + private static final String GITEE_AUTHORIZE_PATTERN = "{0}?client_id={1}&response_type=code&redirect_uri={2}"; + + /** + * 获取githubtoken的接口地址 + * + * @param clientId github应用的Client ID + * @param clientSecret github应用的Client Secret + * @param code github授权前的code,用来换token + * @param redirectUri 待跳转的页面 + * @return 换取github授权token的真实地址 + */ + public static String getGithubAccessTokenUrl(String clientId, String clientSecret, String code, String redirectUri) { + return MessageFormat.format(GITHUB_ACCESS_TOKEN_PATTERN, ApiUrlConst.GITHUB_ACCESS_TOKEN_URL, clientId, clientSecret, code, redirectUri); + } + + /** + * 获取github用户详情的接口地址 + * + * @param token github 应用的token + * @return json + */ + public static String getGithubUserInfoUrl(String token) { + return MessageFormat.format(GITHUB_USER_INFO_PATTERN, ApiUrlConst.GITHUB_USER_INFO_URL, token); + } + + /** + * 获取github授权地址 + * + * @param clientId github 应用的Client ID + * @param redirectUrl github 应用授权成功后的回调地址 + * @return json + */ + public static String getGithubAuthorizeUrl(String clientId, String redirectUrl) { + return MessageFormat.format(GITHUB_AUTHORIZE_PATTERN, ApiUrlConst.GITHUB_AUTHORIZE_URL, clientId, redirectUrl); + } + + /** + * 获取weibo token的接口地址 + * + * @param clientId weibo应用的App Key + * @param clientSecret weibo应用的App Secret + * @param code weibo授权前的code,用来换token + * @param redirectUri 待跳转的页面 + * @return 换取weibo授权token的真实地址 + */ + public static String getWeiboAccessTokenUrl(String clientId, String clientSecret, String code, String redirectUri) { + return MessageFormat.format(WEIBO_ACCESS_TOKEN_PATTERN, ApiUrlConst.WEIBO_ACCESS_TOKEN_URL, clientId, clientSecret, code, redirectUri); + } + + /** + * 获取weibo用户详情的接口地址 + * + * @param uid 用户id + * @param token weibo 应用的token + * @return json + */ + public static String getWeiboUserInfoUrl(String uid, String token) { + return MessageFormat.format(WEIBO_USER_INFO_PATTERN, ApiUrlConst.WEIBO_USER_INFO_URL, uid, token); + } + + /** + * 获取weibo授权地址 + * + * @param clientId weibo 应用的Client ID + * @param redirectUrl weibo 应用授权成功后的回调地址 + * @return json + */ + public static String getWeiboAuthorizeUrl(String clientId, String redirectUrl) { + return MessageFormat.format(WEIBO_AUTHORIZE_PATTERN, ApiUrlConst.WEIBO_AUTHORIZE_URL, clientId, redirectUrl); + } + + /** + * 获取gitee token的接口地址 + * + * @param clientId gitee应用的Client ID + * @param clientSecret gitee应用的Client Secret + * @param code gitee授权前的code,用来换token + * @param redirectUri 待跳转的页面 + * @return 换取gitee授权token的真实地址 + */ + public static String getGiteeAccessTokenUrl(String clientId, String clientSecret, String code, String redirectUri) { + return MessageFormat.format(GITEE_ACCESS_TOKEN_PATTERN, ApiUrlConst.GITEE_ACCESS_TOKEN_URL, clientId, clientSecret, code, redirectUri); + } + + /** + * 获取gitee用户详情的接口地址 + * + * @param token gitee 应用的token + * @return json + */ + public static String getGiteeUserInfoUrl(String token) { + return MessageFormat.format(GITEE_USER_INFO_PATTERN, ApiUrlConst.GITEE_USER_INFO_URL, token); + } + + /** + * 获取gitee授权地址 + * + * @param clientId gitee 应用的Client ID + * @param redirectUrl gitee 应用授权成功后的回调地址 + * @return json + */ + public static String getGiteeAuthorizeUrl(String clientId, String redirectUrl) { + return MessageFormat.format(GITEE_AUTHORIZE_PATTERN, ApiUrlConst.GITEE_AUTHORIZE_URL, clientId, redirectUrl); + } +} -- GitLab