首页 > 解决方案 > React Native - sha256 code_challenge 在使用异步函数后没有返回正确的值

问题描述

我在尝试将我的代码验证器转换为代码挑战时遇到了麻烦。由于某种原因,该函数要么不等待异步,要么每次都返回 null。我已经坚持了几个小时了。任何帮助或建议将不胜感激。

导出默认函数 App() {

  console.log('verifier: ' + verifier);
  const challenge = async() => {
    await generateCodeChallengeFromVerifier(verifier)
      .then(base64encoded => { 
        resolve(base64encoded) })
      .catch(error => { 
        return reject(error);
      })
  }

  console.log('verifier: ' + verifier);
  console.log('challenge: ' + JSON.stringify(challenge()));

示例结果:

verifier: 0a34386f23aeb7b4c3cb984a49898ccd7c865965fb4f29659ce1588a
challenge: {"_U":0,"_V":0,"_W":null,"_X":null}

这是我正在调用的已定义函数:

// GENERATING CODE VERIFIER
function dec2hex(dec) {
  return ("0" + dec.toString(16)).substr(-2);
}
function generateCodeVerifier() {
  var array = new Uint32Array(56 / 2);
  window.crypto.getRandomValues(array);
  return Array.from(array, dec2hex).join("");
}
const verifier = generateCodeVerifier(); 

// GENERATING CODE CHALLENGE
function sha256(plain) {
  const encoder = new TextEncoder();
  const data = encoder.encode(plain);
  return window.crypto.subtle.digest("SHA-256", data);
}
function base64urlencode(a) {
      var str = "";
      var bytes = new Uint8Array(a);
      var len = bytes.byteLength;
      for (var i = 0; i < len; i++) {
        str += String.fromCharCode(bytes[i]);
      }
      return btoa(str)
        .replace(/\+/g, "-")
        .replace(/\//g, "_")
        .replace(/=+$/, "");
}
async function generateCodeChallengeFromVerifier(v) {
  var hashed = await sha256(v);
  var base64encoded = base64urlencode(hashed);
  return base64encoded;
}

标签: react-nativeoauth-2.0pkce

解决方案


推荐阅读