PKCE made
This commit is contained in:
parent
2c643eed9e
commit
622309c698
1 changed files with 40 additions and 26 deletions
|
@ -1,36 +1,50 @@
|
|||
// Component 1/7
|
||||
export async function GetPDSWellKnown() {
|
||||
let Data = await fetch("https://bsky.social/.well-known/oauth-authorization-server", {method: "GET"})
|
||||
.then((response) => response.json());
|
||||
return Data;
|
||||
}
|
||||
|
||||
export function CreatePKCE() {
|
||||
let CodeVerifier = new Uint8Array(100);
|
||||
let CodeChallenge;
|
||||
|
||||
// generate a random string of characters.
|
||||
crypto.getRandomValues(CodeVerifier);
|
||||
console.log(CodeVerifier);
|
||||
CodeVerifier = Uint8Array.toBase64({alphabet: "Base64url"});
|
||||
// Now generate a code challenge
|
||||
CodeChallenge = sha256(CodeVerifier.toBase64({alphabet: "Base64url"}));
|
||||
console.log(CodeVerifier);
|
||||
console.log(CodeChallenge);
|
||||
// Component 2/7
|
||||
// Many thanks to https://github.com/tonyxu-io/pkce-generator. It was the base for this code.
|
||||
export async function CreatePKCECodeVerifier() {
|
||||
// Generate some Numbers
|
||||
let Numbers = new Uint8Array(32);
|
||||
crypto.getRandomValues(Numbers);
|
||||
// Generate a random string of characters.
|
||||
let CodeVerifier = "";
|
||||
for (let i in Numbers) {
|
||||
CodeVerifier += String.fromCharCode(Numbers[i]);
|
||||
}
|
||||
// Put this random string into Base64URL format.
|
||||
CodeVerifier = btoa(CodeVerifier).replace(/=/g, '').replace(/\+/g, '-').replace(/\//g, '_');
|
||||
return CodeVerifier;
|
||||
}
|
||||
|
||||
// Stolen from elsewhere
|
||||
// Firefox snippet
|
||||
export async function CreatePKCECodeChallenge(CodeVerifier) {
|
||||
// Generate a code challenge with the code verifier.
|
||||
// This is done by first SHA256 encrypting the CodeVerifier, then putting the outputted string into Base64URL format.
|
||||
let CodeChallenge = btoa(await sha256(CodeVerifier)).replace(/=/g, '').replace(/\+/g, '-').replace(/\//g, '_');
|
||||
return CodeChallenge;
|
||||
}
|
||||
|
||||
// Stolen from elsewhere.
|
||||
// Firefox snippet; Slightly edited.
|
||||
async function sha256(message) {
|
||||
// encode as UTF-8
|
||||
const msgBuffer = new TextEncoder().encode(message);
|
||||
|
||||
// hash the message
|
||||
const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);
|
||||
|
||||
// convert ArrayBuffer to Array
|
||||
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
||||
|
||||
// convert bytes to hex string
|
||||
const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
|
||||
return hashHex;
|
||||
// encode as UTF-8
|
||||
const MessageBuffer = new TextEncoder().encode(message);
|
||||
|
||||
// hash the message
|
||||
const HashBuffer = await crypto.subtle.digest('SHA-256', MessageBuffer);
|
||||
|
||||
// convert ArrayBuffer to Array
|
||||
const HashArray = Array.from(new Uint8Array(HashBuffer));
|
||||
|
||||
// convert this hashArray to a string
|
||||
let string = "";
|
||||
for (let i in HashArray) {
|
||||
string += String.fromCharCode(HashArray[i]);
|
||||
}
|
||||
|
||||
return string;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue