Не удается получить доступ к дочернему значению в JValue в мобильном приложении Azure - PullRequest
0 голосов
/ 02 июля 2018

Недавно я внедрил пользовательскую аутентификацию с помощью мобильного приложения Azure - все серверные части работают нормально, а также работает мое веб-приложение, использующее эту службу мобильных приложений. Я детально протестировал серверную часть с помощью POSTMAN и при разных сценариях, все работает нормально, пока я не попытаюсь LoginAsync на Xamarin.

Когда я передаю электронную почту и пароль в POSTMAN, я получаю следующий ответ в качестве четкого указания на то, что он работает

enter image description here

но когда я отправляю запрос из моего приложения, используя LoginAsync, я получаю следующую ошибку.

Невозможно получить доступ к дочернему значению в Newtonsoft.Json.Linq.JValue

Мой код для отправки запроса довольно прост, как показано ниже

public async Task<bool> Authenticate()
 {
   string username = "todo@gmail.com";
   string password = "todo";
   string message = string.Empty;
   var success = false;
   var credentials = new JObject
      {
       ["email"] = username,
       ["password"] = password
       };
   try
     {              
      MobileServiceUser user = await client.LoginAsync("CustomAuth", credentials);
      if (user != null)
        {
          success = true;
          CreateAndShowDialog("OK", "Auth");                 
        }
      }
      catch (Exception ex)
         {
           CreateAndShowDialog(ex, "Auth Error");                
          }

  return success;
 }

где я называю это следующим образом

private MobileServiceClient client;
client = new MobileServiceClient(applicationURL);
await Authenticate();

Есть идеи, почему я получаю Cannot access child value on Newtonsoft.Json.Linq.JValue ошибку?

Приветствия

РЕДАКТИРОВАТЬ ПОСТ

В качестве обходного пути я временно использую InvokeApiAsync с JObject.FromObject вместо LoginAsync

await client.InvokeApiAsync("/.auth/login/CustomAuth", JObject.FromObject(credentials), HttpMethod.Post, null);

Я до сих пор не уверен, почему LoginAsync не работает - пока я не найду решение, я буду продолжать использовать InvokdeApiAsync в качестве обходного пути

1 Ответ

0 голосов
/ 03 июля 2018

AFAIK, ваша инициализация для credentials правильная. Для ошибки ниже:

Невозможно получить доступ к дочернему значению в Newtonsoft.Json.Linq.JValue

Я проверил ваш результат тестирования через POSTMAN и обнаружил, что вы не вернули userId вашему клиенту. Основные свойства, возвращаемые вашему клиенту, будут выглядеть следующим образом:

{
   "authenticationToken":"***",
   "user":{
      "userId":"***"
   }
}

При использовании MobileServiceClient.LoginAsync клиентский SDK будет внутренне вызывать метод LoginAsync() в MobileServiceAuthentication.cs следующим образом:

JToken authToken = JToken.Parse(response);

// Get the Mobile Services auth token and user data
this.Client.CurrentUser = new MobileServiceUser((string)authToken["user"]["userId"]);

this.Client.CurrentUser.MobileServiceAuthenticationToken = (string)authToken[LoginAsyncAuthenticationTokenKey];

Вы обнаружите, что он попытается извлечь свойство userId в user, чтобы создать экземпляр MobileServiceUser и присвоить MobileServiceClient.CurrentUser.

...