从TypeScript上缺少JsonServiceClient上的SetToken和SetTokenCookie

时间:2017-03-10 21:56:59

标签: servicestack

在使用TypeScript中的JsonServiceClient调用ServiceStack时,我们无法分配BearerToken。如此问题中所述,SetCookie和SetCookieToken方法似乎缺失:

ServiceStack Javascript JsonServiceClient missing properties

我们尝试了那里描述的解决方案:

this.client.headers.append("Authorization" , "Bearer " + jwtToken);

但是当我们尝试这个时,我们得到一个HTTP 400:错误请求

我们如何使用JavaScript中的JsonServiceClient和BearerToken?

1 个答案:

答案 0 :(得分:3)

我刚刚添加了一个明确的setBearerToken() API(在v.0.0.2中),它添加了Bearer Token HTTP Header:

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 未经授权的异常响应。

令牌Cookie与承载令牌

另请注意,setTokenCookie() Cookie中传递JWT令牌的ss=jwt与添加到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提供商不会为该请求填充它。如果您未使用https,则需要确保RequireSecureConnection=false允许其在http上工作。

如果您愿意,可以改为告诉ServiceStack您要使用JWT Cookie,您可以在进行身份验证时指定:

var request = new Authenticate();
request.useTokenCookie = true;

在这种情况下,不是在bearerToken中返回JWT令牌,而是在ss=tok HttpOnly Cookie中填充,JavaScript无法直接访问,但将在每个未来的ServiceClient中透明地发送请求。