跳至内容

OAuth 加密

加密存储在数据库中的敏感登录密钥,例如登录服务的应用程序密钥和用户的访问令牌。

生成密钥

加密密钥为 16 字节,以 Base64 编码。

要生成密钥

bash
$ meteor node -e 'console.log(require("crypto").randomBytes(16).toString("base64"))'

将 oauth-encryption 与账户一起使用

仅在服务器端,将 oauthSecretKey 选项用于 Accounts.config

js
Accounts.config({ oauthSecretKey: 'onsqJ+1e4iGFlV0nhZYobg==' });

此对 Accounts.config 的调用应在加载时进行(放置在源文件的最顶层),而不是从 Meteor.startup 块内部调用。

为了避免将密钥存储在应用程序的源代码中,您可以使用 Meteor.settings

js
Accounts.config({ oauthSecretKey: Meteor.settings.oauthSecretKey });

迁移未加密的用户令牌

此 Twitter 示例显示了如何加密现有的未加密用户令牌。该查询查找具有 Twitter 访问令牌但没有 algorithm 字段(在令牌加密时创建)的用户文档。然后加密服务数据中的相关字段。

js
const cursor = Meteor.users.find({
  $and: [
    { 'services.twitter.accessToken': { $exists: true } },
    { 'services.twitter.accessToken.algorithm': { $exists: false } }
  ]
});

cursor.forEach((userDoc) => {
  const set = {};

  ['accessToken', 'accessTokenSecret', 'refreshToken'].forEach((field) => {
    const plaintext = userDoc.services.twitter[field];

    if (!_.isString(plaintext)) {
      return;
    }

    set[`services.twitter.${field}`] = OAuthEncryption.seal(
      plaintext,
      userDoc._id
    );
  });

  Meteor.users.update(userDoc._id, { $set: set });
});

在没有账户的情况下使用 oauth-encryption

如果您直接使用 oauth 包而不是通过 Meteor 账户包,则可以使用 OAuthEncryption.loadKey 直接加载 OAuth 加密密钥。

js
OAuthEncryption.loadKey('onsqJ+1e4iGFlV0nhZYobg==');

如果您在流程中调用 retrieveCredential(例如 Twitter.retrieveCredential),您会发现当使用 oauth-encryption 时,敏感的服务数据字段将被加密。

您可以使用 OAuth.openSecrets 解密它们。

js
const credentials = Twitter.retrieveCredential(token);
const serviceData = OAuth.openSecrets(credentials.serviceData);

在 Windows 上使用 oauth-encryption

此包依赖于 npm-node-aes-gcm,它要求您在系统上安装 OpenSSL 才能运行。要在 Windows 上安装 OpenSSL,请使用 此页面 上的二进制文件之一。如果您还没有,请不要忘记安装 Visual Studio 2008 可再发行组件。