Supabase를 이용한 GitHub 소셜 로그인 구현
supabase 와 github 의 연결
supabase 라이브러리 설치 (React / VSCode 환경)
> npm install @supabase/supabase-js
> npm install @supabase/auth-ui-shared @supabase/auth-ui-react
웹 사이트 제작
웹 사이트 제작 후 도메인 설정 또는 로컬호스트도 웹 사이트 주소로 테스트 가능
supabase 인증 관련 설정
supabase key 설정 (VITE 환경)
// .env.local
VITE_SUPABASE_URL = "[ your project URL ]";
VITE_SUPABASE_ANON_KEY = "[ your anon key ]";
supabase Auth 사용하기
import { createClient } from "@supabase/supabase-js";
import { Auth } from "@supabase/auth-ui-react";
import { ThemeSupa } from "@supabase/auth-ui-shared";
export const supabase = createClient(
import.meta.env.VITE_SUPABASE_URL,
import.meta.env.VITE_SUPABASE_ANON_KEY
);
function App() {
const [session, setSession] = useState(null);
useEffect(() => {
supabase.auth.getSession().then(({ data: { session } }) => {
setSession(session);
});
const {
data: { subscription },
} = supabase.auth.onAuthStateChange((_event, session) => {
setSession(session);
});
return () => subscription.unsubscribe();
}, []);
return (
<div className="App">
<div className="Auth">
{!session ? (
<Auth
supabaseClient={supabase}
appearance={{
theme: ThemeSupa,
}}
providers={["github"]}
onlyThirdPartyProviders={true}
/>
) : (
<Logout />
)}
</div>
</div>
);
}
export default App;
import { supabase } from "../App";
const Logout = () => {
const handleLogout = async () => {
try {
const { error } = await supabase.auth.signOut();
} catch (error) {
console.error("Error during logout:", error.message);
}
};
return (
<>
<div>
<h1>Supabase Auth</h1>
<button onClick={handleLogout}>Logout</button>
</div>
</>
);
};
export default Logout;
supabase Auth 버튼 커스터마이징
export const GithubCustomTheme = {
default: {
colors: {
brand: "red",
brandAccent: "darkred",
inputBackground: "white",
inputText: "black",
inputPlaceholder: "darkgray",
},
fonts: {
bodyFontFamily: `'Arial', sans-serif`,
buttonFontFamily: `'Helvetica', sans-serif`,
},
radii: {
borderRadiusButton: "10px",
inputBorderRadius: "5px",
},
},
};
import { GithubCustomTheme } from "./util/supabase-custom-theme";
function App() {
(...)
return (
<div className="App">
<div className="Auth">
{!session ? (
<Auth
supabaseClient={supabase}
appearance={{
theme: GithubCustomTheme,
}}
providers={["github"]}
onlyThirdPartyProviders={true}
/>
) : (
<Logout />
)}
</div>
</div>
);
}
export default App;