diff --git a/README.md b/README.md
index 4e48e6f8736aaba74fd6dc9f798d3f57fbde2b04..90eed164309f8ebb97e7d4292bd7f31e8a3e4c57 100644
--- a/README.md
+++ b/README.md
@@ -33,6 +33,7 @@
![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/wechats.png) |
![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/taobao.png) |
![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/google.png) |
+ ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/facebook.png) |
@@ -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 386891705e4e6d3b43ce9d054e34e347531f9fe3..355d4cc4fcb358faca914d03cfb42d2dda89f419 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 0000000000000000000000000000000000000000..7862aa5863023972584a91876eb333a5e35b213e
--- /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 377475fb98dbcaee95619a49e179cbaaa07ca59d..c81c034f67f723eca95357bdd3bc0238f075c0ae 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 f4f964dfa91ddaa5f03d0e3472ef7bfe0f26b316..04cb751043cfa9cffdb3dd6796dc295d5e48a0e4 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 0000000000000000000000000000000000000000..31867dacbf7d81803dff8c312b3f9df9c8366705
--- /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 5467739f2426444bfebdaaefc2b14c9ed6e0a21b..e4a1c111fd3b6bc2eab7940f54110c66896acda5 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);
+ }
}