我是否应该调用 MobileServicesClient.RefreshUserAsync()?如果是,我应该在服务器上实现哪种端点?它是否会每次重新发行另一个令牌,使旧的令牌失效?何时应该进行刷新调用?
我检查了方法RefreshUserAsync
from Microsoft.WindowsAzure.Mobile.dll
这将发送一个 get 请求/.auth/refresh
用于为您的登录用户刷新访问令牌的端点。由于您使用的是自定义身份验证,因此无法使用此方法来刷新authenticationToken
.
我读过有关使用永不过期的刷新令牌的信息,但我找不到示例实现,也找不到有关如何在自定义身份验证场景中实现它的说明,有人可以指出我正确的方向吗?
当使用CreateToken
方法来自应用服务登录处理程序 https://github.com/Azure/azure-mobile-apps-net-server/blob/master/src/Microsoft.Azure.Mobile.Server.Login/AppServiceLoginHandler.cs,您可以指定lifetime
as null
,那么你会检索到一个永不过期的authenticationToken
如下:
JwtSecurityToken token = AppServiceLoginHandler.CreateToken(claims, signingKey, audience, issuer,null);
此外,您可以尝试构建端点以基于旧的有效令牌创建新令牌,如下所示:
[Route(".auth/login/customRefreshToken")]
public IHttpActionResult RefreshToken([FromBody] RefreshTokenInput body)
{
string tokenString = body.AuthenticationToken;
try
{
var jwtSecurityToken = new JwtSecurityToken(tokenString);
JwtSecurityToken token = AppServiceLoginHandler.CreateToken(jwtSecurityToken.Claims, signingKey, audience, issuer, TimeSpan.FromDays(30));
return Ok(new LoginResult()
{
AuthenticationToken = token.RawData
});
}
catch (Exception e)
{
return BadRequest("$Error = {e.Message}, StackTrace = {e.StackTrace}");
}
}
Note:对于您的移动客户端,您可以使用MobileServiceClient.InvokeApiAsync
用于检索新令牌,然后解析authenticationToken
并将其更新为MobileServiceClient.CurrentUser.MobileServiceAuthenticationToken
.
RESULT