From a739ca374e91f2c27d7c88a6a32ca756b993f88e Mon Sep 17 00:00:00 2001 From: "yadong.zhang" Date: Tue, 21 May 2019 23:33:17 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E5=A2=9E=E5=8A=A0facebook?= =?UTF-8?q?=E6=8E=88=E6=9D=83=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 ++ .../authorization/AuthorizationFactory.java | 1 + .../authorization/FacebookAuthorization.java | 19 +++++ .../java/me/zhyd/oauth/consts/ApiUrl.java | 29 ++++++++ .../java/me/zhyd/oauth/model/AuthSource.java | 1 + .../oauth/request/AuthFacebookRequest.java | 72 +++++++++++++++++++ .../java/me/zhyd/oauth/utils/UrlBuilder.java | 38 ++++++++++ 7 files changed, 165 insertions(+) create mode 100644 src/main/java/me/zhyd/oauth/authorization/FacebookAuthorization.java create mode 100644 src/main/java/me/zhyd/oauth/request/AuthFacebookRequest.java diff --git a/README.md b/README.md index 4e48e6f..90eed16 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,7 @@ + @@ -90,6 +91,7 @@ authRequest.login("code"); | | [AuthWeChatRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthWeChatRequest.java) | 参考文档 | | | [AuthTaobaoRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthTaobaoRequest.java) | 参考文档 | | | [AuthGoogleRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthGoogleRequest.java) | 参考文档 | +| | [AuthFacebookRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthFacebookRequest.java) | 参考文档 | ## 后续开发计划 @@ -162,6 +164,9 @@ authRequest.login("code"); #### 授权Google ![授权Google登录](https://images.gitee.com/uploads/images/2019/0521/190650_85c5f1c7_784199.png "授权Google登录") +#### 授权Facebook +![授权Facebook登录](https://images.gitee.com/uploads/images/2019/0521/190650_85c5f1c7_784199.png "授权Facebook登录") + # 交流 diff --git a/src/main/java/me/zhyd/oauth/authorization/AuthorizationFactory.java b/src/main/java/me/zhyd/oauth/authorization/AuthorizationFactory.java index 3868917..355d4cc 100644 --- a/src/main/java/me/zhyd/oauth/authorization/AuthorizationFactory.java +++ b/src/main/java/me/zhyd/oauth/authorization/AuthorizationFactory.java @@ -66,6 +66,7 @@ public class AuthorizationFactory { AuthorizationFactory.register(AuthSource.TENCEN_CLOUD, new TencentCloudAuthorization()); AuthorizationFactory.register(AuthSource.WECHAT, new WeChatAuthorization()); AuthorizationFactory.register(AuthSource.WEIBO, new WeiboAuthorization()); + AuthorizationFactory.register(AuthSource.FACEBOOK, new FacebookAuthorization()); loader = true; } diff --git a/src/main/java/me/zhyd/oauth/authorization/FacebookAuthorization.java b/src/main/java/me/zhyd/oauth/authorization/FacebookAuthorization.java new file mode 100644 index 0000000..7862aa5 --- /dev/null +++ b/src/main/java/me/zhyd/oauth/authorization/FacebookAuthorization.java @@ -0,0 +1,19 @@ +package me.zhyd.oauth.authorization; + +import me.zhyd.oauth.config.AuthConfig; +import me.zhyd.oauth.utils.UrlBuilder; + +/** + * Facebook授权 + * + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @version 1.3 + * @since 1.3 + */ +public class FacebookAuthorization implements Authorization { + + @Override + public String getAuthorizeUrl(AuthConfig config) { + return UrlBuilder.getFacebookAuthorizeUrl(config.getClientId(), config.getRedirectUri()); + } +} diff --git a/src/main/java/me/zhyd/oauth/consts/ApiUrl.java b/src/main/java/me/zhyd/oauth/consts/ApiUrl.java index 377475f..c81c034 100644 --- a/src/main/java/me/zhyd/oauth/consts/ApiUrl.java +++ b/src/main/java/me/zhyd/oauth/consts/ApiUrl.java @@ -412,6 +412,35 @@ public enum ApiUrl { throw new AuthException(ResponseStatus.UNSUPPORTED); } + @Override + public String refresh() { + throw new AuthException(ResponseStatus.UNSUPPORTED); + } + }, + /** + * Facebook + */ + FACEBOOK { + @Override + public String authorize() { + return "https://www.facebook.com/v3.3/dialog/oauth"; + } + + @Override + public String accessToken() { + return "https://graph.facebook.com/v3.3/oauth/access_token"; + } + + @Override + public String userInfo() { + return "https://graph.facebook.com/v3.3/me"; + } + + @Override + public String revoke() { + throw new AuthException(ResponseStatus.UNSUPPORTED); + } + @Override public String refresh() { throw new AuthException(ResponseStatus.UNSUPPORTED); diff --git a/src/main/java/me/zhyd/oauth/model/AuthSource.java b/src/main/java/me/zhyd/oauth/model/AuthSource.java index f4f964d..04cb751 100644 --- a/src/main/java/me/zhyd/oauth/model/AuthSource.java +++ b/src/main/java/me/zhyd/oauth/model/AuthSource.java @@ -25,4 +25,5 @@ public enum AuthSource { * 谷歌登录,参考文档:https://developers.google.com/identity/protocols/OpenIDConnect */ GOOGLE, + FACEBOOK, } diff --git a/src/main/java/me/zhyd/oauth/request/AuthFacebookRequest.java b/src/main/java/me/zhyd/oauth/request/AuthFacebookRequest.java new file mode 100644 index 0000000..31867da --- /dev/null +++ b/src/main/java/me/zhyd/oauth/request/AuthFacebookRequest.java @@ -0,0 +1,72 @@ +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.AuthSource; +import me.zhyd.oauth.model.AuthToken; +import me.zhyd.oauth.model.AuthUser; +import me.zhyd.oauth.model.AuthUserGender; +import me.zhyd.oauth.utils.UrlBuilder; + +/** + * Facebook登录 + * + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @version 1.0 + * @since 1.8 + */ +public class AuthFacebookRequest extends BaseAuthRequest { + + public AuthFacebookRequest(AuthConfig config) { + super(config, AuthSource.FACEBOOK); + } + + @Override + protected AuthToken getAccessToken(String code) { + String accessTokenUrl = UrlBuilder.getFacebookAccessTokenUrl(config.getClientId(), config.getClientSecret(), code, config.getRedirectUri()); + HttpResponse response = HttpRequest.post(accessTokenUrl).execute(); + JSONObject object = JSONObject.parseObject(response.body()); + + if (object.containsKey("error")) { + throw new AuthException(object.getJSONObject("error").getString("message")); + } + + return AuthToken.builder() + .accessToken(object.getString("access_token")) + .expireIn(object.getIntValue("expires_in")) + .tokenType(object.getString("token_type")) + .build(); + } + + @Override + protected AuthUser getUserInfo(AuthToken authToken) { + String accessToken = authToken.getAccessToken(); + HttpResponse response = HttpRequest.get(UrlBuilder.getFacebookUserInfoUrl(accessToken)).execute(); + String userInfo = response.body(); + JSONObject object = JSONObject.parseObject(userInfo); + if (object.containsKey("error")) { + throw new AuthException(object.getJSONObject("error").getString("message")); + } + String picture = null; + if (object.containsKey("picture")) { + JSONObject pictureObj = object.getJSONObject("picture"); + pictureObj = pictureObj.getJSONObject("data"); + if (null != pictureObj) { + picture = pictureObj.getString("url"); + } + } + return AuthUser.builder() + .username(object.getString("name")) + .nickname(object.getString("name")) + .avatar(picture) + .location(object.getString("locale")) + .email(object.getString("email")) + .gender(AuthUserGender.getRealGender(object.getString("gender"))) + .token(authToken) + .source(AuthSource.FACEBOOK) + .build(); + } +} diff --git a/src/main/java/me/zhyd/oauth/utils/UrlBuilder.java b/src/main/java/me/zhyd/oauth/utils/UrlBuilder.java index 5467739..e4a1c11 100644 --- a/src/main/java/me/zhyd/oauth/utils/UrlBuilder.java +++ b/src/main/java/me/zhyd/oauth/utils/UrlBuilder.java @@ -68,6 +68,10 @@ public class UrlBuilder { private static final String TAOBAO_AUTHORIZE_PATTERN = "{0}?response_type=code&client_id={1}&redirect_uri={2}&state=&view=web"; private static final String TAOBAO_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&code={3}&redirect_uri={4}&grant_type=authorization_code"; + private static final String FACEBOOK_AUTHORIZE_PATTERN = "{0}?client_id={1}&redirect_uri={2}&state={3}&response_type=code&scope="; + private static final String FACEBOOK_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&code={3}&redirect_uri={4}&grant_type=authorization_code"; + private static final String FACEBOOK_USER_INFO_PATTERN = "{0}?access_token={1}&fields=id,name,birthday,gender,hometown,email,devices,picture.width(400)"; + /** * 获取githubtoken的接口地址 * @@ -530,4 +534,38 @@ public class UrlBuilder { public static String getGoogleUserInfoUrl(String token) { return MessageFormat.format(GOOGLE_USER_INFO_PATTERN, ApiUrl.GOOGLE.userInfo(), token); } + + /** + * 获取Facebook授权地址 + * + * @param clientId Facebook 应用的Client ID + * @param redirectUrl Facebook 应用授权成功后的回调地址 + * @return full url + */ + public static String getFacebookAuthorizeUrl(String clientId, String redirectUrl) { + return MessageFormat.format(FACEBOOK_AUTHORIZE_PATTERN, ApiUrl.FACEBOOK.authorize(), clientId, redirectUrl, System.currentTimeMillis()); + } + + /** + * 获取Facebook token的接口地址 + * + * @param clientId Facebook 应用的Client ID + * @param clientSecret Facebook 应用的Client Secret + * @param code Facebook 授权前的code,用来换token + * @param redirectUri 待跳转的页面 + * @return full url + */ + public static String getFacebookAccessTokenUrl(String clientId, String clientSecret, String code, String redirectUri) { + return MessageFormat.format(FACEBOOK_ACCESS_TOKEN_PATTERN, ApiUrl.FACEBOOK.accessToken(), clientId, clientSecret, code, redirectUri); + } + + /** + * 获取Facebook用户详情的接口地址 + * + * @param token Facebook 应用的token + * @return full url + */ + public static String getFacebookUserInfoUrl(String token) { + return MessageFormat.format(FACEBOOK_USER_INFO_PATTERN, ApiUrl.FACEBOOK.userInfo(), token); + } } -- GitLab