Skip to content

Commit 7d58d35

Browse files
authored
Add OAuth2 authentication support (#5253)
* feat(mg-gateway): add OAuth2 authentication support - Add OAuth2 authentication configuration to GatewayConfiguration - Implement OAuth2Authentication - Update `SecurityFilter` and `UserRestful` to process OAuth2 request Signed-off-by: kazutoiris <[email protected]> * feat(mg-gateway): add OAuth configuration - Add OAuth-related properties to `linkis-mg-gateway.properties` - Include support for GitHub OAuth as an example Signed-off-by: kazutoiris <[email protected]> * style: reformat code Signed-off-by: kazutoiris <[email protected]> * feat(mg-gateway): add OAuth in frontend - Add OAuth login option to the login page - Implement OAuth callback route and component - Add translations for OAuth login text Signed-off-by: kazutoiris <[email protected]> * docs: add OAuth authentication documentation --------- Signed-off-by: kazutoiris <[email protected]>
1 parent 7697578 commit 7d58d35

File tree

11 files changed

+471
-1
lines changed

11 files changed

+471
-1
lines changed

docs/configuration/linkis-gateway-core.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,11 @@
3636
|linkis-gateway-core|wds.linkis.gateway.this.schema| | gateway.this.schema|
3737
|linkis-gateway-core|wds.linkis.web.enable.water.mark|true| web.enable.water.mark|
3838
|linkis-gateway-core|wds.linkis.entrance.name| |linkis.entrance.name|
39+
|linkis-gateway-core|wds.linkis.gateway.conf.enable.oauth.auth| false |wds.linkis.gateway.conf.enable.oauth.auth|
40+
|linkis-gateway-core|wds.linkis.gateway.auth.oauth.authentication.url| |wds.linkis.gateway.auth.oauth.authentication.url|
41+
|linkis-gateway-core|wds.linkis.gateway.auth.oauth.exchange.url| |wds.linkis.gateway.auth.oauth.exchange.url|
42+
|linkis-gateway-core|wds.linkis.gateway.auth.oauth.validate.url| |wds.linkis.gateway.auth.oauth.validate.url|
43+
|linkis-gateway-core|wds.linkis.gateway.auth.oauth.validate.field| |wds.linkis.gateway.auth.oauth.validate.field|
44+
|linkis-gateway-core|wds.linkis.gateway.auth.oauth.client.id| |wds.linkis.gateway.auth.oauth.client.id|
45+
|linkis-gateway-core|wds.linkis.gateway.auth.oauth.client.secret| |wds.linkis.gateway.auth.oauth.client.secret|
46+
|linkis-gateway-core|wds.linkis.gateway.auth.oauth.scope| |wds.linkis.gateway.auth.oauth.scope|

linkis-dist/package/conf/linkis-mg-gateway.properties

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,15 @@ wds.linkis.ldap.proxy.baseDN=
3030
wds.linkis.ldap.proxy.userNameFormat=
3131
wds.linkis.admin.user=hadoop
3232
#wds.linkis.admin.password=
33+
##OAuth
34+
wds.linkis.oauth.enable=false
35+
wds.linkis.oauth.url=https://github.com/login/oauth/authorize
36+
wds.linkis.gateway.auth.oauth.exchange.url=https://github.com/login/oauth/access_token
37+
wds.linkis.gateway.auth.oauth.validate.url=https://api.github.com/user
38+
wds.linkis.gateway.auth.oauth.validate.field=login
39+
wds.linkis.gateway.auth.oauth.client.id=YOUR_CLIENT_ID
40+
wds.linkis.gateway.auth.oauth.client.secret=YOUR_CLIENT_SECRET
41+
wds.linkis.gateway.auth.oauth.scope=user
3342
##Spring
3443
spring.server.port=9001
3544

linkis-spring-cloud-services/linkis-service-gateway/linkis-gateway-core/src/main/scala/org/apache/linkis/gateway/config/GatewayConfiguration.scala

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,15 @@ object GatewayConfiguration {
4242
val TOKEN_AUTHENTICATION_SCAN_INTERVAL =
4343
CommonVars("wds.linkis.gateway.conf.token.auth.scan.interval", 1000 * 60 * 10)
4444

45+
val ENABLE_OAUTH_AUTHENTICATION = CommonVars("wds.linkis.gateway.conf.enable.oauth.auth", false)
46+
val OAUTH_AUTHENTICATION_URL = CommonVars("wds.linkis.gateway.auth.oauth.authentication.url", "")
47+
val OAUTH_EXCHANGE_URL = CommonVars("wds.linkis.gateway.auth.oauth.exchange.url", "")
48+
val OAUTH_VALIDATE_URL = CommonVars("wds.linkis.gateway.auth.oauth.validate.url", "")
49+
val OAUTH_VALIDATE_FIELD = CommonVars("wds.linkis.gateway.auth.oauth.validate.field", "")
50+
val OAUTH_CLIENT_ID = CommonVars("wds.linkis.gateway.auth.oauth.client.id", "")
51+
val OAUTH_CLIENT_SECRET = CommonVars("wds.linkis.gateway.auth.oauth.client.secret", "")
52+
val OAUTH_SCOPE = CommonVars("wds.linkis.gateway.auth.oauth.scope", "")
53+
4554
val PASS_AUTH_REQUEST_URI =
4655
CommonVars("wds.linkis.gateway.conf.url.pass.auth", "/dws/").getValue.split(",")
4756

linkis-spring-cloud-services/linkis-service-gateway/linkis-gateway-core/src/main/scala/org/apache/linkis/gateway/security/SecurityFilter.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import org.apache.linkis.common.utils.{Logging, Utils}
2323
import org.apache.linkis.gateway.config.GatewayConfiguration
2424
import org.apache.linkis.gateway.config.GatewayConfiguration._
2525
import org.apache.linkis.gateway.http.GatewayContext
26+
import org.apache.linkis.gateway.security.oauth.OAuth2Authentication
2627
import org.apache.linkis.gateway.security.sso.SSOInterceptor
2728
import org.apache.linkis.gateway.security.token.TokenAuthentication
2829
import org.apache.linkis.server.{validateFailed, Message}
@@ -127,6 +128,8 @@ object SecurityFilter extends Logging {
127128
logger.info("No login needed for proxy uri: " + gatewayContext.getRequest.getRequestURI)
128129
} else if (TokenAuthentication.isTokenRequest(gatewayContext)) {
129130
TokenAuthentication.tokenAuth(gatewayContext)
131+
} else if (OAuth2Authentication.isOAuth2Request(gatewayContext)) {
132+
OAuth2Authentication.OAuth2Entry(gatewayContext)
130133
} else {
131134
val userName = Utils.tryCatch(GatewaySSOUtils.getLoginUser(gatewayContext)) {
132135
case n @ (_: NonLoginException | _: LoginExpireException) =>

linkis-spring-cloud-services/linkis-service-gateway/linkis-gateway-core/src/main/scala/org/apache/linkis/gateway/security/UserRestful.scala

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ package org.apache.linkis.gateway.security
2020
import org.apache.linkis.common.utils.{Logging, RSAUtils, Utils}
2121
import org.apache.linkis.gateway.config.GatewayConfiguration
2222
import org.apache.linkis.gateway.http.GatewayContext
23+
import org.apache.linkis.gateway.security.oauth.OAuth2Authentication
2324
import org.apache.linkis.gateway.security.sso.SSOInterceptor
2425
import org.apache.linkis.gateway.security.token.TokenAuthentication
2526
import org.apache.linkis.protocol.usercontrol.{
@@ -87,6 +88,20 @@ abstract class AbstractUserRestful extends UserRestful with Logging {
8788
TokenAuthentication.tokenAuth(gatewayContext, true)
8889
return
8990
}
91+
case "oauth-login" =>
92+
Utils.tryCatch {
93+
val loginUser = GatewaySSOUtils.getLoginUsername(gatewayContext)
94+
Message
95+
.ok(loginUser + " already logged in, please log out before signing in(已经登录,请先退出再进行登录)!")
96+
.data("userName", loginUser)
97+
}(_ => {
98+
OAuth2Authentication.OAuth2Auth(gatewayContext, true)
99+
return
100+
})
101+
case "oauth-redirect" => {
102+
OAuth2Authentication.OAuth2Redirect(gatewayContext)
103+
return
104+
}
90105
case "logout" => logout(gatewayContext)
91106
case "userInfo" => userInfo(gatewayContext)
92107
case "publicKey" => publicKey(gatewayContext)

0 commit comments

Comments
 (0)