我是 ServiceStack 的新手,并使用它来提供一个端点,该端点将接收来自远程服务的传入请求。不涉及最终用户。
身份验证流程如下(由远程服务的作者指定):
- “他们的”远程服务调用“我们的”端点,标头中有 JWT
- “我们的”端点从 JWT 中提取“孩子”
- “我们的”端点调用“他们的”oauth 端点,以 'kid' 作为参数
- “他们的”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 的内置功能和插件?