Office365の情報を取得するデスクトップアプリケーションの開発

AzureADにサインインし、Office365の情報を取得するために必要な
リフレッシュトークンとアクセストークンを取得する 簡単なアプリケーションの作り方を記載します。

用意する物

・VisualStudio 2013
・Office365 (SharePoint、Azure AD)

■リフレッシュトークン?アクセストークン?

2種類トークンという言葉が出ておりますが、
リフレッシュトークン=ログインしたという情報
アクセストークン=使用可能なリソースの情報(権限)
という形で覚えると分かりやすいと思います。

■AzureADの設定

Office365の情報を使用する際は、AzureADにOffice365のアプリケーションを使えるようにする設定が必要なので、
Office365の管理者またはAzureポータルサイトからAzureADに入ります。
設定できない場合はOffice365の管理権限を持つ方に相談してください。

1.Azure内のActiveDirectoryに入り、ネイティブアプリケーションを作成
2.作成したアプリの構成を確認し、「リダイレクトURI」と「他のアプリケーションに対するアクセス許可」を変更する
※初期ではWindows Azure Active Directoryだけ入っているので、アプリケーションの追加を押して追加する
3.設定が完了したら保存する

azureAD

赤丸の部分が追加した情報です

■リフレッシュトークン、アクセストークンを取得する方法

https://login.microsoftonline.com/common/oauth2/tokenにアクセスし
grant_typeにpasswordか、authorization_codeを指定
HTTPヘッダのContent-Type にapplication/x-www-form-urlencodedを指定

○grant_type=passwordの場合
パラメータ(下記はPOSTメソッドで送信)
grant_type=password
client_id = AzureクライアントID
user = ※ユーザーID
password = パスワード
resource = リソース(SharePoint)のURL
※ユーザIDはOffice365の管理権限を持つアカウントで確認してます。
grant_type=passwordのケースに関してはリクエスト結果からアクセストークンが取得できます。

○grant_type=authorization_codeの場合
URLパラメータ(下記はPOSTメソッドで送信)
grant_type=authorization_code
code = リフレッシュトークン
client_id = Azure ADのクライアントID
redirect_uri = Azure ADで指定したリダイレクト先
resource = リソース(SharePoint)のURL

こちらのケースの場合はリフレッシュトークンを別な方法で取得しないといけないので、あらかじめ次の処理を行います。

https://login.microsoftonline.com/common/oauth2/authorize?response_type=code&client_id=(Azure ADのクライアントID)&redirect_uri=(Azure ADで指定したリダイレクト先)
からサインイン画面を表示し、サインイン後にリダイレクトした先のURL内に含まれるcodeパラメータを保持する
※code情報がリフレッシュトークン

これでアクセストークンの取得は完了です。
アクセストークンの有効期間(1時間程度)が切れたときは、リフレッシュトークンを用いて再度取得しましょう。

VisualStudio2013向けサンプル用プロジェクトを作りましたので、よろしければご確認ください。

野本 育男

SharePoint AccessToken/RefreshToken

この記事は書きかけです。

いくつかSharePoint Add-insを作成していて、気が付いた点をメモします。

SharePoint AccessToken/RefreshToken いくつかポイントがあるのですが、わかる範囲で記載しておきます。

Access Tokenの種類

参考

Inside SharePoint 2013 OAuth Context Tokens

ACS 00000001-0000-0000-c000-000000000000
Exchange 00000002-0000-0ff1-ce00-000000000000
SharePoint 00000003-0000-0ff1-ce00-000000000000
Lync 00000004-0000-0ff1-ce00-000000000000
Workflow 00000005-0000-0000-c000-000000000000

 

AccessTokenの有効期限は1時間

実際にテストをする約1時間(2015/08/10時点)でした。

AccessTokenが期限切れになりましたら、RefreshToken(おそらく有効期限が長いはず)でAccessTokenを再取得します。

 

参考

松崎さんBlog

Native Application (Mobile App) で Azure Active Directory に Login するプログラミング (OAuth 紹介)

また、Access Token の有効期限は、約 1 時間です。Access Token が期限切れになった場合にも、上記の通り Refresh Token を使って Access Token を取得しなおします。
補足 : refresh token は最大 14 日使用可能で、再取得することで、さらに 14 日間使用できます。(最大で 90 日まで使用できます。)

 

Micrsosft Sample
Office 365 API Tools を使用したプログラミング

