1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
use crate::AppState;
use crate::error::XrpcError;
use atproto_identity::key::{did_method_key_value, to_public};
use axum::extract::State;
use axum::routing::get;
use axum::{Json, Router};
use serde_json::{Value, json};
pub fn routes() -> Router<AppState> {
Router::new().route("/.well-known/did.json", get(did_json))
}
pub fn document(state: &AppState) -> anyhow::Result<Value> {
let config = &state.config;
let public = to_public(&config.signing_key)?.to_string();
Ok(json!({
"@context": ["https://www.w3.org/ns/did/v1", "https://w3id.org/security/multikey/v1"],
"id": config.did,
"verificationMethod": [{
"id": format!("{}#atproto", config.did),
"type": "Multikey",
"controller": config.did,
"publicKeyMultibase": did_method_key_value(&public),
}],
"service": [{
"id": "#zkwid",
"type": "ZkwidService",
"serviceEndpoint": config.base_url,
}],
}))
}
async fn did_json(State(state): State<AppState>) -> Result<Json<Value>, XrpcError> {
Ok(Json(document(&state)?))
}