parent
9ae0e0c44c
commit
f5c5c8b40e
@ -0,0 +1,93 @@ |
|||||||
|
function sha256(str) { |
||||||
|
const data = new Uint8Array([...str].map(c => c.charCodeAt(0))); |
||||||
|
return crypto.subtle.digest('SHA-256', data).then(hashBuffer => { |
||||||
|
const hashArray = Array.from(new Uint8Array(hashBuffer)); |
||||||
|
const hashHex = hashArray.map(b => ('00' + b.toString(16)).slice(-2)).join(''); |
||||||
|
return hashHex; |
||||||
|
}); |
||||||
|
} |
||||||
|
function getRandomBytes(len) { |
||||||
|
const arr = new Uint8Array(len); |
||||||
|
window.crypto.getRandomValues(arr); |
||||||
|
return Array.from(arr, (dec) => ('0' + dec.toString(16)).substr(-2)).join(''); |
||||||
|
} |
||||||
|
function toHex(buf) { |
||||||
|
return Array.prototype.map.call(new Uint8Array(buf), x => ('00' + x.toString(16)).slice(-2)).join(''); |
||||||
|
} |
||||||
|
function fromHex(hex) { |
||||||
|
return new Uint8Array(hex.match(/.{1,2}/g).map(byte => parseInt(byte, 16))); |
||||||
|
} |
||||||
|
const curve = 'P-256'; |
||||||
|
const appId = '5ddexxxbdf9e4966b387ba58f4b3fdc3'; |
||||||
|
const deviceId = '2eexxx84b9fc4860b9427feb97a4c142'; |
||||||
|
const userId = '3426axxxbaa04e1ea9ee01bd998d06d4'; |
||||||
|
let nonce = 0; |
||||||
|
const keyPairPromise = crypto.subtle.generateKey( |
||||||
|
{ |
||||||
|
name: 'ECDSA', |
||||||
|
namedCurve: curve |
||||||
|
}, |
||||||
|
true, |
||||||
|
['sign', 'verify'] |
||||||
|
); |
||||||
|
keyPairPromise.then(keyPair => { |
||||||
|
const publicKeyPromise = crypto.subtle.exportKey('raw', keyPair.publicKey); |
||||||
|
const privateKeyPromise = crypto.subtle.exportKey('raw', keyPair.privateKey); |
||||||
|
Promise.all([publicKeyPromise, privateKeyPromise]).then(values => { |
||||||
|
const publicKey = toHex(values[0]); |
||||||
|
const privateKey = toHex(values[1]); |
||||||
|
const r = (appId, deviceId, userId, nonce) => { |
||||||
|
return `${appId}:${deviceId}:${userId}:${nonce}`; |
||||||
|
}; |
||||||
|
const sign = (appId, deviceId, userId, nonce) => { |
||||||
|
const data = r(appId, deviceId, userId, nonce); |
||||||
|
sha256(data).then(hash => { |
||||||
|
crypto.subtle.sign( |
||||||
|
{ |
||||||
|
name: 'ECDSA', |
||||||
|
hash: {name: 'SHA-256'}, |
||||||
|
}, |
||||||
|
keyPair.privateKey, |
||||||
|
fromHex(hash) |
||||||
|
).then(signature => { |
||||||
|
const signatureHex = toHex(new Uint8Array(signature)) + '01'; |
||||||
|
const headers = { |
||||||
|
'authorization': 'Bearer eyJhbGciOiJSUz', |
||||||
|
'origin': 'https://www.yundrive.com', |
||||||
|
'referer': 'https://www.yundrive.com/', |
||||||
|
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.41', |
||||||
|
'x-canary': 'client=web,app=adrive,version=v3.17.0', |
||||||
|
'x-device-id': deviceId, |
||||||
|
'x-signature': signatureHex, |
||||||
|
}; |
||||||
|
const data = { |
||||||
|
'deviceName': 'Edge浏览器', |
||||||
|
'modelName': 'Windows网页版', |
||||||
|
'pubKey': publicKey, |
||||||
|
}; |
||||||
|
const options = { |
||||||
|
method: 'POST', |
||||||
|
headers: headers, |
||||||
|
body: JSON.stringify(data), |
||||||
|
}; |
||||||
|
fetch('https://api.yundrive.com/session', options).then(response => { |
||||||
|
return response.json(); |
||||||
|
}).then(data => { |
||||||
|
console.log(data); |
||||||
|
}).catch(error => { |
||||||
|
console.error(error); |
||||||
|
}); |
||||||
|
}).catch(error => { |
||||||
|
console.error(error); |
||||||
|
}); |
||||||
|
}).catch(error => { |
||||||
|
console.error(error); |
||||||
|
}); |
||||||
|
}; |
||||||
|
sign(appId, deviceId, userId, nonce); |
||||||
|
}).catch(error => { |
||||||
|
console.error(error); |
||||||
|
}); |
||||||
|
}).catch(error => { |
||||||
|
console.error(error); |
||||||
|
}); |
Loading…
Reference in new issue