Access Token と Refresh Token
アプリケーションが Exchange のサービスに接続する際、内部で Access Token と呼ばれる文字列が使用されています。この Access Token を使用して、アプリケーションは、その他の処理も継続して実行できます。
また、Access Token には有効期限があり、1 時間で使用できなくなりますが、この場合は Refresh Token と呼ばれるものを使用して、再度、Access Token を取り直します。
上記の AcquireTokenSilentAsync では、こうした面倒なトークンの扱いも自動化してくれています。
また、Access Token や Refresh Token をキャッシュしてアプリケーション終了後もこの値を保持することで、同じアカウント情報で継続して利用することが可能です。(上記のサンプルでは、このキャッシュの処理はおこなっていません。)

 

野呂清二

Making SharePoint Add-ins + Azure Session

こんにちは野呂です。

SharePoint Add-insのSession(セッション)管理でクラスの一部でシリアル化がうまく出来ない問題がありますので、解決策を一番下にリンクしました。

解説

SharePoint Add-ins でアプリを作成してリリースすると、そのままテンプレートを使用すると下記のエラーがでます。

セッション状態をシリアル化できません。’StateServer’ および ‘SQLServer’ モードでは、ASP.NET はセッション状態オブジェクトをシリアル化します。その結果、シリアル化できないオブジェクトまたは MarshalByRef オブジェクトは許可されません。’Custom’ モードのカスタム セッション状態ストアによって類似したシリアル化が実行される場合、同一の制限が適用されます

 

Web.config のSession は、なにも記述されていないので、”InProc” になっています。

なので、”Azure Redis Cache” 、”SQL Server”, “ASP.NET Universal Providers and Session State”等を使用してセッションを保持する仕組みを設定する必要があります。

しかしながら、SharePoint のToken/RefreshToken 管理クラスである。

いくつかのAccessToken管理クラス(SharePointContext他)は標準ではSeriazaibleではありませんので、InProc以外のセッションのSQL Azure, Redis Cache、等はクラスをシリアル化しなければならないです。

しかしながら、いくつかのクラスはライブラリ(dll)の中に定義してありシリアル化の定義ができないので、プログラムを別途作る必要があります。

MSDNにサンプルがありました。私も、実際に Universal Providers でテストしてOKでした。

参考までにどうぞ

Making SharePoint Apps Scale with Azure Redis Cache

野呂清二

デモアプリ「Office365 Unified API」+「AzureWebサイト」+「EXCEL Format」にてGroup/User Matrixを作成しました。

概要

「ユーザがどこの配布グループ・セキュリティグループに属しているの?」とよく聞かれます。

実際には、システム管理者が、PowerShell等を使用してマニュアルでエクセルで作成している管理者も多いと思います。

Office365 Unified API(Beta)を使用して、Group/UserをOffice365から取得して、Excelでマトリックスにしてみました。

とても扱いやすい関数ですので、みなさんも作ってみましょう!!

デモサイトは以下です。

注意)ユーザ100件以上のユーザは時間がかかるかもしれません。

https://o365info.azurewebsites.net/

Office365Info010

 

Download Excel ボタンをクリックします。

以下のようにExcelフォーマットでダウンロードされます。

別のシートにグループ一覧、ユーザ一覧も出力しています。

Office365Info020

 

 

プログラムについて以下のサイトが参考になります。

Office 365 unified api を使いこなそう

Office 365 unified API (PREVIEW)

Examples of Office 365 unified API calls (preview)

とりあえず、動かしてみたいなら。

https://apisandbox.msdn.microsoft.com/

 

プログラムの詳細は時間のあるときに書きます。

内部ではUnified APIを使用して、AccessToken一つで Tenant情報/Group一覧/Groupメンバー/User一覧/Userプロフィールを取得しています。

Office365 Unified API便利ですので使ってみてください。

Office365+SharePoint用アプリ+ASP.NET MVC5 で素早く簡単にかつ美しく作るアプリ by Visual Studio 2013

Office365+SharePoint用アプリ(Apps for SharePoint)+ASP.NET MVC5で作成すると、

標準でTwetterbootstrap(TwitterのきれいなCSS)の組み込み済みなため

簡単に、美しく、 また外部データベース(SQL Azure他なんでも)との連携も簡単に作れます。

また、MVC5は完全にクリーンなHTMLを出力するため、JavaScriptも書きやすく、外部のWebAPI(twitter,その他)との連携も簡単にできるでしょう!!

ここがいいです!!

Office365+SharePoint+Visual Studio 2013の相性抜群なのを確認して感動した。
難しかったクレームベース認証のところも、考えなくてもできた!!!

次回はこんな感じでやってみます。

Windows Azure(Webサイト) +SQL Azure(データベース) + Office365(SharePoint, Exchange, Lync) をベースに、
アプリで[SharePoint]と[SQL Azure]のデータを取得/設定できるアプリを作ってみたいともいます。

