diff --git a/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java b/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java
index 70e784f17f8e2e08793bf471ba403220ddc0a132..e115bfc3dd1066c7cc56373d1ecab4cddda14511 100644
--- a/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java
+++ b/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java
@@ -1268,6 +1268,30 @@ public enum AuthDefaultSource implements AuthSource {
return "https://www.proginn.com/openapi/user/basic_info";
}
+ @Override
+ public Class extends AuthDefaultRequest> getTargetClass() {
+ return AuthProginnRequest.class;
+ }
+ },
+ /**
+ * 爱发电 爱发电
+ */
+ AFDIAN {
+ @Override
+ public String authorize() {
+ return "https://afdian.net/oauth2/authorize";
+ }
+
+ @Override
+ public String accessToken() {
+ return "https://afdian.net/api/oauth2/access_token";
+ }
+
+ @Override
+ public String userInfo() {
+ return "";
+ }
+
@Override
public Class extends AuthDefaultRequest> getTargetClass() {
return AuthProginnRequest.class;
diff --git a/src/main/java/me/zhyd/oauth/request/AuthAfDianRequest.java b/src/main/java/me/zhyd/oauth/request/AuthAfDianRequest.java
new file mode 100644
index 0000000000000000000000000000000000000000..b30385e2ebdbfe8d1c75339a8b3d9ea9157e6f3c
--- /dev/null
+++ b/src/main/java/me/zhyd/oauth/request/AuthAfDianRequest.java
@@ -0,0 +1,73 @@
+package me.zhyd.oauth.request;
+
+import com.alibaba.fastjson.JSONObject;
+import me.zhyd.oauth.cache.AuthStateCache;
+import me.zhyd.oauth.config.AuthConfig;
+import me.zhyd.oauth.config.AuthDefaultSource;
+import me.zhyd.oauth.enums.AuthUserGender;
+import me.zhyd.oauth.model.AuthCallback;
+import me.zhyd.oauth.model.AuthToken;
+import me.zhyd.oauth.model.AuthUser;
+import me.zhyd.oauth.utils.HttpUtils;
+import me.zhyd.oauth.utils.UrlBuilder;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 爱发电
+ *
+ * @author handy
+ */
+public class AuthAfDianRequest extends AuthDefaultRequest {
+
+ public AuthAfDianRequest(AuthConfig config) {
+ super(config, AuthDefaultSource.AFDIAN);
+ }
+
+ public AuthAfDianRequest(AuthConfig config, AuthStateCache authStateCache) {
+ super(config, AuthDefaultSource.AFDIAN, authStateCache);
+ }
+
+ @Override
+ protected AuthToken getAccessToken(AuthCallback authCallback) {
+ Map params = new HashMap<>();
+ params.put("grant_type", "authorization_code");
+ params.put("client_id", config.getClientId());
+ params.put("client_secret", config.getClientSecret());
+ params.put("code", authCallback.getCode());
+ params.put("redirect_uri", config.getRedirectUri());
+ String response = new HttpUtils(config.getHttpConfig()).post(AuthDefaultSource.AFDIAN.accessToken(), params, false).getBody();
+ JSONObject accessTokenObject = JSONObject.parseObject(response);
+ String userId = accessTokenObject.getJSONObject("data").getString("user_id");
+ return AuthToken.builder().userId(userId).build();
+ }
+
+ @Override
+ protected AuthUser getUserInfo(AuthToken authToken) {
+ return AuthUser.builder()
+ .uuid(authToken.getUserId())
+ .gender(AuthUserGender.UNKNOWN)
+ .token(authToken)
+ .source(source.toString())
+ .build();
+ }
+
+ /**
+ * 返回带{@code state}参数的授权url,授权回调时会带上这个{@code state}
+ *
+ * @param state state 验证授权流程的参数,可以防止csrf
+ * @return 返回授权地址
+ */
+ @Override
+ public String authorize(String state) {
+ return UrlBuilder.fromBaseUrl(source.authorize())
+ .queryParam("response_type", "code")
+ .queryParam("scope", "basic")
+ .queryParam("client_id", config.getClientId())
+ .queryParam("redirect_uri", config.getRedirectUri())
+ .queryParam("state", getRealState(state))
+ .build();
+ }
+
+}