useLogin.tsx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import { useEffect, useMemo, useState } from "preact/hooks";
  2. const parseJwt = token => {
  3. var base64Url = token.split('.')[1];
  4. var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
  5. var jsonPayload = decodeURIComponent(window.atob(base64).split('').map(
  6. c => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)
  7. ).join(''));
  8. return JSON.parse(jsonPayload);
  9. };
  10. // const idcsStripe = "https://idcs-25070016ce0c4eb8b6eea18f07fe170d.identity.oraclecloud.com";
  11. const idcsStripe = "https://idcs-login-stage.identity.oraclecloud.com";
  12. // const clientId = "4e728d65cf5b482ea81e56bf23a9ad8a";
  13. const clientId = "754db2d1964d4f12ab312a2ab6f025ed";
  14. const login = () => {
  15. const state = crypto.randomUUID();
  16. const nonce = crypto.randomUUID();
  17. sessionStorage.setItem("oauth", JSON.stringify({ state, nonce }));
  18. window.location.href = `${idcsStripe}/oauth2/v1/authorize` +
  19. `?client_id=${clientId}` +
  20. "&response_type=code" +
  21. `&redirect_uri=${encodeURIComponent(window.location.href)}` +
  22. "&scope=openid" +
  23. `&nonce=${nonce}` +
  24. `&state=${state}`;
  25. };
  26. const logout = (token: string) => () => {
  27. // fetch(
  28. // `https://idcs-25070016ce0c4eb8b6eea18f07fe170d.identity.oraclecloud.com/oauth2/v1/userlogout?post_logout_redirect_uri=${encodeURIComponent(window.location.origin)}&id_token_hint=${token}`,
  29. // // `https://idcs-25070016ce0c4eb8b6eea18f07fe170d.identity.oraclecloud.com/sso/v1/user/logout?post_logout_redirect_uri=${encodeURIComponent(window.location.origin)}&id_token_hint=${token}`,
  30. // // `https://idcs-25070016ce0c4eb8b6eea18f07fe170d.identity.oraclecloud.com/oauth2/v1/userlogout?id_token_hint=${token}`,
  31. // // `${idcsStripe}/oauth2/v1/userlogout`,
  32. // {
  33. // headers: {
  34. // "Content-Type": "application/scim+json",
  35. // // Authorization: `Bearer ${accessToken}`
  36. // // Authorization: "Basic NGU3MjhkNjVjZjViNDgyZWE4MWU1NmJmMjNhOWFkOGE6ZGM1NDdkYmUtOGQ0Yi00MTU1LWEzNzgtZjNhMDNkNTZhNjU0"
  37. // }
  38. // }
  39. // );
  40. window.location.href = `${idcsStripe}/sso/v1/user/logout`;
  41. }
  42. export const useLogin = () => {
  43. const [userLogin, setUserLogin] = useState("");
  44. const [accessToken, setAccessToken] = useState("");
  45. const [idToken, setIdToken] = useState("");
  46. useEffect(() => {
  47. const searchParams = new URLSearchParams(window.location.search);
  48. if (searchParams.has("code") && searchParams.has("state")) {
  49. const { state, nonce } = JSON.parse(sessionStorage.getItem("oauth"));
  50. const receivedState = searchParams.get("state");
  51. if (receivedState !== state) {
  52. return;
  53. }
  54. // Get the tokens using the received authorization code
  55. const code = searchParams.get("code");
  56. console.log("code", code);
  57. fetch("https://localhost/occ/api/auth/login", {
  58. method: "POST",
  59. headers: new Headers({
  60. "Content-Type": "application/json"
  61. }),
  62. body: JSON.stringify({ code, nonce })
  63. })
  64. .then(response => response.json())
  65. .then(body => {
  66. const idToken = parseJwt(body.idToken);
  67. setUserLogin(idToken.user_displayname);
  68. setIdToken(body.idToken);
  69. setAccessToken(body.accessToken);
  70. console.log("Tokens:", { idToken, accessToken: parseJwt(body.accessToken) })
  71. })
  72. .finally(() => sessionStorage.removeItem("oauth"));
  73. // Clear the search parameter from the url
  74. window.history.pushState({}, document.title, window.location.pathname);
  75. } else {
  76. sessionStorage.removeItem("oauth");
  77. }
  78. }, []);
  79. return {
  80. userLogin,
  81. idToken,
  82. accessToken,
  83. login,
  84. logout: logout(idToken)
  85. };
  86. };