Клиент SignalR Core Android с аутентификацией JWT, возвращающий NULL - PullRequest
1 голос
/ 24 января 2020

Я создаю android приложение, которое взаимодействует с asp. net core signalR hub, все было хорошо без аутентификации, на самом деле я не могу понять это. Он находится в Web APi, и я использую JWT для аутентификации и отправляю его обратно на устройство android в качестве токена доступа, так как отправить токен на концентратор ?? я нашел в документации этот код:

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/myhub")
.withAccessTokenProvider(Single.defer(() -> {
    // Your logic here.
    return Single.just("An Access Token");
})).build();

но я не мог понять это !! что такое логика c, что я должен делать ?? также это мой класс провайдера

public class MyCustomProvider : IUserIdProvider
{
    public string GetUserId(HubConnectionContext connection)
    {
        //throw new NotImplementedException();
        return connection.User?.FindFirst(ClaimTypes.Email).Value?.ToString();
    }
}

это мой хаб

public class LocationHub : Hub
{
    private readonly UserManager<ApplicationUser> _userManager;

    public ApplicationDbContext _Context { get; }

    public LocationHub(ApplicationDbContext context, UserManager<ApplicationUser> userManager)
    {
        _Context = context;
        _userManager = userManager;
    }

    public async Task ShareLocation(double Latitude , double Longitude)
    {
        Console.WriteLine("New location from: "+Context.UserIdentifier+"::"+ Latitude + "///" + Longitude);
        await Clients.Others.SendAsync("ReceiveNewLocation", Latitude, Longitude);
    }

    public override  Task OnConnectedAsync()
    {
        var user = _Context.Users.Where(u => u.Email == Context.UserIdentifier).FirstOrDefault();
        user.LoginStatus = true;
        _Context.SaveChanges();
        return base.OnConnectedAsync();
    }

Context.UserIdentifier имеет значение Null !! когда я попробую это

PreferencesStore.loadPreferences(this);
    String mToken = PreferencesStore.getToken();
    Log.d("SignalR", mToken);
    hubConnection = HubConnectionBuilder.create("http://myserver/locationhub")
            .withAccessTokenProvider(Single.defer(() -> {

                return Single.just(mToken);
            }))
            .build();

1 Ответ

0 голосов
/ 25 января 2020

и, наконец, нашел решение, я поставлю его здесь на случай, если у кого-нибудь возникнет эта проблема:

PreferencesStore.loadPreferences(this);
    String mToken = PreferencesStore.getToken();
    hubConnection = HubConnectionBuilder.create("http://myserver/locationhub")
            .withHeader("Authorization", mToken)
            .build();

отличается от документации. прямо здесь я использовал .withHeader("Authorization", mToken), но он работает просто отлично.

...