// installable packages
|
|
const base64url = require("base64url");
|
|
const { v4: uuidv4 } = require("uuid");
|
|
const fetch = require("node-fetch").default;
|
|
|
|
// native packages
|
|
const crypto = require("crypto");
|
|
const { URL, URLSearchParams } = require("url");
|
|
|
|
// config
|
|
const BASE_URL = "http://localhost:8080";
|
|
const REALM = "demorealm";
|
|
const REDIRECT_URI = "com.juice.booster3://auth";
|
|
const CLIENT_ID = "native-webview";
|
|
|
|
const sha256encrypt = (code) => {
|
|
const base64Digest = crypto
|
|
.createHash("sha256")
|
|
.update(code)
|
|
.digest("base64");
|
|
|
|
return base64url.fromBase64(base64Digest);
|
|
};
|
|
|
|
const nonceFactory = () => {
|
|
const timestamp = Date.now();
|
|
return sha256encrypt(timestamp.toString());
|
|
};
|
|
|
|
function generateAuthUrl() {
|
|
const nonce = uuidv4();
|
|
const state = uuidv4();
|
|
|
|
const url = new URL(
|
|
`${BASE_URL}/auth/realms/${REALM}/protocol/openid-connect/auth`,
|
|
);
|
|
url.searchParams.append("client_id", CLIENT_ID);
|
|
url.searchParams.append("redirect_uri", REDIRECT_URI);
|
|
url.searchParams.append("state", state);
|
|
url.searchParams.append("response_mode", "fragment");
|
|
url.searchParams.append("response_type", "code");
|
|
url.searchParams.append("scope", "openid");
|
|
url.searchParams.append("nonce", nonce);
|
|
|
|
console.log(url.href);
|
|
}
|
|
|
|
async function getTokenByUrl(urlString) {
|
|
let url = new URL(urlString);
|
|
|
|
let code = new URLSearchParams(url.hash).get("code");
|
|
console.log(`Auth with code is: ${code}`);
|
|
|
|
url = new URL(
|
|
`${BASE_URL}/auth/realms/${REALM}/protocol/openid-connect/token`,
|
|
);
|
|
const payload = {
|
|
client_id: CLIENT_ID,
|
|
code,
|
|
grant_type: "authorization_code",
|
|
redirect_uri: REDIRECT_URI,
|
|
};
|
|
|
|
let response = await fetch(url, {
|
|
method: "POST",
|
|
headers: {
|
|
"Content-Type": "application/x-www-form-urlencoded",
|
|
Accept: "*/*",
|
|
},
|
|
redirect: "manual",
|
|
body: new URLSearchParams(payload).toString(),
|
|
});
|
|
|
|
const token = await response.json();
|
|
console.log(token);
|
|
}
|
|
|
|
async function refresh(refresh_token) {
|
|
const url = new URL(
|
|
`${BASE_URL}/auth/realms/${REALM}/protocol/openid-connect/token`,
|
|
);
|
|
const payload = {
|
|
client_id: CLIENT_ID,
|
|
refresh_token,
|
|
grant_type: "refresh_token",
|
|
redirect_uri: REDIRECT_URI,
|
|
};
|
|
|
|
let response = await fetch(url, {
|
|
method: "POST",
|
|
headers: {
|
|
"Content-Type": "application/x-www-form-urlencoded",
|
|
Accept: "*/*",
|
|
},
|
|
redirect: "manual",
|
|
body: new URLSearchParams(payload).toString(),
|
|
});
|
|
|
|
const token = await response.json();
|
|
console.log(token);
|
|
}
|
|
|
|
if (require.main === module) {
|
|
const redirectUri = process.argv[2];
|
|
if (redirectUri == null) {
|
|
generateAuthUrl();
|
|
} else {
|
|
getTokenByUrl(redirectUri);
|
|
}
|
|
}
|