Статьи

Разработка SevenDrops — загрузчик фотографий на основе Dropbox для Windows Phone 7 [2/6]

Итак, теперь, когда есть базовый макет пользовательского интерфейса (описан здесь ), я могу начать работать над функциональностью приложения, и первое, с чего я собираюсь начать, это аутентификация пользователя. Dropbox работает таким образом, что пользователь должен войти в систему только один раз и получить токен, который впоследствии связывает его с приложением (если вы уже знаете, о чем я говорю — это OAuth). Полученный токен действителен в течение десяти лет, поэтому вам не нужно будет выполнять вход в систему в ближайшее время.

В этой статье я собираюсь сосредоточиться на токене, чтобы вы могли выполнить его до конца. Когда вы регистрируетесь в приложении Dropbox (это можно сделать здесь ), вы получаете уникальный ключ и секрет.

 

Прямо сейчас секрет не нужен, и будет использоваться только ключ. Этот ключ передается как параметр oauth_consumer_key в URL-адрес аутентификации. URL указан в документации API:


https://api.dropbox.com/<version>/token

Версия в настоящее время установлена ​​на 0, но по мере развития сервиса этот индикатор может измениться. Параметры потребителя передаются на URL в следующем формате:


https://api.dropbox.com/<version>/token?email=USER_EMAIL&

password = USER_PASSWORD & oath_consumer_key = APP_KEY

Обратите внимание, что учетные данные пользователя также передаются на URL-адрес, но вы должны учитывать эту рекомендацию из документации Dropbox API (в отношении метода токена ):

НЕ ХРАНИТЕ ПАРОЛЬ ПОЛЬЗОВАТЕЛЯ! Этот вызов работает так: вы вызываете его один раз с помощью электронного адреса и пароля пользователя, а затем сохраняете токен на потом. Вы НЕ (я повторяю, НЕТ ) вызывать это перед тем, как делать все или при каждом запуске программы. Мы наблюдаем за этим и закроем ваше приложение с небольшим уведомлением, если мы вас поймаем. На самом деле, код Objective-C делает это за вас, поэтому вы не ошибетесь.

В моем случае я не буду хранить пароль — у меня есть пользовательская страница, которая будет получать учетные данные пользователя:

<phone:PhoneApplicationPage 
x:Class="SevenDrops.Credentials"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480"
shell:SystemTray.IsVisible="True">

<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>

<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
<TextBlock Text="credentials" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
</StackPanel>

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<TextBlock Text="Email:" Style="{StaticResource PhoneTextExtraLargeStyle}" Margin="12,123,12,457"></TextBlock>
<TextBox x:Name="EmailField" Margin="0,170,0,387"></TextBox>
<TextBlock Margin="12,248,12,332" Style="{StaticResource PhoneTextExtraLargeStyle}" Text="Password:" />
<PasswordBox x:Name="PasswordField" Margin="0,295,0,262" />
<Button x:Name="LogInButton" Content="Log In" Height="72" Margin="0,378,245,0" VerticalAlignment="Top" />
<Button x:Name="CancelButton" Content="Cancel" Height="72" Margin="245,378,0,0" VerticalAlignment="Top" />
</Grid>
</Grid>
</phone:PhoneApplicationPage>

Это действительно просто, но это все, что нужно.

Теперь, когда пользователь нажимает кнопку «Войти», мне нужно проверить, есть ли какие-нибудь пустые поля (ну, конечно, из двух). Итак, есть простая проверка:

if ((!string.IsNullOrEmpty(EmailField.Text.Trim())) && (!string.IsNullOrEmpty(PasswordField.Password)))
{

}
else
{
MessageBox.Show("Both email and password are required.");
}

На этом этапе этот код ничего не будет делать, но выдает предупреждение, если какие-либо учетные данные пользователя отсутствуют. Давайте создадим веб-запрос HTTP, который получит окончательный токен. Вот модифицированная версия обработчика событий, связанная с кнопкой «Вход»:

private void LogInButton_Click(object sender, RoutedEventArgs e)
{
if ((!string.IsNullOrEmpty(EmailField.Text.Trim())) && (!string.IsNullOrEmpty(PasswordField.Password)))
{
HttpWebRequest request =
(HttpWebRequest)WebRequest.Create("https://api.dropbox.com/0/token?email=" + EmailField.Text + "&password=" +
PasswordField.Password + "&oauth_consumer_key=" + KEY);
var n = Observable.FromAsyncPattern<WebResponse>(request.BeginGetResponse,request.EndGetResponse)();
n.Subscribe(HandleResult);
}
else
{
MessageBox.Show("Both email and password are required.");
}
}

KEY — это строковая константа, представляющая ключ приложения, предоставленный Dropbox, и он является закрытым, поэтому я не могу поделиться им здесь. Как вы также можете видеть, я использую здесь Reactive Extensions — получение и обработка HTTP-запроса заключены в Observable.FromAsyncPattern.

Вы должны добавить следующий оператор using в заголовок класса:

using Microsoft.Phone.Reactive;

Конечно, вы должны сначала добавить ссылку на библиотеку. Также не забудьте про System.Observable.dll.

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

private void HandleResult(WebResponse response)
{
HttpWebResponse _response = (HttpWebResponse)response;
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
string a = reader.ReadToEnd();
Debug.WriteLine(a);
}
}

Теперь, если вы запускаете приложение, учитывая, что у вас уже есть аккаунт Dropbox, когда вы авторизуете его (кстати, вы можете просто использовать NavigationService.Navigate (new Uri («/ Credentials.xaml», UriKind.Relative)); чтобы получить на страницу входа в систему) вы должны увидеть новый токен и секрет, отображаемый в окне вывода:

Нет, ты не увидишь мою. Но, как вы можете видеть, это данные в формате JSON. В следующей статье я углублюсь в OAuth и покажу, как элементы JSON будут десериализованы в необработанные данные, которые могут использоваться приложением.