最終イメージ

自分のOffice365か Office365からアプリを起動しますと!

appsforsharepoint_1st_0010

SharePointの画面からASP.NET MVC5(SharePoint用アプリ)に切り替わる。

認証はそのままOffice365が継続されています。

以下はOffice365のユーザ名が取得してASP.NET MVC5(SharePoint用アプリ)に表示されています。

appsforsharepoint_1st_0020

準備

SharePointの用意、わたしは、当社のOffice365を使用しました。

もちろん、Office365 DeveloperでもOKですし、オンプレミスSharePointでもよいです。

とりあえず、デバック用に開発者サイトは準備しておいてください。

SharePoint管理センターからサイトの新規作成を行う

appsforsharepoint_1st_0030

開発者向けサイト を選んでください。

appsforsharepoint_1st_0040

必要であれば、実際にアプリを配置する。アプリカタログも作っておきます。
作成後こんな感じ

appsforsharepoint_1st_0050

開発

Visaul Studio2013/ファイル/新規/プロジェクト

Office/SharePoint/アプリ/SharePoint2013用アプリ

appsforsharepoint_1st_0060

準備でで作成した開発者向けサイトのURLを 「アプリのデバックに使用する SharePointサイトに指定します。」

SharePoint用アプリをホストする方法は、今回は、 「自動ホスト型」を選びます。

ASP.NET MVC5 は「プロバイダー向けホスト型」「自動ホスト型」のみ可能です。

自動ホストの場合は裏で自動的にWindows Azureに無料でホストしてくれます。
※デバック時はVisual StudioのビルトインASP.NETローカルサーバでホストされます。

appsforsharepoint_1st_0080

「ASP.NET MVC Webアプリケーション」を選ぶ

appsforsharepoint_1st_0090

Visual Studio 2013 のプロジェクトが作成されます。

SharePoint用アプリのマニュフェストファイル(XML)とASP.NET MVC5のサイトが作成されます。

appsforsharepoint_1st_0100

MVC5 のコントローラのところに、SharePoint2013から名前データを

クライアント オブジェクト モデルにて取得するプログラムが書かれています。

クライアント オブジェクト モデル(Client Object Model)は以下を参照

appsforsharepoint_1st_0110

Office365からユーザ名を取得してくるサンプルプログラム一部抜粋

using Microsoft.SharePoint.Client;

public class HomeController : Controller

{

[SharePointContextFilter]

public ActionResult Index()

{

User spUser = null;

var spContext = SharePointContextProvider.Current.GetSharePointContext(HttpContext);

using (var clientContext = spContext.CreateUserClientContextForSPHost())

{

if (clientContext != null)

{

spUser = clientContext.Web.CurrentUser;

clientContext.Load(spUser, user => user.Title);

clientContext.ExecuteQuery();

ViewBag.UserName = spUser.Title;

}

}

return View();

}

}

Office用アプリ+ASP.NET MVC5 で外部のアカウント連携(twitter, facebook, google, Microsoft Account, Office365等)

概要

Office用アプリ+ASP.NET MVC5 で外部のアカウント連携(Facebook等)をしてみました。

結果、いろいろありましたがうまくいきました!!

詳細

ASP.NET MVC5の最新のアカウント管理では簡単にFacebook, Twitter, Google, Microsoft Account, Office365 と連携できます。

普通のサイトでは以下のようにASP.NET MVC5 では以下のように認証する際にFacebook ならFacebook認証サイトにリダイレクト(redirect)します。

  • ASP.NET MVC5標準のFacebook連携ボタンを押す
    A4O_Autholization010

    Facebookの認証サイトにリダイレクトされます。
    ※URLが https://www.facebook.com/login.php?
    A4O_Autholization020

普通のサイトならリダイレクトされてもOKなのです。

しかしOffice用アプリでは、マニュフェストファイルにかいたURLのドメイン以外はIE Windowポップアップします(POPUP)!!

IE Windowポップアップしてしまうので認証がうまく連携しないのです!!

.

A4O_Autholization030

以下はOffice用アプリのマニュフェストファイルです。

  • Office用アプリの初期URL例:https://Test001.com/A4OTest001/ ←このドメイン以外ポップアップする

A4O_Autholization040

 

しばらくVisual Studio2013のOffice用アプリの設定をみていると以下のナイスな項目をみつけた!!

A4O_Autholization060 

「アプリで使用されるページのドメインを指定します。アプリで開かれたリモートページは、アプリと同じウインドウ内に表示されます。」

