-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
サーバサイド・クライアントサイドに応じたトークン検証方法を考慮 #41
Comments
フロントエンドとバックエンドの認証エラーの問題について、詳細な調査を行った結果、以下の点が判明しました:
これらの状況から、 解決策1. サーバー側でクッキーからJWTトークンを取得して認証するように変更
a. カスタムミドルウェアの作成
// backend/src/middleware/jwt_from_cookie.rs
use actix_web::{dev::ServiceRequest, Error, HttpMessage};
use actix_service::{Service, Transform};
use futures::future::{ok, Ready, LocalBoxFuture};
use crate::usecases::auth::AuthUseCase;
use crate::errors::AppError;
use std::sync::Arc;
use log::{debug, error};
pub struct JwtFromCookie {
auth_usecase: Arc<AuthUseCase>,
}
impl JwtFromCookie {
pub fn new(auth_usecase: Arc<AuthUseCase>) -> Self {
Self { auth_usecase }
}
}
impl<S, B> Transform<S, ServiceRequest> for JwtFromCookie
where
S: Service<ServiceRequest, Response = actix_web::dev::ServiceResponse<B>, Error = Error> + 'static,
S::Future: 'static,
B: 'static,
{
type Response = actix_web::dev::ServiceResponse<B>;
type Error = Error;
type Transform = JwtFromCookieMiddleware<S>;
type InitError = ();
type Future = Ready<Result<Self::Transform, Self::InitError>>;
fn new_transform(&self, service: S) -> Self::Future {
ok(JwtFromCookieMiddleware {
service: Arc::new(service),
auth_usecase: self.auth_usecase.clone(),
})
}
}
pub struct JwtFromCookieMiddleware<S> {
service: Arc<S>,
auth_usecase: Arc<AuthUseCase>,
}
impl<S, B> Service<ServiceRequest> for JwtFromCookieMiddleware<S>
where
S: Service<ServiceRequest, Response = actix_web::dev::ServiceResponse<B>, Error = Error> + 'static,
S::Future: 'static,
B: 'static,
{
type Response = actix_web::dev::ServiceResponse<B>;
type Error = Error;
type Future = LocalBoxFuture<'static, Result<Self::Response, Self::Error>>;
fn poll_ready(
&self,
ctx: &mut std::task::Context<'_>,
) -> std::task::Poll<Result<(), Self::Error>> {
self.service.poll_ready(ctx)
}
fn call(&self, mut req: ServiceRequest) -> Self::Future {
let auth_usecase = self.auth_usecase.clone();
let srv = self.service.clone();
Box::pin(async move {
// クッキーからアクセス トークンを取得
if let Some(cookie) = req.cookie("access_token") {
let token = cookie.value();
debug!("Validating JWT token from cookie: {}", token);
match auth_usecase.verify_access_token(token).await {
Ok(_) => {
debug!("Token validation succeeded");
srv.call(req).await
},
Err(e) => {
error!("Token validation failed: {:?}", e);
// 認証失敗時のレスポンス
Err(actix_web::error::ErrorUnauthorized("Invalid token"))
}
}
} else {
debug!("No access_token cookie found");
// トークンがない場合のレスポンス
Err(actix_web::error::ErrorUnauthorized("No token provided"))
}
})
}
} b. ミドルウェアの登録作成したカスタムミドルウェアを // backend/src/main.rs
use actix_web::{App, HttpServer};
use crate::middleware::jwt_from_cookie::JwtFromCookie;
use std::sync::Arc;
use crate::usecases::auth::AuthUseCase;
#[actix_web::main]
async fn main() -> std::io::Result<()> {
// AuthUseCaseの初期化(必要に応じて)
let auth_usecase = Arc::new(AuthUseCase::new(/* 引数 */));
HttpServer::new(move || {
App::new()
.wrap(JwtFromCookie::new(auth_usecase.clone()))
// 他のミドルウェアやルートの設定
.service(/* APIルート */)
})
.bind("127.0.0.1:8080")?
.run()
.await
} 2. フロントエンド側の
|
memo
|
サーバサイドでAPI呼ぶならAuthorizationヘッダで検証できなさそう。
(Cookieにはセキュリティの都合でHttpOnly属性付与している)
フロントとバックエンド両方調べる。
The text was updated successfully, but these errors were encountered: