You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Electron集成AWS Cognito动态获取AccessToken遇权限错误求助

解决Electron中AWS Cognito动态获取AccessToken的问题

核心问题分析

你遇到的两个关键问题:

  • USER_SRP_AUTH is not enabled for the client 错误:你的Cognito用户池客户端未启用USER_PASSWORD_AUTH认证流程,或者代码中没有正确指定该流程
  • 动态获取AccessToken失效:getAccessToken是异步操作,但主进程调用时没有等待异步结果,导致拿到undefined;同时代码混用Amplify Auth与原生Cognito SDK,造成会话管理混乱

步骤1:启用Cognito客户端的USER_PASSWORD_AUTH流程

先登录AWS控制台,调整你的Cognito用户池配置:

  • 进入用户池 > App clients页面,选择你的客户端(ID:4m1utu56hjm835dshts9jg63ou)
  • 点击编辑,在认证流程区域勾选ALLOW_USER_PASSWORD_AUTH
  • 保存更改

这是解决USER_SRP_AUTH错误的核心,因为Cognito客户端默认仅启用USER_SRP_AUTH流程。


步骤2:简化代码,统一使用Amplify Auth模块

当前代码混用了Amplify Auth和原生amazon-cognito-identity-js-node,容易导致会话不一致。建议完全基于Amplify Auth封装登录与Token获取逻辑,它已经简化了所有Cognito操作。

重构配置文件

const { Auth, Amplify } = require('aws-amplify');

const COGNITO_USER_POOL_ID = 'eu-west-1_P0Jcr7nig';
const COGNITO_CLIENT_ID = '4m1utu56hjm835dshts9jg63ou';
const AWS_REGION = 'eu-west-1';
const API_ENDPOINT = 'https://your-api-url-here'; // 替换为实际API地址

// 修正Amplify配置:API配置不属于Auth节点
Amplify.configure({
  Auth: {
    mandatorySignIn: false,
    region: AWS_REGION,
    userPoolId: COGNITO_USER_POOL_ID,
    userPoolWebClientId: COGNITO_CLIENT_ID,
    authenticationFlowType: 'USER_PASSWORD_AUTH', // 明确指定认证流程
    oauth: {
      domain: "edc-echosens-cloud.auth.eu-west-1.amazoncognito.com", // 移除https://前缀
      scope: ["email", "profile", "openid"],
      redirectSignIn: "http://localhost:1962/",
      redirectSignOut: "http://localhost:1962/",
      responseType: "code",
    },
  },
  API: {
    endpoints: [
      {
        name: 'PatientsList',
        endpoint: API_ENDPOINT,
      },
    ],
  },
});

// 封装异步登录并获取AccessToken的函数
async function signInAndGetToken(username, password) {
  try {
    // 使用Amplify Auth完成登录
    await Auth.signIn(username, password);
    // 获取当前会话的AccessToken
    const session = await Auth.currentSession();
    const accessToken = session.getAccessToken().getJwtToken();
    console.log('获取到的AccessToken:', accessToken);
    return accessToken;
  } catch (err) {
    console.error('登录或Token获取失败:', err);
    throw err; // 抛出错误让调用方处理
  }
}

// 单独获取已登录用户的Token(无需重新登录)
async function getCurrentAccessToken() {
  try {
    const session = await Auth.currentSession();
    return session.getAccessToken().getJwtToken();
  } catch (err) {
    console.error('获取当前Token失败:', err);
    throw err;
  }
}

exports.Auth = Auth;
exports.signInAndGetToken = signInAndGetToken;
exports.getCurrentAccessToken = getCurrentAccessToken;

重构主进程调用代码

由于signInAndGetToken是异步函数,必须用async/await等待结果,否则会拿到undefined:

const { signInAndGetToken } = require('./your-config-file-path'); // 替换为配置文件路径
const API_URL = 'https://your-api-url-here'; // 替换为实际API地址

const getPatients = async () => {
  try {
    // 先登录并获取有效AccessToken
    const accessToken = await signInAndGetToken('doctoredc@yopmail.com', 'kinG2804*D');
    
    const headers = {
      "Content-Type": "application/json",
      Authorization: `Bearer ${accessToken}` // 注意:多数API要求Bearer前缀,根据云端要求调整
    };
    console.log('Token Value:', accessToken);

    const response = await fetch(API_URL, { 
      method: 'GET', 
      headers: headers 
    });
    
    if (!response.ok) {
      throw new Error(`API请求失败:${response.statusText}`);
    }
    
    const json = await response.json();
    console.log('获取到的患者列表:', json);
  } catch (error) {
    console.error('获取患者列表失败:', error);
  }
};

// 执行请求
getPatients();

步骤3:关键注意事项

  • 异步操作处理:所有Cognito相关操作都是异步的,必须用async/await或.then()处理,不能同步调用获取结果
  • Bearer前缀:大部分API要求Authorization头格式为Bearer <token>,这是静态Token可用但动态Token失效的常见原因之一,请确认云端API的要求
  • 避免重复登录:如果用户已登录,直接调用getCurrentAccessToken即可,无需重复执行登录
  • 依赖清理:移除冗余依赖(如amazon-cognito-identity-js-node),仅保留aws-amplify,减少冲突

验证步骤

  1. 确认Cognito客户端已启用USER_PASSWORD_AUTH流程
  2. 安装最新版aws-amplify:npm install aws-amplify
  3. 替换代码中的API地址与配置信息
  4. 运行Electron应用,查看控制台输出的Token与API返回结果

若仍有问题,可排查:

  • 云端API的Authorization头要求是否正确
  • Cognito用户状态是否为已验证(未验证用户可能无法获取有效Token)
  • Electron的网络权限配置(如webPreferences中nodeIntegration设置,或CSP规则)

内容的提问来源于stack exchange,提问作者Montasser

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 17:37:45