Re: [webauthn] Provide request deserialization, response serialization (#1683)

> These are the kinds of good questions I figured we'd get to in a PR after I gauged sufficient (current) interest in the idea of serialization helpers to attempt to make a change to the spec. I'm sure there are a few opinions about where values like `transports` should go in a serialized representation of the `PublicKeyCredentials` we get back from `.create()` and `.get()` and I believe together we can get to something that makes sense.

For what it's worth, `@github/webauthn-json` [uses a JSON-based schema to keep track of the necessary conversions](https://github.com/github/webauthn-json#schema), and you can get the current schema using:

```shell
npx @github/webauthn-json schema
```

As of `v0.6.3`, the schema is:

<details><pre>
{
  "credentialCreationOptions": {
    "publicKey": {
      "required": true,
      "schema": {
        "rp": {
          "required": true,
          "schema": "copy"
        },
        "user": {
          "required": true,
          "schema": {
            "id": {
              "required": true,
              "schema": "convert"
            },
            "name": {
              "required": true,
              "schema": "copy"
            },
            "displayName": {
              "required": true,
              "schema": "copy"
            }
          }
        },
        "challenge": {
          "required": true,
          "schema": "convert"
        },
        "pubKeyCredParams": {
          "required": true,
          "schema": "copy"
        },
        "timeout": {
          "required": false,
          "schema": "copy"
        },
        "excludeCredentials": {
          "required": false,
          "schema": [
            {
              "type": {
                "required": true,
                "schema": "copy"
              },
              "id": {
                "required": true,
                "schema": "convert"
              },
              "transports": {
                "required": false,
                "schema": "copy"
              }
            }
          ]
        },
        "authenticatorSelection": {
          "required": false,
          "schema": "copy"
        },
        "attestation": {
          "required": false,
          "schema": "copy"
        },
        "extensions": {
          "required": false,
          "schema": {
            "appid": {
              "required": false,
              "schema": "copy"
            },
            "appidExclude": {
              "required": false,
              "schema": "copy"
            },
            "credProps": {
              "required": false,
              "schema": "copy"
            }
          }
        }
      }
    },
    "signal": {
      "required": false,
      "schema": "copy"
    }
  },
  "publicKeyCredentialWithAttestation": {
    "type": {
      "required": true,
      "schema": "copy"
    },
    "id": {
      "required": true,
      "schema": "copy"
    },
    "rawId": {
      "required": true,
      "schema": "convert"
    },
    "response": {
      "required": true,
      "schema": {
        "clientDataJSON": {
          "required": true,
          "schema": "convert"
        },
        "attestationObject": {
          "required": true,
          "schema": "convert"
        },
        "transports": {
          "required": true,
          "schema": "copy"
        }
      }
    },
    "clientExtensionResults": {
      "required": true,
      "schema": {
        "appid": {
          "required": false,
          "schema": "copy"
        },
        "appidExclude": {
          "required": false,
          "schema": "copy"
        },
        "credProps": {
          "required": false,
          "schema": "copy"
        }
      }
    }
  },
  "credentialRequestOptions": {
    "mediation": {
      "required": false,
      "schema": "copy"
    },
    "publicKey": {
      "required": true,
      "schema": {
        "challenge": {
          "required": true,
          "schema": "convert"
        },
        "timeout": {
          "required": false,
          "schema": "copy"
        },
        "rpId": {
          "required": false,
          "schema": "copy"
        },
        "allowCredentials": {
          "required": false,
          "schema": [
            {
              "type": {
                "required": true,
                "schema": "copy"
              },
              "id": {
                "required": true,
                "schema": "convert"
              },
              "transports": {
                "required": false,
                "schema": "copy"
              }
            }
          ]
        },
        "userVerification": {
          "required": false,
          "schema": "copy"
        },
        "extensions": {
          "required": false,
          "schema": {
            "appid": {
              "required": false,
              "schema": "copy"
            },
            "appidExclude": {
              "required": false,
              "schema": "copy"
            },
            "credProps": {
              "required": false,
              "schema": "copy"
            }
          }
        }
      }
    },
    "signal": {
      "required": false,
      "schema": "copy"
    }
  },
  "publicKeyCredentialWithAssertion": {
    "type": {
      "required": true,
      "schema": "copy"
    },
    "id": {
      "required": true,
      "schema": "copy"
    },
    "rawId": {
      "required": true,
      "schema": "convert"
    },
    "response": {
      "required": true,
      "schema": {
        "clientDataJSON": {
          "required": true,
          "schema": "convert"
        },
        "authenticatorData": {
          "required": true,
          "schema": "convert"
        },
        "signature": {
          "required": true,
          "schema": "convert"
        },
        "userHandle": {
          "required": true,
          "schema": "convert"
        }
      }
    },
    "clientExtensionResults": {
      "required": true,
      "schema": {
        "appid": {
          "required": false,
          "schema": "copy"
        },
        "appidExclude": {
          "required": false,
          "schema": "copy"
        },
        "credProps": {
          "required": false,
          "schema": "copy"
        }
      }
    }
  },
  "version": "0.6.3"
}
</pre></details>

-- 
GitHub Notification of comment by lgarron
Please view or discuss this issue at https://github.com/w3c/webauthn/issues/1683#issuecomment-1013939175 using your GitHub account


-- 
Sent via github-notify-ml as configured in https://github.com/w3c/github-notify-ml-config

Received on Sunday, 16 January 2022 19:42:43 UTC