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 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 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(); + } + +}