ค้นหาเว็บไซต์

TypeScript - RefreshToken ไม่กำหนดหลังจากการยืนยันตัวตน ServiceStack สำเร็จ


  • ServiceStack เวอร์ชัน 5.0
  • ServiceStack Typescript Client เวอร์ชัน 0.0.40

โค้ดต่อไปนี้เรียกใช้บริการไมโครเซอร์วิสการยืนยันตัวตนของฉันและยืนยันตัวผู้ใช้ได้สำเร็จและส่งคืนโทเค็นผู้ถือของพวกเขา:

var request = new Authenticate();
request.provider = "credentials";
request.userName = userName;
request.password = password;
request.useTokenCookie = true;

this.client.post(request)
.then(res => {
    if (res.bearerToken != null) {
    console.log('auth success', res);
    console.log('auth refresh token', res.refreshToken);
    resolve(true);
    }
    resolve(false);
}, msg => {
    console.log('log in failed');
    reject(msg);
})

ปัญหาคือไม่มีโทเค็นรีเฟรชที่ส่งกลับจากไมโครเซอร์วิสการยืนยันตัวตนของฉัน:

การกำหนดค่าของฉันสำหรับไมโครเซอร์วิสการยืนยันตัวตนของฉัน:

Plugins.Add(new AuthFeature(() => new CustomUserSession(),
    new IAuthProvider[] {
        new JwtAuthProvider
        {
            HashAlgorithm = AuthSettings.HashAlgorithm,
            RequireSecureConnection = requireSecureConnection,
            AuthKeyBase64 = AuthSettings.JwtAuthKeyBase64,
            ExpireTokensIn        = TimeSpan.FromHours(_configuration["AuthSettings:ExpireTokensIn"].ToDouble()),
            ExpireRefreshTokensIn = TimeSpan.FromHours(_configuration["AuthSettings:ExpireRefreshTokensIn"].ToDouble()),
            CreatePayloadFilter = (payload,session) => {
                    payload["zipCode"] = ((CustomUserSession)session).ZipCode;
            },
            PopulateSessionFilter = AuthSettings.PopulateSessionFilterImplementation
        },
        new CustomCredentialsAuthProvider((ITsoContext)_serviceProvider.GetService(typeof(ITsoContext))) //HTML Form post of User/Pass
    }));

คำตอบ #1

ถ้าคุณกำลังแทนที่ CredentialsAuthProvider ด้วย Custom AuthProvider ให้แน่ใจว่าคุณได้ตั้งค่า การตรวจสอบสิทธิ์ถูกดำเนินการด้วย:

authService.Request.Items[Keywords.DidAuthenticate] = true;

การสนับสนุนสำหรับ JWT RefreshTokens ยังต้องการ AuthRepository ที่ลงทะเบียนแล้วด้วย

หากคุณกำลังใช้ Custom AuthProvider โดยไม่มี IAuthRepository ฉันเพิ่งเพิ่มการสนับสนุนสำหรับการใช้งาน IUserSessionSource เป็นแหล่งทางเลือกในการเติม Sessions ใน JWT Tokens ใหม่ ซึ่งคุณสามารถใช้งานโดยการลงทะเบียนใน IOC ของคุณหรือให้ Custom AuthProvider ของคุณใช้งาน:

public interface IUserSessionSource
{
    IAuthSession GetUserSession(string userAuthId);
}

การนำไปใช้งานควรส่งกลับ IAuthSession ที่มีข้อมูลเฉพาะเมื่อพวกเขาได้รับอนุญาตให้เข้าสู่ระบบ เช่น หากบัญชีของพวกเขาถูกระงับ ควรยกเว้นข้อผิดพลาดเช่น:

throw HttpError.Forbidden("User is suspended");

การสนับสนุน IUserSessionSource มีให้ตั้งแต่ ServiceStack v5 ซึ่งตอนนี้สามารถใช้งานได้บน MyGet กรุณาตรวจสอบการเปลี่ยนแปลงใน v5 ก่อนการอัปเกรด