javascript 如何为API身份验证创建client_id和client_secret?

balp4ylt  于 2023-05-12  发布在  Java
关注(0)|答案(2)|浏览(187)

我想实现从机器到机器的身份验证。我正在考虑为API分配一个用户client_secret和client_id,API 1将使用它们来换取JWT访问令牌。
我是否可以为密钥和ID创建2个唯一的字符串,并将它们存储在数据库中的用户中?
大概是这样的

import { randomUUID } from "crypto";
const bcrypt = require('bcrypt');

const saltRounds = 10;

const client_id = randomUUID();
const client_secret = randomUUID();

const salt = bcrypt.genSaltSync(saltRounds);
const hash = bcrypt.hashSync(client_secret, salt);

// store hash in database
// have API store client_secret and client_id as environment variables

客户端密码/ ID然后可以用于在传入请求时验证API?

bcs8qyzn

bcs8qyzn1#

一个更标准的选项可能是在机器之间转发用户令牌,如本文IAM Primer所述。
您所做的一个可能的问题是,您正在为用户存储一个长期有效的凭据,该凭据可用于在未经用户同意的情况下访问资源。
根据场景的不同,从安全的Angular 来看,这可能是不好的,因为如果恶意方掌握了用户的客户端ID和秘密,他们可以作为用户操作,下游API无法知道。

ctehm74n

ctehm74n2#

function generate() {
  let ret = "";
  for (let i = 0; i < 8; i++) {
    const newrand = Math.floor(Math.random() * 4026531840) + 268435456; 
    ret += newrand.toString(16);
  }
  return ret;
}

function convert(id) {
  let ret = "";
  for (let j = 0; j < 22; j++) {
    for (let i = 0; i < 64; i++) {
      const code = id[i].charCodeAt() + id[(i + 1) % 64].charCodeAt();
      ret += String.fromCharCode(Math.floor(code % 93) + 33);
    }
    id = ret;
    ret = "";
  }
  return id;
}

const id = generate();
console.log({ "client-id": id, "client-secret": convert(id) });

相关问题