test_realm.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import axios from 'axios';
  2. import dotenv from 'dotenv';
  3. dotenv.config();
  4. const KEYCLOAK_URL = process.env.KEYCLOAK_URL || 'https://auth.mrx8086.com';
  5. const NEXTCLOUD_CLIENT_ID = process.env.NEXTCLOUD_CLIENT_ID || 'nextcloud';
  6. const CLIENT_SECRET = process.env.KEYCLOAK_NEXTCLOUD_CLIENT_SECRET;
  7. const TESTADMIN_USERNAME = "testadmin@mrx8086.com";
  8. const TESTADMIN_PASSWORD = process.env.TESTADMIN_PASSWORD || "initial123!";
  9. const REALM_NAME = 'office-automation';
  10. // Hilfsfunktion für API-Fehlerbehandlung
  11. const handleAxiosError = (error, operation, config, response) => {
  12. console.error(`Error during ${operation}:`);
  13. if (config) {
  14. console.error('Request:', {
  15. method: config.method,
  16. url: config.url,
  17. headers: config.headers,
  18. data: config.data,
  19. });
  20. }
  21. if (error.response) {
  22. console.error('Response:', {
  23. status: error.response.status,
  24. data: error.response.data
  25. });
  26. } else {
  27. console.error('Error Message:', error.message);
  28. }
  29. throw error;
  30. };
  31. // Funktion um den Access Token abzufragen
  32. async function getAccessToken(username, password) {
  33. try {
  34. const response = await axios.post(
  35. `${KEYCLOAK_URL}/realms/${REALM_NAME}/protocol/openid-connect/token`,
  36. new URLSearchParams({
  37. client_id: NEXTCLOUD_CLIENT_ID,
  38. client_secret: CLIENT_SECRET,
  39. grant_type: 'password',
  40. username: username,
  41. password: password,
  42. scope: "openid profile email groups",
  43. }),
  44. {
  45. headers: {
  46. 'Content-Type': 'application/x-www-form-urlencoded',
  47. },
  48. }
  49. );
  50. return response.data.access_token;
  51. } catch (error) {
  52. handleAxiosError(error, 'getting access token', error.config, error.response);
  53. return null;
  54. }
  55. }
  56. // Funktion zum Decodieren eines JWT-Tokens
  57. function decodeToken(token) {
  58. try {
  59. const base64Url = token.split('.')[1];
  60. const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
  61. const jsonPayload = decodeURIComponent(atob(base64).split('').map(function (c) {
  62. return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
  63. }).join(''));
  64. return JSON.parse(jsonPayload);
  65. } catch (error) {
  66. console.error("Error decoding token:", error.message);
  67. return null;
  68. }
  69. }
  70. async function testKeycloakLogin() {
  71. try {
  72. const accessToken = await getAccessToken(TESTADMIN_USERNAME, TESTADMIN_PASSWORD);
  73. if (!accessToken) {
  74. console.error('Failed to get access token.');
  75. return;
  76. }
  77. console.log('Access Token:', accessToken);
  78. const decodedToken = decodeToken(accessToken);
  79. if (decodedToken) {
  80. console.log('Decoded Access Token:', decodedToken);
  81. if (decodedToken.groups.includes('/Administrators')){
  82. console.log("Admin Group is set correctly!")
  83. } else {
  84. console.error("Admin Group is not set correctly!")
  85. }
  86. }
  87. } catch (error) {
  88. console.error('An error occurred:', error);
  89. }
  90. }
  91. testKeycloakLogin();