Skip to main content

oAuth and Account Abstraction

POC 通常代表 "Proof of Concept"(概念验证),而 Demo 则代表 "Demonstration"(演示)。虽然两者在某些情况下可能有相似之处,但它们的目的和使用场景有所不同:

  1. Proof of Concept (POC): 这是一个初步的展示,旨在验证一个想法、概念或技术是否可行。POC 通常是为了证明某个技术或方法在特定条件下可以工作,但它可能不具备完整的功能或不是最终产品。它主要用于评估可行性和潜在的技术风险。

  2. Demonstration (Demo): 这是一个更成熟的展示,通常是为了向潜在客户、投资者或其他利益相关者展示产品或解决方案的功能和价值。Demo 通常是更接近最终产品的版本,目的是展示其实际应用和用户体验。

简单来说,POC 更关注于验证可行性,而 Demo 更关注于展示功能和价值。

  1. https://www.stackup.sh/blog/the-future-of-ethereum-access-oauth-and-account-abstraction
  2. https://forum.openzeppelin.com/t/sign-in-with-google-to-your-identity-contract-for-fun-and-profit/1631
  3. https://cloud.google.com/identity-platform/docs/web/oidc?hl=zh-cn#signing_in_users_directly
  4. https://identity-recovery-demo.openzeppelin.com/ demo 是在 Rinkeby network 上的,运行不了
  5. https://github.com/OpenZeppelin/solidity-jwt 源码
  6. https://cloud.google.com/identity-platform/docs/web/oidc?hl=zh-cn
  7. https://portal.thirdweb.com/connect/in-app-wallet/custom-auth/custom-jwt-auth-server

Verify directly with an identity service provider using JWT ID Tokens

你描述的方案涉及将用户身份验证的责任部分转移到区块链上,通过验证 JSON Web 令牌 (JWT) 签名来确保用户身份。这种方法结合了区块链技术和 OAuth 身份验证机制,确保用户身份的安全性和可信度。以下是该方法的详细步骤:

  1. 用户身份验证

    • 用户通过 OAuth 流程在身份提供者 (IdP) 处进行身份验证。
    • IdP 验证用户身份后,返回一个包含用户身份信息的 ID 令牌(JWT)。
  2. ID 令牌传递

    • 用户将从 IdP 获取的 ID 令牌(JWT)传递给合约账户。
  3. 合约账户验证

    • 合约账户接收到 ID 令牌(JWT)后,需要验证其签名以确保其真实性和完整性。
    • 合约账户调用一个独立的单例 JWT 签名合约,该合约包含主要 OAuth 提供商的公钥。
  4. JWT 签名验证

    • 单例 JWT 签名合约使用存储的公钥来验证 JWT 的签名。
    • 如果签名验证成功,表明该 JWT 是由可信的 IdP 生成的,并且未被篡改。
  5. 身份确认

    • 一旦 JWT 签名验证通过,合约账户可以信任该 JWT 中的用户身份信息。
    • 合约账户根据 JWT 中的用户身份信息进行相应的操作,如授权访问某些资源或执行特定的合约功能。

详细步骤和代码示例

1. 用户身份验证

用户通过 OAuth 流程在 IdP 处进行身份验证,这部分通常在链下完成。

2. ID 令牌传递

用户将从 IdP 获取的 ID 令牌(JWT)传递给合约账户。这可以通过交易的输入参数实现。

3. 合约账户验证

假设我们有一个智能合约 AuthContract 来处理 JWT 验证:

pragma solidity ^0.8.0;

import "./JWTVerifier.sol"; // 导入JWT验证合约

contract AuthContract {
JWTVerifier public jwtVerifier;

constructor(address _jwtVerifier) {
jwtVerifier = JWTVerifier(_jwtVerifier);
}

function authenticateUser(string memory jwt) public view returns (bool) {
// 调用JWT验证合约来验证JWT签名
bool isValid = jwtVerifier.verifyJWT(jwt);
require(isValid, "Invalid JWT");
// 进一步处理,例如记录用户身份信息
return true;
}
}

4. JWT 签名验证

一个简单的 JWT 验证合约示例:

pragma solidity ^0.8.0;

contract JWTVerifier {
mapping(string => address) public trustedIssuers;

constructor() {
// 初始化可信任的IdP公钥地址
trustedIssuers["https://example-idp.com"] = 0x123456789abcdef; // 示例地址
}

function verifyJWT(string memory jwt) public view returns (bool) {
// 解码和验证JWT的逻辑
// 这里省略了实际的JWT解析和验证代码
// 假设已经解析出issuer和签名,并验证签名
string memory issuer = "https://example-idp.com"; // 示例issuer
address issuerPublicKey = trustedIssuers[issuer];
require(issuerPublicKey != address(0), "Issuer not trusted");

// 验证签名(伪代码)
// bool signatureValid = verifySignature(jwt, issuerPublicKey);
// return signatureValid;

return true; // 伪代码,实际应返回签名验证结果
}
}

