Skip to content

Commit 56d1c30

Browse files
authored
fix: restore OIDC login functionality
2 parents 16701f5 + e4e1fcb commit 56d1c30

1 file changed

Lines changed: 68 additions & 7 deletions

File tree

  • portal-web/api-portal-frontend/src/pages

portal-web/api-portal-frontend/src/pages/Login.tsx

Lines changed: 68 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,42 @@
1-
import React, { useState } from "react";
1+
import React, { useEffect, useState } from "react";
22
import { Link, useNavigate, useSearchParams } from "react-router-dom";
3-
import { Form, Input, Button, message } from "antd";
3+
import { Form, Input, Button, message, Divider } from "antd";
44
import { UserOutlined, LockOutlined } from "@ant-design/icons";
5-
import api from "../lib/api";
5+
import api, { type IdpResult } from "../lib/api";
66
import { AxiosError } from "axios";
77
import { Layout } from "../components/Layout";
8+
import APIs from "../lib/apis";
9+
10+
import aliyunIcon from "../assets/aliyun.png";
11+
import githubIcon from "../assets/github.png";
12+
import googleIcon from "../assets/google.png";
13+
14+
15+
const oidcIcons: Record<string, React.ReactNode> = {
16+
google: <img src={googleIcon} alt="Google" className="w-5 h-5 mr-2" />,
17+
github: <img src={githubIcon} alt="GitHub" className="w-6 h-6 mr-2" />,
18+
aliyun: <img src={aliyunIcon} alt="Aliyun" className="w-6 h-6 mr-2" />,
19+
};
820

921
const Login: React.FC = () => {
22+
const [providers, setProviders] = useState<IdpResult[]>([]);
1023
const [loading, setLoading] = useState(false);
1124
const navigate = useNavigate();
1225
const [searchParams] = useSearchParams();
1326

27+
useEffect(() => {
28+
// 使用OidcController的接口获取OIDC提供商
29+
APIs.getOidcProviders()
30+
.then(({data}) => {
31+
console.log('OIDC providers response:', data);
32+
setProviders(data);
33+
})
34+
.catch((error) => {
35+
console.error('Failed to fetch OIDC providers:', error);
36+
setProviders([]);
37+
});
38+
}, []);
39+
1440
// 账号密码登录
1541
const handlePasswordLogin = async (values: { username: string; password: string }) => {
1642
setLoading(true);
@@ -45,14 +71,25 @@ const Login: React.FC = () => {
4571
}
4672
};
4773

74+
// 跳转到 OIDC 授权 - 对接OidcController
75+
const handleOidcLogin = (provider: string) => {
76+
// 获取API前缀配置
77+
const apiPrefix = api.defaults.baseURL || '/api/v1';
78+
79+
// 构建授权URL - 对接 /developers/oidc/authorize
80+
const authUrl = new URL(`${window.location.origin}${apiPrefix}/developers/oidc/authorize`);
81+
authUrl.searchParams.set('provider', provider);
82+
83+
console.log('Redirecting to OIDC authorization:', authUrl.toString());
84+
85+
// 跳转到OIDC授权服务器
86+
window.location.href = authUrl.toString();
87+
};
88+
4889
return (
4990
<Layout>
5091
<div
5192
className="min-h-[calc(100vh-96px)] w-full flex items-center justify-center"
52-
style={{
53-
backdropFilter: 'blur(204px)',
54-
WebkitBackdropFilter: 'blur(204px)',
55-
}}
5693
>
5794
<div className="w-full max-w-md mx-4">
5895
{/* 登录卡片 */}
@@ -115,6 +152,30 @@ const Login: React.FC = () => {
115152
</Button>
116153
</Form.Item>
117154
</Form>
155+
{/* 分隔线 */}
156+
{
157+
providers.length > 0 && (
158+
<Divider plain className="text-subTitle"><span className="text-subTitle"></span></Divider>
159+
)
160+
}
161+
{/* OIDC 登录按钮 */}
162+
<div className="flex flex-col gap-2 mb-2">
163+
{providers.length === 0 ? (
164+
null
165+
) : (
166+
providers.map((provider) => (
167+
<Button
168+
key={provider.provider}
169+
onClick={() => handleOidcLogin(provider.provider)}
170+
className="w-full flex items-center justify-center"
171+
size="large"
172+
icon={oidcIcons[provider.provider.toLowerCase()] || <span></span>}
173+
>
174+
使用 {provider.name || provider.provider} 登录
175+
</Button>
176+
))
177+
)}
178+
</div>
118179
<div className="text-center text-subTitle">
119180
没有账号?<Link to="/register" className="text-colorPrimary hover:text-colorPrimary hover:underline">注册</Link>
120181
</div>

0 commit comments

Comments
 (0)