From 5a1523564b1db3204490273dfbb8aa0052b45ede Mon Sep 17 00:00:00 2001 From: lcry <1318070+lcry@user.noreply.gitee.com> Date: Mon, 12 May 2025 02:07:46 +0000 Subject: [PATCH] =?UTF-8?q?!677=20add=20=E6=96=B0=E5=A2=9E=20=E5=AF=B9?= =?UTF-8?q?=E6=8E=A5=20gitea=20=E4=B8=89=E6=96=B9=E5=8D=95=E7=82=B9?= =?UTF-8?q?=E7=99=BB=E5=BD=95=20*=20add=20=E6=96=B0=E5=A2=9E=20=E5=AF=B9?= =?UTF-8?q?=E6=8E=A5=20gitea=20=E4=B8=89=E6=96=B9=E5=8D=95=E7=82=B9?= =?UTF-8?q?=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application-dev.yml | 6 ++ .../src/main/resources/application-prod.yml | 6 ++ .../common/social/gitea/AuthGiteaRequest.java | 92 +++++++++++++++++++ .../common/social/gitea/AuthGiteaSource.java | 50 ++++++++++ .../common/social/utils/SocialUtils.java | 2 + script/sql/oracle/oracle_ry_vue_5.X.sql | 4 +- script/sql/postgres/postgres_ry_vue_5.X.sql | 4 +- script/sql/ry_vue_5.X.sql | 4 +- script/sql/sqlserver/sqlserver_ry_vue_5.X.sql | 4 +- script/sql/update/update_5.3.1-5.3.2.sql | 5 + 10 files changed, 169 insertions(+), 8 deletions(-) create mode 100644 ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/gitea/AuthGiteaRequest.java create mode 100644 ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/gitea/AuthGiteaSource.java diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml index d2c45eae1..34a62d39b 100644 --- a/ruoyi-admin/src/main/resources/application-dev.yml +++ b/ruoyi-admin/src/main/resources/application-dev.yml @@ -263,3 +263,9 @@ justauth: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: ${justauth.address}/social-callback?source=gitlab + gitea: + # gitea 服务器地址 + server-url: https://demo.gitea.com + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=gitea diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml index 1c7eae428..8440deece 100644 --- a/ruoyi-admin/src/main/resources/application-prod.yml +++ b/ruoyi-admin/src/main/resources/application-prod.yml @@ -265,3 +265,9 @@ justauth: client-id: 10**********6 client-secret: 1f7d08**********5b7**********29e redirect-uri: ${justauth.address}/social-callback?source=gitlab + gitea: + # gitea 服务器地址 + server-url: https://demo.gitea.com + client-id: 10**********6 + client-secret: 1f7d08**********5b7**********29e + redirect-uri: ${justauth.address}/social-callback?source=gitea diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/gitea/AuthGiteaRequest.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/gitea/AuthGiteaRequest.java new file mode 100644 index 000000000..d3fc7516f --- /dev/null +++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/gitea/AuthGiteaRequest.java @@ -0,0 +1,92 @@ +package org.dromara.common.social.gitea; + +import cn.hutool.core.lang.Dict; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import lombok.extern.slf4j.Slf4j; +import me.zhyd.oauth.cache.AuthStateCache; +import me.zhyd.oauth.config.AuthConfig; +import me.zhyd.oauth.exception.AuthException; +import me.zhyd.oauth.model.AuthCallback; +import me.zhyd.oauth.model.AuthToken; +import me.zhyd.oauth.model.AuthUser; +import me.zhyd.oauth.request.AuthDefaultRequest; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.json.utils.JsonUtils; + +/** + * @author lcry + */ +@Slf4j +public class AuthGiteaRequest extends AuthDefaultRequest { + + public static final String SERVER_URL = SpringUtils.getProperty("justauth.type.gitea.server-url"); + + /** + * 设定归属域 + */ + public AuthGiteaRequest(AuthConfig config) { + super(config, AuthGiteaSource.GITEA); + } + + public AuthGiteaRequest(AuthConfig config, AuthStateCache authStateCache) { + super(config, AuthGiteaSource.GITEA, authStateCache); + } + + @Override + public AuthToken getAccessToken(AuthCallback authCallback) { + String body = doPostAuthorizationCode(authCallback.getCode()); + Dict object = JsonUtils.parseMap(body); + // oauth/token 验证异常 + if (object.containsKey("error")) { + throw new AuthException(object.getStr("error_description")); + } + // user 验证异常 + if (object.containsKey("message")) { + throw new AuthException(object.getStr("message")); + } + return AuthToken.builder() + .accessToken(object.getStr("access_token")) + .refreshToken(object.getStr("refresh_token")) + .idToken(object.getStr("id_token")) + .tokenType(object.getStr("token_type")) + .scope(object.getStr("scope")) + .build(); + } + + @Override + protected String doPostAuthorizationCode(String code) { + HttpRequest request = HttpRequest.post(source.accessToken()) + .form("client_id", config.getClientId()) + .form("client_secret", config.getClientSecret()) + .form("grant_type", "authorization_code") + .form("code", code) + .form("redirect_uri", config.getRedirectUri()); + HttpResponse response = request.execute(); + return response.body(); + } + + @Override + public AuthUser getUserInfo(AuthToken authToken) { + String body = doGetUserInfo(authToken); + Dict object = JsonUtils.parseMap(body); + // oauth/token 验证异常 + if (object.containsKey("error")) { + throw new AuthException(object.getStr("error_description")); + } + // user 验证异常 + if (object.containsKey("message")) { + throw new AuthException(object.getStr("message")); + } + return AuthUser.builder() + .uuid(object.getStr("sub")) + .username(object.getStr("name")) + .nickname(object.getStr("preferred_username")) + .avatar(object.getStr("picture")) + .email(object.getStr("email")) + .token(authToken) + .source(source.toString()) + .build(); + } + +} diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/gitea/AuthGiteaSource.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/gitea/AuthGiteaSource.java new file mode 100644 index 000000000..201b22308 --- /dev/null +++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/gitea/AuthGiteaSource.java @@ -0,0 +1,50 @@ +package org.dromara.common.social.gitea; + +import me.zhyd.oauth.config.AuthSource; +import me.zhyd.oauth.request.AuthDefaultRequest; + +/** + * gitea Oauth2 默认接口说明 + * + * @author lcry + */ +public enum AuthGiteaSource implements AuthSource { + + /** + * 自己搭建的 gitea 私服 + */ + GITEA { + /** + * 授权的api + */ + @Override + public String authorize() { + return AuthGiteaRequest.SERVER_URL + "/login/oauth/authorize"; + } + + /** + * 获取accessToken的api + */ + @Override + public String accessToken() { + return AuthGiteaRequest.SERVER_URL + "/login/oauth/access_token"; + } + + /** + * 获取用户信息的api + */ + @Override + public String userInfo() { + return AuthGiteaRequest.SERVER_URL + "/login/oauth/userinfo"; + } + + /** + * 平台对应的 AuthRequest 实现类,必须继承自 {@link AuthDefaultRequest} + */ + @Override + public Class getTargetClass() { + return AuthGiteaRequest.class; + } + + } +} diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java index db696e515..a73b229f8 100644 --- a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java +++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java @@ -10,6 +10,7 @@ import me.zhyd.oauth.request.*; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.social.config.properties.SocialLoginConfigProperties; import org.dromara.common.social.config.properties.SocialProperties; +import org.dromara.common.social.gitea.AuthGiteaRequest; import org.dromara.common.social.maxkey.AuthMaxKeyRequest; import org.dromara.common.social.topiam.AuthTopIamRequest; @@ -66,6 +67,7 @@ public class SocialUtils { case "aliyun" -> new AuthAliyunRequest(builder.build(), STATE_CACHE); case "maxkey" -> new AuthMaxKeyRequest(builder.build(), STATE_CACHE); case "topiam" -> new AuthTopIamRequest(builder.build(), STATE_CACHE); + case "gitea" -> new AuthGiteaRequest(builder.build(), STATE_CACHE); default -> throw new AuthException("未获取到有效的Auth配置"); }; } diff --git a/script/sql/oracle/oracle_ry_vue_5.X.sql b/script/sql/oracle/oracle_ry_vue_5.X.sql index 7fff0b443..ce38b069d 100644 --- a/script/sql/oracle/oracle_ry_vue_5.X.sql +++ b/script/sql/oracle/oracle_ry_vue_5.X.sql @@ -13,9 +13,9 @@ create table sys_social nick_name varchar2(30) default '', email varchar2(255) default '', avatar varchar2(500) default '', - access_token varchar2(255) not null, + access_token varchar2(2000) not null, expire_in number(20) default null, - refresh_token varchar2(255) default null, + refresh_token varchar2(2000) default null, access_code varchar2(255) default null, union_id varchar2(255) default null, scope varchar2(255) default null, diff --git a/script/sql/postgres/postgres_ry_vue_5.X.sql b/script/sql/postgres/postgres_ry_vue_5.X.sql index 523cbe266..0f92c839e 100644 --- a/script/sql/postgres/postgres_ry_vue_5.X.sql +++ b/script/sql/postgres/postgres_ry_vue_5.X.sql @@ -13,9 +13,9 @@ create table sys_social nick_name varchar(30) default ''::varchar, email varchar(255) default ''::varchar, avatar varchar(500) default ''::varchar, - access_token varchar(255) not null, + access_token varchar(2000) not null, expire_in int8 default null, - refresh_token varchar(255) default null::varchar, + refresh_token varchar(2000) default null::varchar, access_code varchar(255) default null::varchar, union_id varchar(255) default null::varchar, scope varchar(255) default null::varchar, diff --git a/script/sql/ry_vue_5.X.sql b/script/sql/ry_vue_5.X.sql index c17e4a01a..ffc469e29 100644 --- a/script/sql/ry_vue_5.X.sql +++ b/script/sql/ry_vue_5.X.sql @@ -13,10 +13,10 @@ create table sys_social nick_name varchar(30) default '' comment '用户昵称', email varchar(255) default '' comment '用户邮箱', avatar varchar(500) default '' comment '头像地址', - access_token varchar(255) not null comment '用户的授权令牌', + access_token varchar(2000) not null comment '用户的授权令牌', expire_in int default null comment '用户的授权令牌的有效期,部分平台可能没有', refresh_token varchar(255) default null comment '刷新令牌,部分平台可能没有', - access_code varchar(255) default null comment '平台的授权信息,部分平台可能没有', + access_code varchar(2000) default null comment '平台的授权信息,部分平台可能没有', union_id varchar(255) default null comment '用户的 unionid', scope varchar(255) default null comment '授予的权限,部分平台可能没有', token_type varchar(255) default null comment '个别平台的授权信息,部分平台可能没有', diff --git a/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql b/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql index f64d8f804..c7fed712a 100644 --- a/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql +++ b/script/sql/sqlserver/sqlserver_ry_vue_5.X.sql @@ -10,9 +10,9 @@ create table sys_social nick_name nvarchar(30) DEFAULT ('') NULL, email nvarchar(255) DEFAULT ('') NULL, avatar nvarchar(500) DEFAULT ('') NULL, - access_token nvarchar(255) NOT NULL, + access_token nvarchar(2000) NOT NULL, expire_in bigint NULL, - refresh_token nvarchar(255) NULL, + refresh_token nvarchar(2000) NULL, access_code nvarchar(255) NULL, union_id nvarchar(255) NULL, scope nvarchar(255) NULL, diff --git a/script/sql/update/update_5.3.1-5.3.2.sql b/script/sql/update/update_5.3.1-5.3.2.sql index c703a4e72..6feb5c9f7 100644 --- a/script/sql/update/update_5.3.1-5.3.2.sql +++ b/script/sql/update/update_5.3.1-5.3.2.sql @@ -6,3 +6,8 @@ ALTER TABLE `flow_instance` ALTER TABLE `flow_his_task` MODIFY COLUMN `flow_status` varchar(20) NOT NULL COMMENT '流程状态(0待提交 1审批中 2审批通过 4终止 5作废 6撤销 8已完成 9已退回 10失效 11拿回)' AFTER `skip_type` + +ALTER TABLE `sys_social` + MODIFY COLUMN `access_token` varchar(2000) NOT NULL COMMENT '用户的授权令牌' AFTER `avatar`; +ALTER TABLE `sys_social` + MODIFY COLUMN `refresh_token` varchar(2000) NOT NULL COMMENT '刷新令牌,部分平台可能没有' AFTER `expire_in`;