我对铁 rust 还是个新手,现在我在玩Axum. 我想用PKCE实现一个授权码流.因此,我必须将生成的PKCE代码验证器移交给回调路径,以便将代码交换为令牌,这样我就可以继续使用会话等登录我的用户.
现在我主要使用锤子,只是为了描述为什么解决方案可能看起来像这样:
#[derive(Clone)]
struct AppState {
db: PgPool,
oauth_client: BasicClient,
verifiers: Arc<Mutex<HashMap<String, String>>>,
}
#[debug_handler]
async fn callback(
State(state): State<AppState>,
Query(auth_request): Query<AuthRequest>,
) -> Result<impl IntoResponse, impl IntoResponse> {
let auth_request = auth_request;
let verifiers = state.verifiers.lock().unwrap();
let pkce_verifier = verifiers.get(&auth_request.state).unwrap().into();
let pkce_verifier = PkceCodeVerifier::new(pkce_verifier);
let _token_result = match state
.oauth_client
.exchange_code(AuthorizationCode::new(auth_request.code))
.set_pkce_verifier(pkce_verifier)
.request_async(async_http_client)
.await
{
Ok(res) => res,
Err(e) => {
error!("could not exchange code: {e}");
return Err((StatusCode::INTERNAL_SERVER_ERROR, e.to_string()));
}
};
Ok(Redirect::temporary("/"))
}
错误如下:
--> src/main.rs:134:10
|
125 | let verifiers = state.verifiers.lock().unwrap();
| --------- has type `std::sync::MutexGuard<'_, std::collections::HashMap<std::string::String, std::string::String>>` which is not `Send`
134 | .await
| ^^^^^ await occurs here, with `verifiers` maybe used later
我知道互斥体的锁定时间太长了.我试着理解了很多类似的问题,但我还不能理解这个.
有人能帮我解决这个可能很琐碎的问题吗?
提前感谢您的帮助.