diff --git a/CHANGELOGS.md b/CHANGELOGS.md index 6e399cb..40a76ba 100644 --- a/CHANGELOGS.md +++ b/CHANGELOGS.md @@ -6,6 +6,7 @@ - 添加`appleid`社交登录能力。 [Github#192](https://github.com/justauth/JustAuth/pull/192) - 添加`figma`社交登录能力。 [Gitee#41](https://gitee.com/yadong.zhang/JustAuth/pulls/41) - 添加新版`企业微信扫码`登录能力。 [Github Issue#165](https://github.com/justauth/JustAuth/issues/165) + - 添加新版`华为`登录能力,原`AuthHuaweiRequest`会在后面版本被弃用,如有使用,请切换到`AuthHuaweiV3Request` - 新增微信小程序授权登录 - 优化 - 更新 Google 端点地址。[Github #198](https://github.com/justauth/JustAuth/pull/198) diff --git a/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java b/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java index dd704c3..4b583a5 100644 --- a/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java +++ b/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java @@ -709,8 +709,11 @@ public enum AuthDefaultSource implements AuthSource { /** * 华为 * + * 当前方式未来可能被废弃,建议使用 {@link this#HUAWEI_V3} + * * @since 1.10.0 */ + @Deprecated HUAWEI { @Override public String authorize() { @@ -738,6 +741,38 @@ public enum AuthDefaultSource implements AuthSource { } }, + /** + * 华为最新版本的 API + * + * @since 1.16.7 + */ + HUAWEI_V3 { + @Override + public String authorize() { + return "https://oauth-login.cloud.huawei.com/oauth2/v3/authorize"; + } + + @Override + public String accessToken() { + return "https://oauth-login.cloud.huawei.com/oauth2/v3/token"; + } + + @Override + public String userInfo() { + return "https://account.cloud.huawei.com/rest.php"; + } + + @Override + public String refresh() { + return "https://oauth-login.cloud.huawei.com/oauth2/v3/token"; + } + + @Override + public Class extends AuthDefaultRequest> getTargetClass() { + return AuthHuaweiV3Request.class; + } + }, + /** * 企业微信二维码登录 * diff --git a/src/main/java/me/zhyd/oauth/enums/scope/AuthHuaweiScope.java b/src/main/java/me/zhyd/oauth/enums/scope/AuthHuaweiScope.java index 4e450f9..05d0873 100644 --- a/src/main/java/me/zhyd/oauth/enums/scope/AuthHuaweiScope.java +++ b/src/main/java/me/zhyd/oauth/enums/scope/AuthHuaweiScope.java @@ -6,12 +6,15 @@ import lombok.Getter; /** * 华为平台 OAuth 授权范围 * + * 当前方式未来可能被废弃,建议使用 {@link AuthHuaweiV3Scope} + * * @author yadong.zhang (yadong.zhang0415(a)gmail.com) * @version 1.0.0 * @since 1.0.0 */ @Getter @AllArgsConstructor +@Deprecated public enum AuthHuaweiScope implements AuthScope { /** diff --git a/src/main/java/me/zhyd/oauth/enums/scope/AuthHuaweiV3Scope.java b/src/main/java/me/zhyd/oauth/enums/scope/AuthHuaweiV3Scope.java new file mode 100644 index 0000000..f2d04a4 --- /dev/null +++ b/src/main/java/me/zhyd/oauth/enums/scope/AuthHuaweiV3Scope.java @@ -0,0 +1,51 @@ +package me.zhyd.oauth.enums.scope; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 华为平台 V3 版本 OAuth 授权范围 + * + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @version 1.0.0 + * @since 1.16.7 + */ +@Getter +@AllArgsConstructor +public enum AuthHuaweiV3Scope implements AuthScope { + + /** + * {@code scope} 含义,以{@code description} 为准 + */ + OPENID("openid", "基础scope,v3必选", true), + /** + * {@code scope} 含义,以{@code description} 为准 + */ + BASE_PROFILE("https://www.huawei.com/auth/account/base.profile", "获取用户的基本信息", true), + MOBILE_NUMBER("https://www.huawei.com/auth/account/mobile.number", "获取用户的手机号", false), + ACCOUNTLIST("https://www.huawei.com/auth/account/accountlist", "获取用户的账单列表", false), + + /** + * 以下两个 scope 不需要经过华为评估和验证 + */ + SCOPE_DRIVE_FILE("https://www.huawei.com/auth/drive.file", "只允许访问由应用程序创建或打开的文件", false), + SCOPE_DRIVE_APPDATA("https://www.huawei.com/auth/drive.appdata", "只允许访问由应用程序创建或打开的文件", false), + /** + * 以下四个 scope 使用前需要向drivekit@huawei.com提交申请 + *
+ * 参考:https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides-V5/server-dev-0000001050039664-V5#ZH-CN_TOPIC_0000001050039664__section1618418855716
+ */
+ SCOPE_DRIVE("https://www.huawei.com/auth/drive", "只允许访问由应用程序创建或打开的文件", false),
+ SCOPE_DRIVE_READONLY("https://www.huawei.com/auth/drive.readonly", "只允许访问由应用程序创建或打开的文件", false),
+ SCOPE_DRIVE_METADATA("https://www.huawei.com/auth/drive.metadata", "只允许访问由应用程序创建或打开的文件", false),
+ SCOPE_DRIVE_METADATA_READONLY("https://www.huawei.com/auth/drive.metadata.readonly", "只允许访问由应用程序创建或打开的文件", false),
+
+
+ ;
+ ;
+
+ private final String scope;
+ private final String description;
+ private final boolean isDefault;
+
+}
diff --git a/src/main/java/me/zhyd/oauth/request/AuthHuaweiRequest.java b/src/main/java/me/zhyd/oauth/request/AuthHuaweiRequest.java
index 22a12d6..2249c7a 100644
--- a/src/main/java/me/zhyd/oauth/request/AuthHuaweiRequest.java
+++ b/src/main/java/me/zhyd/oauth/request/AuthHuaweiRequest.java
@@ -23,10 +23,13 @@ import static me.zhyd.oauth.enums.AuthResponseStatus.SUCCESS;
/**
* 华为授权登录
*
+ * 当前方式未来可能被废弃,建议使用 {@link AuthHuaweiV3Request}
+ *
* @author yadong.zhang (yadong.zhang0415(a)gmail.com)
* @version 1.0
* @since 1.10.0
*/
+@Deprecated
public class AuthHuaweiRequest extends AuthDefaultRequest {
public AuthHuaweiRequest(AuthConfig config) {
@@ -71,7 +74,9 @@ public class AuthHuaweiRequest extends AuthDefaultRequest {
form.put("nsp_ts", System.currentTimeMillis() + "");
form.put("access_token", authToken.getAccessToken());
form.put("nsp_fmt", "JS");
- form.put("nsp_svc", "OpenUP.User.getInfo");
+ form.put("open_id", "OPENID");
+ // form.put("nsp_svc", "OpenUP.User.getInfo");
+ form.put("nsp_svc", "huawei.oauth2.user.getTokenInfo");
String response = new HttpUtils(config.getHttpConfig()).post(source.userInfo(), form, false).getBody();
JSONObject object = JSONObject.parseObject(response);
diff --git a/src/main/java/me/zhyd/oauth/request/AuthHuaweiV3Request.java b/src/main/java/me/zhyd/oauth/request/AuthHuaweiV3Request.java
new file mode 100644
index 0000000..6da0ad0
--- /dev/null
+++ b/src/main/java/me/zhyd/oauth/request/AuthHuaweiV3Request.java
@@ -0,0 +1,196 @@
+package me.zhyd.oauth.request;
+
+import com.alibaba.fastjson.JSONObject;
+import com.xkcoding.http.constants.Constants;
+import com.xkcoding.http.support.HttpHeader;
+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.enums.scope.AuthHuaweiV3Scope;
+import me.zhyd.oauth.exception.AuthException;
+import me.zhyd.oauth.model.AuthCallback;
+import me.zhyd.oauth.model.AuthResponse;
+import me.zhyd.oauth.model.AuthToken;
+import me.zhyd.oauth.model.AuthUser;
+import me.zhyd.oauth.utils.*;
+
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+import static me.zhyd.oauth.enums.AuthResponseStatus.SUCCESS;
+
+/**
+ * 华为授权登录
+ *
+ * @author yadong.zhang (yadong.zhang0415(a)gmail.com)
+ * @version 1.0
+ * @since 1.16.7
+ */
+public class AuthHuaweiV3Request extends AuthDefaultRequest {
+
+ public AuthHuaweiV3Request(AuthConfig config) {
+ super(config, AuthDefaultSource.HUAWEI_V3);
+ }
+
+ public AuthHuaweiV3Request(AuthConfig config, AuthStateCache authStateCache) {
+ super(config, AuthDefaultSource.HUAWEI_V3, authStateCache);
+ }
+
+ /**
+ * 获取access token
+ *
+ * @param authCallback 授权成功后的回调参数
+ * @return token
+ * @see AuthDefaultRequest#authorize()
+ * @see AuthDefaultRequest#authorize(String)
+ */
+ @Override
+ public AuthToken getAccessToken(AuthCallback authCallback) {
+ Map