私は、Dropbox 統合のために Dropnet を利用する 2 つの Windows Phone アプリを持っています。1 つは 7.1 を対象とする Visual Studio Express 2012 で開発され、もう 1 つは 8.0 を対象とする Visual Studio 2013 で開発されました。
どちらも NuGet 経由で Dropnet 1.9.6 と RestSharp 104.4.0 を使用しています。
7.1 プロジェクトは、次の静的クラスを使用して、DropNet 認証 (およびファイル操作ですが、わかりやすくするために除外しています) と対話します。
public static class DropboxStorage
{
const string UserToken = "UserToken";
const string UserSecret = "UserSecret";
private static DropNetClient _Dropbox;
public static DropNetClient Dropbox
{
get
{
if (_Dropbox == null)
{
_Dropbox = new DropNetClient(AppKey, AppSecret);
if (IsAuthenticated)
{
_Dropbox.UserLogin = new UserLogin
{
Token = (string)IsolatedStorageSettings.ApplicationSettings[UserToken],
Secret = (string)IsolatedStorageSettings.ApplicationSettings[UserSecret]
};
}
_Dropbox.UseSandbox = true;
}
return _Dropbox;
}
}
public static bool IsAuthenticated
{
get
{
return IsolatedStorageSettings.ApplicationSettings.Contains(UserToken) &&
IsolatedStorageSettings.ApplicationSettings.Contains(UserSecret);
}
}
public static void StartAuthentication(Action<Uri> success, Action<Exception> failure)
{
Dropbox.GetTokenAsync(userLogin =>
{
var url = Dropbox.BuildAuthorizeUrl(userLogin);
if (success != null) success(new Uri(url, UriKind.RelativeOrAbsolute));
}, error =>
{
if (failure != null) failure(error);
});
}
public static void CheckAuthentication(Uri uri, Action success, Action<Exception> failure)
{
if (uri.LocalPath == "/1/oauth/authorize_submit")
{
Dropbox.GetAccessTokenAsync((accessToken) =>
{
IsolatedStorageSettings.ApplicationSettings[UserToken] = accessToken.Token;
IsolatedStorageSettings.ApplicationSettings[UserSecret] = accessToken.Secret;
IsolatedStorageSettings.ApplicationSettings.Save();
if (success != null) success();
},
(error) =>
{
if (failure != null) failure(error);
});
}
}
これは、WebBrowser コントロールを含むページを介してアクセスされます。
XAML
<phone:WebBrowser x:Name="Browser"
IsScriptEnabled="True"
Navigated="Browser_Navigated"/>
C#
public partial class DropboxPage : PhoneApplicationPage
{
public DropboxPage()
{
InitializeComponent();
DropboxStorage.StartAuthentication(
uri => Browser.Navigate(uri),
ex => ShowException(ex));
}
public void Browser_Navigated(object sender, NavigationEventArgs e)
{
Debug.WriteLine(e.Uri.OriginalString);
DropboxStorage.CheckAuthentication(
e.Uri,
() => NavigationService.GoBack(),
ex => ShowException(ex));
}
private void ShowException(Exception e)
{
MessageBox.Show(e.Message);
NavigationService.GoBack();
}
}
Dropbox の認証 Web ページが表示されます
- ログイン
- アプリへのアクセスを許可する
- 成功、アプリ接続
コードは、Dropbox の URL に が含まれている場合に認証が成功したと判断します/1/oauth/authorize_submit
。
これはすべて完全に機能しますが、8.0 プロジェクトの動作は少し異なります。
BuildAuthorizeUrl
最初の違いは、呼び出しによって返される URLです。
- 7.1
https://www.dropbox.com/1/oauth/authorize?oauth_token=<token>
- 8.0
https://api.dropbox.com/1/oauth/authorize?oauth_token=<token>
2 つ目の違いは、アプリが接続されるとDropbox の URL が から/authorize?oauth_token=
に変更されないため、呼び出されず、ユーザー トークンとユーザー シークレットが保存されないことです。/authorize_submit
GetAccessTokenAsync
これまでの私の調査では、これを修正するための理想的ではないいくつかの方法が示唆されています
- 呼び出しの周りから URL 検証を削除し
GetAccessTokenAsync
、結果の DropboxExceptions を食べる - 最初の呼び出しにコールバック URL を追加します
BuildAuthorizeUrl
。
私は現在 1. を実行していますが、これは長期的な解決策ではありません。コールバック URL の使用は、モバイル アプリにとって複雑すぎるように思われるため、避けたいと思います。
私が求めているのは、8.0 プロジェクトを 7.1 プロジェクトと同じように動作させる方法です。Dropnet のソース コードを確認したところ、ベース URL としてhttps://api.dropbox.comが含まれているため、そもそも 7.1 コードがどのように機能しているかについてはさらに明確ではありません。