我刚刚添加了一个明确的setBearerToken() API(在 v0.0.28 中),它添加了承载令牌 HTTP 标头:
setBearerToken(token:string): void {
this.headers.set("Authorization", "Bearer " + token);
}
并确认它在这个node/browser compatible test 中有效:
var client = new JsonServiceClient("http://test.servicestack.net");
client.setBearerToken(jwtToken);
var success = await client.post(new Authenticate());
您的问题与 JWT 无关。您应该检查您的 HTTP 响应标头以了解更多信息。 400 响应是一个错误的请求异常,您将收到一个 401 未授权异常的未授权响应。
Token Cookie vs Bearer Token
另请注意,在ss=jwt Cookie 中传递 JWT 令牌的 setTokenCookie() 与添加到 Authorization HTTP 请求标头的承载令牌无关。
如果您通过不同的身份验证提供程序进行身份验证时您的 JWT 配置正确,例如:
var request = new Authenticate();
request.provider = "credentials";
request.userName = userName;
request.password = password;
var authResponse = await client.post(request);
var jwtToken = authResponse.bearerToken;
JWT 令牌将填充到 authResponse.bearerToken 中,您可以将其与 client.setBearerToken() 一起使用以添加 HTTP 请求标头。认证后也可以去/auth查看JWT BearerToken。
如果 bearerToken 未填充,则 JWT Provider 不会为该请求填充它。如果您不使用https,则需要确保RequireSecureConnection=false 允许它通过http 工作。
如果您愿意,您可以改为告诉 ServiceStack 您要使用 JWT Cookie,您可以在验证时指定:
var request = new Authenticate();
request.useTokenCookie = true;
在这种情况下,JWT 令牌不是在 bearerToken 中返回,而是填充在 ss=tok HttpOnly Cookie 中,JavaScript 无法直接访问该 Cookie,但将在以后的每个 ServiceClient 请求中透明地发送。