Dynamics CRM モバイルアプリケーション開発 その 2
みなさん、こんにちは。
前回に引き続き、モバイルアプリケーション開発の紹介を
していきます。シリーズものですので、是非初回から
ご覧ください。
Microsoft Dynamics CRM Online の取得
まだ Dynaimcs CRM Online をお持ちでない場合は、以下の
記事を参考に体験版を取得してください。
https://blogs.msdn.com/b/crmjapan/archive/2014/08/21/dynamics-crm-online.aspx
Microsoft Azure 体験版の取得
任意の Microsoft Dynamics CRM Online のテナントに紐づく
Microsoft Azure サブスクリプションをお持ちでない方は、
以下の手順で体験版を取得してください。
1. ブラウザより Dynamics CRM Online にログインします。
2. 同じブラウザで新しいタブを開き、以下 URL を入力します。
https://manage.windowsazure.com
3. サブスクリプションが無い旨表示されますので、WINDOWS
AZURE にサインアップをクリックします。
4. 体験を申し込みます。クレジットカードの入力が必要ですが
今回の作業では課金は発生しません。
メインページの追加
前回 UI となる XAML ページをすべて撤去したため、今回は
メインページの追加から行っていきます。
1. プロジェクトを右クリック | 追加 | 新しい項目を選択します。
2. 空白のページを選択し、名前を MainPage として追加します。
3. 以下のメッセージが出ますが、今回は不要なファイルです
ので、No をクリックします。
4. 前回コメントアウトした App.xaml.cs 94 行のコメントを
元に戻し、typeof の指定を MainPage に変更します。
rootFrame.Navigate(typeof(MainPage), e.Arguments);
5. ソリューションをリビルドします。これでアプリケーション
起動時に、既定で MainPage が開くようになりました。
ADAL 用コードの追加
今回 Microsoft Dynamics CRM Online に対する認証は ADAL
を利用します。前回 NuGet のパッケージは登録済のため、
ADAL 用のコードを追加してきます。利用するコードは以下
サンプルを参考にしています。
https://github.com/AzureADSamples/NativeClient-WindowsStore
1. MainPage.xaml.cs を開き、クラスメンバとして以下を追加
します。テナント名やアドレスは必要に応じて変更してください。
私の環境は https://crm2013training25.crm5.dynamics.com のため
以下のように設定しました。Client ID は後から追加します。
const string aadInstance = "https://login.windows.net/{0}";
const string tenant = "crm2013training25.onmicrosoft.com";
const string clientId = "<clientid>";
static string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant);
const string crmServerUrl = "https://crm2013training25.crm5.dynamics.com";
const string resourceId = "https://crm2013training25.crm5.dynamics.com";
2. 次に認証情報を管理する AuthenticationContext と、アプリ
ケーションを特定する redirectURL を同じく追加します。
private AuthenticationContext authContext = null;
private Uri redirectURI = null;
名前解決がされていない場合は、必要に応じて using を追加
して下さい。
※ Tips: 名前解決されていないオブジェクトにマウスを合わせて
Ctrl キーと「.」(ドット) を押下すると自動で解決します。同様の
方法で随時名前は解決してください。
3. MainPage コンストラクター内で AuthenticationContext を
インスタンス化します。この際接続先 AzureAD のテナントを
引き渡します。また redirectURI を取得します。
public MainPage()
{
this.InitializeComponent();
// AuthenticationContext のインスタンス化
authContext = new AuthenticationContext(authority);
redirectURI = WebAuthenticationBroker.GetCurrentApplicationCallbackUri();
}
4. 以下のメソッドを MainPage クラスに追加します。このメソッド
では AccessToken 取得を試みて、失敗したらエラーを表示します。
// AccessToken の取得
private async void GetToken()
{
// 認証の実行
AuthenticationResult result = await authContext.AcquireTokenAsync(resourceId, clientId, redirectURI);
if (result.Status != AuthenticationStatus.Success)
{
if (result.Error == "authentication_canceled")
{
// ユーザーがサインインをキャンセルした。
}
else
{
MessageDialog dialog = new MessageDialog(string.Format("失敗");
await dialog.ShowAsync();
}
return;
}
// AccessToken の確認
var accessToken = result.AccessToken;
}
ナビゲーションヘルパーの追加
空白のテンプレートには各種ヘルパーが自動では登録されない
ため、以下の手順でナビゲーションヘルパーを追加します。
1. クラスメンバーに以下を追加します。
private NavigationHelper navigationHelper;
public NavigationHelper NavigationHelper
{
get { return this.navigationHelper; }
}
2. MainPage コンストラクターに以下コードを追加します。
this.navigationHelper = new NavigationHelper(this);
3. 以下メソッドを追加します。
このメソッドはページが読み込まれる際に実行されます。
protected override void OnNavigatedTo(NavigationEventArgs e)
{
navigationHelper.OnNavigatedTo(e);
// ページ読み込み時にトークンを取得
GetToken();
}
アプリケーションの登録
コードの実装は終わったので、次にアプリケーションを登録します。
まずアプリケーション固有の redirectURI を取得します。
1. MainPage.xaml.cs のコンストラクター内にブレークポイントを設置
して、アプリケーションを実行し、redirectURI を確認します。
2. Microsoft Azure ポータルに接続します。
https://manage.windowsazure.com
3. ACTIVE DIRECTORY メニューを画面左側より選択します。既定で
組織が 1 つ作成されていますので、そちらを選択します。
4. アプリケーションタブをクリックして、画面下の追加をクリックします。
5. 選択肢より「組織で開発中のアプリケーションを追加」を選択
します。
6. 任意の名前をつけて、ネイティブクライアントアプリケーション
を選択し、次矢印をクリックします。
7. 上記手順で取得した リダイレクト URI を入力して、完了の
チェックマークをクリックします。
8. 登録完了後の画面で、構成タブをクリックします。
9. クライアント ID をコピーして、MainPage.xaml.cs に定義した
clientId に指定します。
10. 画面下にある「他のアプリケーションに対するアクセス許可」
でこのアプリケーションが実行できる内容を選択できます。
アプリケーションから Dynamics CRM を選択し、アクセス許可で
Access CRM Online as organization users を選択します。
11. 保存ボタンをクリックして保存します。
これですべての準備が整いました。少し長かったですね。
動作確認
折角なので最後に動作確認をします。
1. MainPage.xaml.cs の GetToken メソッド内にブレークポイント
を設定して、アプリケーションを実行します。
2. authContext.AcquireTokenAsync メソッドのところを過ぎると
アプリケーションでサインイン画面が表示されます。
3. 認証したらコードに戻って、AccessToken が取れていることを
確認します。
まとめ
今回は AccessToken を取得するところまでを紹介しました。次回は
本当は Dynamics CRM の Web サービスを利用したいところですが、
ADAL で指定しているパラメーターの意味と、Microsoft Azure が
提供する Consent Framework というものを解説します。これは
Dynamics CRM Online の開発者にとって必須の情報ですので是非
お付き合いください。
- 中村 憲一郎