参考ページ https://docs.microsoft.com/ja-jp/graph/tutorials/xamarin
Microsoft Graph 用のアプリの登録
アプリの登録
- 「Azure Active Directory 管理センター」を開く
- サイドメニューの「Azure Active Directory」をクリック
- 「既定のディレクトリ」のサイドメニュー「アプリの登録」をクリック
- 「新規登録」をクリック
- 名前を付ける
- 「サポートされているアカウントの種類」で以下をチェック
任意の組織ディレクトリ内のアカウント (任意の Azure AD ディレクトリ – マルチテナント) と個人の Microsoft アカウント (Skype、Xbox など) - 登録をクリック
リダイレクト URI を追加
- 「リダイレクト URI を追加する」→「+プラットフォームを追加」
- 「モバイル アプリケーションとデスクトップ アプリケーション」
- 「 リダイレクト URI 」の「 msal{Your Apprication Client ID}://auth (MSAL のみ) 」をチェック
アプリケーション (クライアント) ID の取得
- 登録したアプリの「アプリケーション (クライアント) ID」をコピーする
Microsoft Graphの認証(GraphClientを使用)
- 「モバイル アプリ(Xamarin.Forms)」プロジェクトを作成する
NuGetで以下のパッケージをインストールする
Microsoft.Identity.Client
Microsoft.Graph
- フィールドの作成(例:MainPage)
private GraphServiceClient graphClient;
// UIParent used by Android version of the app
public static object AuthUIParent = null;
GraphClientの取得
ApplicationIdの部分にコピーした「アプリケーション (クライアント) ID」を入力する
var builder = PublicClientApplicationBuilder.Create(ApplicationId);
IPublicClientApplication PCA = builder.Build();
string[] Scopes = new string[] {"Files.ReadWrite" };
try
{
var accounts = await PCA.GetAccountsAsync();
var silentAuthResult = await PCA
.AcquireTokenSilent(Scopes, accounts.FirstOrDefault())
.ExecuteAsync();
}
catch (MsalUiRequiredException msalEx)
{
var interactiveRequest = PCA.AcquireTokenInteractive(Scopes);
if (AuthUIParent != null)
{
interactiveRequest = interactiveRequest
.WithParentActivityOrWindow(AuthUIParent);
}
var interactiveAuthResult = await interactiveRequest.ExecuteAsync();
}
catch (Exception ex)
{
//
}
var currentAccounts = await PCA.GetAccountsAsync();
graphClient = new GraphServiceClient(new DelegateAuthenticationProvider(
async (requestMessage) =>
{
var result = await PCA.AcquireTokenSilent(Scopes, currentAccounts.FirstOrDefault())
.ExecuteAsync();
requestMessage.Headers.Authorization =
new AuthenticationHeaderValue("Bearer", result.AccessToken);
}));
Androidアプリの調整
AndroidManifest.xmlの修正
- ソリューションエクスプローラーで「アンドロイドプロジェクト」の「Properties」にある「AndroidManifest.xml」を開く
- <application>ノードの子要素として以下のコードを追加する
YOUR_APP_ID_HEREの部分を「アプリケーション (クライアント) ID」に書き換える
<activity android:name="microsoft.identity.client.BrowserTabActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="msalYOUR_APP_ID_HERE" android:host="auth" />
</intent-filter>
</activity>
- 「Android」プロジェクトの「MainActivity.cs」を開き、次のコードを追加する
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
AuthenticationContinuationHelper
.SetAuthenticationContinuationEventArgs(requestCode, resultCode, data);
}
- 「Android」プロジェクト「MainActivity.cs」のOnCreateの末尾に次のコードを追加する
(LoadApplication(new App());の後)
※ MainPageにAuthUIParent フィールドを作成した場合
MainPage.AuthUIParent = this;
OneDrive内のテキストファイルを取得する
string filePath = "/Documents/MyData/test.txt";
var stream = await GraphClient
.Me
.Drive
.Root
.ItemWithPath(filePath)
.Content
.Request()
.GetAsync();
string value = "";
using (var reader = new StreamReader(stream))
{
value = reader.ReadToEnd();
}