私は ServiceStack を初めて使用し、それを使用して、リモート サービスから着信要求を受信するエンドポイントを提供しています。エンドユーザーは関与しません。
認証フローは次のようになります (リモート サービスの作成者が指定)。
- 「彼らの」リモート サービスが「私たちの」エンドポイントを呼び出し、ヘッダーに JWT が含まれる
- 「私たちの」エンドポイントは、JWT から「子供」を抽出します
- 「私たちの」エンドポイントは、「子供」をパラメータとして「彼らの」oauthエンドポイントを呼び出します
- 「彼らの」oauth エンドポイントは、JWK (RS256) の形式で公開鍵を返します。
- 「私たちの」エンドポイントは、JWK を使用して JWT 署名を検証します
ServiceStack はこの認証フローをサポートしていますか?
リクエストの認証にフックし、上記の手順 2 ~ 5 を実行するコードを記述する必要があると思います。そうですか?
編集:私が求めているものと思われるこの回答 を見つけました。つまり、上記の手順2〜5でPreAuthenticateをオーバーライドするカスタムAuthProviderです。
using System;
using ServiceStack;
using ServiceStack.Auth;
using ServiceStack.Web;
namespace MyService
{
public class CustomJwtAuthProvider : AuthProvider, IAuthWithRequest
{
public CustomJwtAuthProvider ()
{
Provider = "CustomJwtAuthProvider";
AuthRealm = "/auth/CustomJwtAuthProvider";
}
public override bool IsAuthorized(IAuthSession session, IAuthTokens tokens, Authenticate request = null)
{
return session.IsAuthenticated;
}
public override object Authenticate(IServiceBase authService, IAuthSession session, Authenticate request)
{
throw new NotImplementedException("Authenticate() should not be called directly");
}
public void PreAuthenticate(IRequest req, IResponse res)
{
// Get kid from JWT
// Get public JWK from oauth endpoint
// Verify JWT signature using JWK
if ( /* JWT sig verified */ )
{
req.Items[Keywords.Session] = new AuthUserSession
{
IsAuthenticated = true,
};
}
}
}
}
次に、ApplicationHost.Configure() で:
Plugins.Add(new AuthFeature(() => new AuthUserSession(),
new IAuthProvider[] {
new CustomJwtAuthProvider(),
}));
このアプローチは正しいと思いますか? JWT 認証を手動で行う必要がありますか、それとも ServiceStack の組み込み機能とプラグインをさらに活用できますか?