A4O_Autholization070

さっそく、アプリドメインに以下を追加してみて実行してみみる。

https://www.facebook.com

Office用アプリのマニュフェストはこんな感じです。

<?xml version=”1.0″ encoding=”UTF-8″?>
<!–Created:cb85b80c-f585-40ff-8bfc-12ff4d0e34a9–>
<OfficeApp xmlns=”http://schemas.microsoft.com/office/appforoffice/1.0″ xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xsi:type=”TaskPaneApp”>
<Id>72b351ce-05dc-4569-86e4-a8d429ed90a4</Id>
<Version>1.0.0.0</Version>
<ProviderName>snoro</ProviderName>
<DefaultLocale>en-US</DefaultLocale>
<DisplayName DefaultValue=”Appli-AWeb_MVC_Main” />
<Description DefaultValue=”Appli-AWeb_MVC_Main Description”/>
<AppDomains>
<AppDomain>https://www.facebook.com</AppDomain>
</AppDomains>
<Capabilities>
<Capability Name=”Workbook” />
<Capability Name=”Presentation” />
<Capability Name=”Project” />
<Capability Name=”Document” />
</Capabilities>
<DefaultSettings>
<SourceLocation DefaultValue=”https://Test001/A4OTest001/” />
</DefaultSettings>
<Permissions>ReadWriteDocument</Permissions>
</OfficeApp>

https://www.facebook.com

ReadWriteDocument

実行した結果うまく外部のアカウント(Facebook)と認証できました!!

A4O_Autholization060

Office用アプリ(Apps for Office)にクールなデザイン(Twitterbootstrap)を適用し, Facebook, Google等とログイン連携してみた。

概要

実際の製品としてアプリを作るには、いろんな細かいところを作らなければならないので、アプリを作成し検証してみました。

今回作成したサンプルは、後でGithub/CodeprexにUPする予定です。

詳細

ちなみに、今回はVisual Studio 2013 RC1 を使い開発しました。

なぜならば! 開発(プロジェクトテンプレート・デバック等)がかなり簡単だからだ!!

実際、わたしはこのコードを今日1日で書き上げることができた!!!

だから、頑張れば誰でも出来るんです!!!(言い過ぎね!)

わからなければ、わたしが、勉強会でやりますので来てくださいね、たぶん。

環境

  1. Microsoft Office 2013
  2. twitterBootstrap
  3. Visual Studio2013 RC1 with MVC5
  4. Windows Azure, SQL Azure
  5. Login連携(Twitter, Facebook, Microsoft ID, Google)

イメージ

Office用アプリ(Apps for Office)の個別機能画面(見積、不動産管理、等の個別の機能)

MVC5_OFFICEAPPS_0010

WebSiteの共通画面(認証、権限、顧客、等のマスター)

※Office用アプリと同じWebサーバだかASP.NET MVC5の機能により、Layout テンプレートを変更しているで、メニュー、レイアウトとか簡単に入れ替え可能

MVC5_OFFICEAPPS_0020

Visual Studio 2013 RC1 のプロジェクト及び、データベースの構成

※Officeアプリ用のテンプレートを ASP.NET MVC5で作ります。

MVC5_OFFICEAPPS_0030

まずは機能要件を整理してみよう。

  1. Tablet 等のモバイルにも対応するため、クッキーレス(cookieless)であること
    iPhone/iPad/Androidでも問題なく動作
  2. 様々なアカウントと連携したログイン機能を有すること(独自認証、Facebook, Google, Twitter, Microsoft ID)
  3. 整理されたメニューが必要
  4. Office用アプリの個別機能画面(見積、不動産管理、等の個別の機能)
  5. WebSiteの共通画面(認証、権限、顧客、等のマスター)

そして非機能要件も整理してみよう。

  1. デザインがかっこいい!(twitterbootstrap)
  2. クラウドで動く(Windows Azure, Azure Web Site)
    とりあえず、簡単にWebサーバをスケールアウト(増設)できるように、にセッションなしで開発しておこう!!

細かいのは順次ブログにかきますが。ログインのイメージを掲載しておきます。

ログイン-Office用アプリの個別機能画面(見積、不動産管理、等の個別の機能)

MVC5_OFFICEAPPS_0040

ログイン-WebSiteの共通画面(認証、権限、顧客、等のマスター)
※Office用アプリと同じWebサーバだかASP.NET MVC5の機能により、Layout テンプレートを変更しているで、メニュー、レイアウトとか簡単に入れ替え可能

MVC5_OFFICEAPPS_0050

次回は細かいプログラム解説やるつもりです!!