注意事项

  1. 安全性:确保 JWT 的签名验证机制是安全的,并且公钥存储在智能合约中是可信的。
  2. 性能:在链上进行 JWT 签名验证可能会消耗较多的计算资源,需考虑性能问题。
  3. 扩展性:可以设计更复杂的验证逻辑,包括过期时间检查、JWT 声明验证等。

通过这种方法,可以在区块链上安全地验证用户身份,结合 OAuth 和 JWT 的机制,实现去中心化的身份验证。

google

为了实现以 Google 作为身份提供者 (IdP) 的区块链身份验证系统,我们需要以下几个步骤:

  1. 用户通过 OAuth 流程在 Google 进行身份验证

    • 用户在 Google 登录并授权后,Google 返回一个 ID 令牌(JWT)。
  2. 用户将 ID 令牌传递给区块链上的合约

    • 用户通过交易将从 Google 获取的 ID 令牌(JWT)传递给智能合约。
  3. 智能合约验证 JWT 签名

    • 智能合约调用一个独立的 JWT 验证合约,该合约使用 Google 的公钥来验证 JWT 的签名。
  4. 确认用户身份

    • 一旦 JWT 验证通过,合约可以信任该 JWT 中的用户身份信息,并执行相应的操作。

实现步骤和代码示例

1. 用户身份验证

用户在链下通过 OAuth 流程在 Google 进行身份验证,并获得一个 ID 令牌(JWT)。这部分通常由前端应用处理。

2. ID 令牌传递

用户将从 Google 获取的 ID 令牌(JWT)传递给智能合约。这可以通过交易的输入参数实现。

3. 合约账户验证

假设我们有一个智能合约 AuthContract 来处理 JWT 验证:

pragma solidity ^0.8.0;

import "./JWTVerifier.sol"; // 导入JWT验证合约

contract AuthContract {
JWTVerifier public jwtVerifier;

constructor(address _jwtVerifier) {
jwtVerifier = JWTVerifier(_jwtVerifier);
}

function authenticateUser(string memory jwt) public view returns (bool) {
// 调用JWT验证合约来验证JWT签名
bool isValid = jwtVerifier.verifyJWT(jwt);
require(isValid, "Invalid JWT");
// 进一步处理,例如记录用户身份信息
return true;
}
}

4. JWT 签名验证

一个简单的 JWT 验证合约示例:

pragma solidity ^0.8.0;

contract JWTVerifier {
// Google 的公钥地址
address public googlePublicKey = 0x123456789abcdef; // 示例地址

function verifyJWT(string memory jwt) public view returns (bool) {
// 解码和验证JWT的逻辑
// 这里省略了实际的JWT解析和验证代码
// 假设已经解析出issuer和签名,并验证签名
string memory issuer = "https://accounts.google.com"; // Google 的 issuer
require(keccak256(abi.encodePacked(issuer)) == keccak256(abi.encodePacked("https://accounts.google.com")), "Issuer not trusted");

// 验证签名(伪代码)
// bool signatureValid = verifySignature(jwt, googlePublicKey);
// return signatureValid;

return true; // 伪代码,实际应返回签名验证结果
}
}

详细说明

  1. Google 公钥

    • Google 的公钥可以从 Google 的 OAuth 2.0 文档中获取。通常,Google 会提供一个 JSON Web Key Set (JWKS) 端点,包含用于验证 JWT 签名的公钥。
    • 你需要将这些公钥存储在智能合约中,或者在合约部署时初始化。
  2. JWT 解析和签名验证

    • 在实际实现中,你需要解析 JWT,提取其头部、载荷和签名部分。
    • 使用 Google 提供的公钥验证 JWT 的签名。
    • 由于 Solidity 目前不支持复杂的加密操作,实际的 JWT 签名验证可能需要在链下完成,然后将验证结果传递给智能合约。
  3. 示例代码中的伪代码

    • 由于 Solidity 中无法直接处理复杂的 JWT 验证逻辑,示例代码中包含了伪代码部分。
    • 实际实现中,可以使用链下服务(如 Oracles)来处理 JWT 验证,并将结果传递给智能合约。

额外的安全和性能考虑

  • 安全性:确保 JWT 的签名验证机制是安全的,并且公钥存储在智能合约中是可信的。
  • 性能:在链上进行 JWT 签名验证可能会消耗较多的计算资源,需考虑性能问题。
  • 扩展性:可以设计更复杂的验证逻辑,包括过期时间检查、JWT 声明验证等。

通过这种方法,可以在区块链上安全地验证用户身份,结合 Google OAuth 和 JWT 的机制,实现去中心化的身份验证。

https://github.com/OpenZeppelin/solidity-jwt

rollup.id

https://docs.rollup.id/an-introduction-to-openid-connect-oidc alt text