Где хранить токены в приложении xamarin.form

У меня есть класс ниже, который будет использоваться в мобильном приложении xamarin.forms для извлечения токена, сгенерированного OAuth (webapi). Как только это сгенерировано, мне нужно сохранить его в месте, где я могу снова получить к нему доступ, а не генерировать его все время. Где лучше всего хранить это в Pcl? Я также хочу иметь возможность удалить это после выхода пользователя из системы.

        class LoginService
        {
            public async Task Login(string username, string password)
            {
                HttpWebRequest request = new HttpWebRequest(new Uri(String.Format("{0}Token", Constants.BaseAddress)));
                request.Method = "POST";

                string postString = String.Format("username={0}&password={1}&grant_type=password", 
                HttpUtility.HtmlEncode(username), HttpUtility.HtmlEncode(password));
                byte[] bytes = Encoding.UTF8.GetBytes(postString);
                using (Stream requestStream = await request.GetRequestStreamAsync())
                {
                    requestStream.Write(bytes, 0, bytes.Length);
                }

                try
                {
                    HttpWebResponse httpResponse =  (HttpWebResponse)(await request.GetResponseAsync());
                    string json;
                    using (Stream responseStream = httpResponse.GetResponseStream())
                    {
                        json = new StreamReader(responseStream).ReadToEnd();
                    }
                    TokenResponseModel tokenResponse = JsonConvert.DeserializeObject(json);
                    return tokenResponse.AccessToken;
                }
                catch (Exception ex)
                {
                    throw new SecurityException("Bad credentials", ex);
                }
            }
        }

person Baba    schedule 01.09.2017    source источник


Ответы (3)


Forms имеет встроенный словарь Properties, в котором вы можете хранить небольшие биты постоянных данных.

Application.Current.Properties ["token"] = myToken;
person Jason    schedule 01.09.2017
comment
Так будет ли это применяться в Pcl? Что произойдет, если пользователь закроет приложение? Не потеряется ли ценность? - person Baba; 01.09.2017
comment
Да, вы используете его в общем проекте. Он сохраняется автоматически - я предлагаю вам прочитать документы, на которые я ссылаюсь. - person Jason; 01.09.2017
comment
@ Джейсон, документы говорят только о том, что они сохраняются на устройстве. У вас есть идеи, где она сохранилась? IE: Это просто какой-то незашифрованный плоский файл где-то? Безопасно ли он сохраняет их в хранилище ключей/цепочке ключей? Я немного сомневаюсь в безопасности хранения безопасных токенов с этим. - person Thomas F.; 13.03.2018
comment
он хранится в вашей песочнице, которая зашифрована, если устройство не взломано, тогда это не мужская земля - person Nick Turner; 07.12.2018

Токены, являющиеся конфиденциальной информацией, я бы рекомендовал хранить их безопасным образом. Безопасное хранилище доступно через службы Keychain в iOS и класс KeyStore в Android. У Xamarin есть очень хорошая статья о том, как сделать это с помощью Xamarin.Auth.

Другие доступные варианты:

  1. BlobCache.Secure в Akavache
  2. SecureStorage
  3. Безопасное хранилище в XLabs
person Sharada Gururaj    schedule 01.09.2017

Просто обновление для тех, кто ищет, так как с момента создания этого поста все изменилось. Не рекомендуется больше использовать следующее:

Application.Current.Properties

Для безопасного хранения таких вещей, как токены доступа и т. д., вы можете использовать статический класс Xamarin.Essentials SecureStorage.

Просто добавьте пакет nuget Xamarin.Essentials, если у вас его еще нет, и используйте его следующим образом:

using Xamarin.Essentials;
.
.
.

await SecureStorage.SetAsync("someKey", "someValue");

var myValue = await SecureStorage.GetAsync("someKey");

у вас также есть возможность

SecureStorage.Remove("someKey");
//or 
SecureStorage.RemoveAll();
person Craig    schedule 23.06.2020