<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>株式会社カジトリ 技術ブログ</title>
	<atom:link href="https://develop.kajitori.co.jp/feed" rel="self" type="application/rss+xml" />
	<link>https://develop.kajitori.co.jp</link>
	<description>Officeアドイン、Laravel、Exmentなどの技術記事を記載します。</description>
	<lastBuildDate>Wed, 31 Aug 2022 09:14:14 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://develop.kajitori.co.jp/wp-content/uploads/2021/01/cropped-logo1-32x32.png</url>
	<title>株式会社カジトリ 技術ブログ</title>
	<link>https://develop.kajitori.co.jp</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>ローカルのOfficeアドインを、Office Onlineで実行・デバッグする</title>
		<link>https://develop.kajitori.co.jp/archives/155</link>
					<comments>https://develop.kajitori.co.jp/archives/155#respond</comments>
		
		<dc:creator><![CDATA[hsatou]]></dc:creator>
		<pubDate>Fri, 29 Jan 2021 08:49:08 +0000</pubDate>
				<category><![CDATA[Officeアドイン]]></category>
		<category><![CDATA[OfficeOnline]]></category>
		<category><![CDATA[VSCode]]></category>
		<guid isPermaLink="false">https://develop.kajitori.co.jp/?p=155</guid>

					<description><![CDATA[概要 Officeアドインを、Office Onlineで実行するための手順です。 「Office Online」でOfficeアドインを実行するためには、アプリ本体となるhtmlファイル・各種プログラムをサーバーにアッ...]]></description>
										<content:encoded><![CDATA[<h1>概要</h1>
<p>Officeアドインを、Office Onlineで実行するための手順です。</p>
<p>「Office Online」でOfficeアドインを実行するためには、アプリ本体となるhtmlファイル・各種プログラムをサーバーにアップロードしなければいけない・・・と考えがちですが、実はそんなことはなく、localhostにアプリを配置したまま、アプリを実行し、デバッグ・検証することができます。<br />
以下、その手順を記載します。</p>
<h1>前提条件</h1>
<h2>執筆時環境・バージョン</h2>
<ul>
<li>Windows10</li>
<li>Microsoft Office (Microsoft365版) ビルド13530.20376</li>
<li>Edge  88.0.705.53(Chromeでも可)</li>
<li>VSCode 1.52.1</li>
<li>Live Server v5.6.1</li>
</ul>
<h2>前提</h2>
<ul>
<li>すでにOfficeアドイン(クライアント版)を、ローカル環境で動作するための手順が整っていること</li>
</ul>
<h2>実行環境</h2>
<ul>
<li>ローカル環境URL：<a href="https://127.0.0.1:5500">https://127.0.0.1:5500</a>  （Live Server）</li>
</ul>
<h2>必要ソフトウェア</h2>
<ul>
<li><a href="https://slproweb.com/products/Win32OpenSSL.html">OpenSSL</a> ※自己証明書を作るために必要です。証明書がすでにあったり、別の方法で証明書が作成可能な場合は、不要になります。</li>
</ul>
<h1>手順</h1>
<h2>自己証明書作成</h2>
<p>Office Onlineでは、https通信で実行する必要があるようです。<br />
そのため、証明書を作成します。すでに証明書がある場合は不要です。</p>
<ul>
<li>証明書を配置するフォルダで、以下のコマンドを実行します。<br />
※Windows用です。OpenSSLが&quot;C:\Program Files\OpenSSL-Win64&quot;にリリースされている前提です。その他諸々は、自己責任でお願いします。</li>
</ul>
<pre><code>&quot;C:\Program Files\OpenSSL-Win64\bin\openssl.exe&quot; req -x509 -newkey rsa:4096 -sha256 -nodes -keyout vscode_live_server.key.pem -out vscode_live_server.cert.pem  -subj &quot;/CN=example.com&quot; -days 3650</code></pre>
<ul>
<li>これで、コマンドを実行したフォルダに、証明書&quot;vscode_live_server.key.pem&quot;, &quot;vscode_live_server.cert.pem&quot;の2つが作成されます。</li>
</ul>
<h1>VSCode設定</h1>
<ul>
<li>
<p>VSCodeを開き、アプリ本体(htmlファイルなど)のあるフォルダを開きます。</p>
</li>
<li>
<p>Live Serverをhttpsで開くための設定を行います。<br />
VSCodeのメニューより、「ファイル」→「ユーザー設定」→「設定」を選択します。</p>
</li>
</ul>
<a href="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/office-online1.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/office-online1-284x300.png" alt="" /></a>
<ul>
<li>「ワークスペース」タブの、「拡張機能」→「Live Server Setting」を選択します。</li>
</ul>
<a href="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/office-online2.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/office-online2-256x300.png" alt="" /></a>
<ul>
<li>Settingsの「Https」項目を探し、値を変更します。
<ul>
<li>enable : true</li>
<li>cert : 作成した証明書のcertファイルのフルパス</li>
<li>key : 作成した証明書のkeyファイルのフルパス</li>
<li>passphase : 空欄</li>
</ul>
</li>
</ul>
<a href="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/office-online3.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/office-online3-300x126.png" alt="" /></a>
<ul>
<li>右下の「Go Live」ボタンをクリックします。 </li>
</ul>
<a href="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/officeaddin-debug8.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/officeaddin-debug8-300x195.png" alt="" /></a>
<ul>
<li>ブラウザで、証明書の確認メッセージが表示されますので、一旦承認し、アクセスを許可します。（この過程がないと、アプリが起動しませんでした）</li>
</ul>
<a href="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/office-online4.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/office-online4-300x205.png" alt="" /></a>
<h2>マニフェストファイル修正</h2>
<ul>
<li>マニフェストファイルのURLが、httpになっている場合、httpsに修正してください。デバッグとして必要な最低限は、以下の2箇所です。</li>
</ul>
<p>①DefaultSettings-&gt;SourceLocation</p>
<a href="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/office-online15.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/office-online15-300x91.png" alt="" /></a>
<p>②Contoso.Taskpane.Url</p>
<a href="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/office-online16.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/office-online16-300x108.png" alt="" /></a>
<h2>Office Onlineでアプリ実行</h2>
<ul>
<li>そのブラウザのまま、Microsoft365などで、Office Onlineを開きます。<br />
※キャプチャではWordですが、Excel・PowerPointなどでも手順は一緒なはずです。OneNoteやOutlookは同じか怪しいかも</li>
</ul>
<a href="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/office-online9.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/office-online9-300x164.png" alt="" /></a>
<ul>
<li>メニューの 「挿入」をクリックし、「アドイン」 を選択します。</li>
</ul>
<a href="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/office-online10.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/office-online10-300x132.png" alt="" /></a>
<ul>
<li>「個人用アドイン」の中の「個人用アドインの管理」をクリックし、「マイ アドインのアップロード」をクリックします。</li>
</ul>
<a href="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/office-online11.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/office-online11-300x213.png" alt="" /></a>
<a href="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/office-online12.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/office-online12-300x223.png" alt="" /></a>
<ul>
<li>これで、マニフェストファイルがアップロードされます。クライアント版Officeと同じような手順でアプリを実行することで、アプリが読み込まれます。</li>
</ul>
<a href="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/office-online13.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/office-online13-300x142.png" alt="" /></a>
<p>localhostで実行されている環境にも関わらず、アプリが読み込まれました。<br />
※もちろん、Live Serverを実行している端末以外で、Office Onlineを起動しマニフェストファイルを読み込んでも、アプリは実行されませんので、ご了承ください</p>
<h1>デバッグする</h1>
<p>いろんな場所で記載していますが、OfficeアドインはWebアプリケーションです。そのため、ブラウザのデバッグ機能をそのまま実行できます。</p>
<ul>
<li>
<p>Edgeの場合、F12をクリックし、「ソース」タブを開きます。</p>
</li>
<li>
<p>左リストの中の、「ぺージ」から、「top」→「WebApplicationFrame」→「{&quot;baseFrameName:....}」→「ローカル環境のURL(127.0.0.1:5500)」と開くことによって、作成したhtmlやスクリプトが開けます。</p>
</li>
</ul>
<a href="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/office-online5-1.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/office-online5-1-190x300.png" alt="" /></a>
<a href="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/office-online6-1.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/office-online6-1-226x300.png" alt="" /></a>
<a href="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/office-online7.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/office-online7-300x153.png" alt="" /></a>
<ul>
<li>後は、各々で作成したコードにブレークポイントを置いて、実行することで、デバッグが実施できます。</li>
</ul>
<a href="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/office-online8.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/office-online8-300x168.png" alt="" /></a>
<h1>まとめ</h1>
<p>クライアント版のOfficeの方が安定感がありますが、前回の記事で書いたように、どうにも環境依存で動く・動かないがあるようです。<br />
この手順なら、ごく普通のブラウザで動作・デバッグ可能ですので、場合によっては、Office Onlineでの開発も検討してみてください。</p>
<h1>参考</h1>
<p><a href="https://docs.microsoft.com/ja-jp/office/dev/add-ins/testing/sideload-office-add-ins-for-testing">https://docs.microsoft.com/ja-jp/office/dev/add-ins/testing/sideload-office-add-ins-for-testing</a><br />
<a href="https://qiita.com/ma2shita/items/297c812a6cd09b5e82c8">https://qiita.com/ma2shita/items/297c812a6cd09b5e82c8</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://develop.kajitori.co.jp/archives/155/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Officeアドイン(クライアント版)のデバッグを、VSCodeで実施する</title>
		<link>https://develop.kajitori.co.jp/archives/129</link>
					<comments>https://develop.kajitori.co.jp/archives/129#respond</comments>
		
		<dc:creator><![CDATA[hsatou]]></dc:creator>
		<pubDate>Thu, 28 Jan 2021 02:02:37 +0000</pubDate>
				<category><![CDATA[Officeアドイン]]></category>
		<category><![CDATA[VSCode]]></category>
		<guid isPermaLink="false">https://develop.kajitori.co.jp/?p=129</guid>

					<description><![CDATA[概要 Officeアドイン（クライアント）のデバッグを、VSCodeで実行するための手順です。 Visual Studio 201XのOfficeソリューションであったり、nodeを使用した環境であれば、デバッグの方法に...]]></description>
										<content:encoded><![CDATA[<h1>概要</h1>
<p>Officeアドイン（クライアント）のデバッグを、VSCodeで実行するための手順です。</p>
<p>Visual Studio 201XのOfficeソリューションであったり、nodeを使用した環境であれば、デバッグの方法についてはちょいちょい出てくるのですが、それ以外の環境で、VSCodeを使用した手順がなかなか出てこなかったので、まとめました。</p>
<p>今回はサーバーにLive Serverを使用していますが、XAMPP、IIS、Apacheなど、環境は何でも良いと思います。</p>
<p>また、どういうわけか同じ手順を踏んでいても、なぜかデバッグが正常に動かなかったり、ブレークポイントに引っかからなかったりということが発生していました。<br />
そのため、もしこの手順でデバッグが正常に動かない場合は、お手数ですが、端末の再起動、VSCodeの再起動など、お試しください。<br />
それでも駄目なら、なにか別の理由があると思いますが、今は分かりません。ごめんなさい。</p>
<h1>前提条件</h1>
<h2>執筆時環境・バージョン</h2>
<ul>
<li>Windows10</li>
<li>Microsoft Office (Microsoft365版) ビルド13530.20376</li>
<li>Edge  88.0.705.53</li>
<li>VSCode 1.52.1</li>
<li>Microsoft Office Add-in Debugger v0.2.0</li>
<li>Live Server v5.6.1</li>
</ul>
<h2>前提</h2>
<ul>
<li>すでにOfficeアドイン(クライアント版)を、ローカル環境で動作するための手順が整っていること</li>
</ul>
<h2>実行環境</h2>
<ul>
<li>ローカル環境URL：<a href="http://127.0.0.1:5500">http://127.0.0.1:5500</a>  （Live Server）</li>
</ul>
<h1>手順</h1>
<ul>
<li>
<p>スタートメニューで、「Visual Studio」と入力すると、「Visual Studio Code」が表示されます。</p>
</li>
<li>
<p>そこで、「管理者として実行」をクリックします。  (※)</p>
</li>
</ul>
<a href="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/officeaddin-debug1.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/officeaddin-debug1-300x280.png" alt="" /></a>
<ul>
<li>正常に開けた場合、VSCodeのタイトルに[管理者]と表示されます。</li>
</ul>
<a href="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/officeaddin-debug2.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/officeaddin-debug2-300x124.png" alt="" /></a>
<ul>
<li>左メニューの「拡張機能」で、「Microsoft Office Add-in Debugger」で検索し、インストールします。<br />
<a href="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/officeaddin-debug3.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/officeaddin-debug3-300x192.png" alt="" /></a></li>
</ul>
<ul>
<li>
<p>左メニューより「実行」を選択し、「launch.jsonファイルを作成します」リンクをクリックし、「Office Addin」を選択します。<br />
<a href="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/officeaddin-debug4.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/officeaddin-debug4-300x192.png" alt="" /></a></p>
</li>
<li>
<p>launch.jsonファイルが作成されます。<br />
<a href="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/officeaddin-debug5.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/officeaddin-debug5-300x192.png" alt="" /></a></p>
</li>
<li>
<p>launch.jsonに、行を追加します。※最初の行に「,」を追加してください<br />
※ここで、&quot;url&quot;の値の&quot;?&quot;の前に、「/」を付けてください。これが無いと、正常に動きませんでした。<br />
※逆に、「/」があると動かないケースもあるかもしれません。この値は、有る無しで切り替えてみてほしいです。</p>
</li>
</ul>
<pre><code>        ,
        {
            &quot;type&quot;: &quot;office-addin&quot;,
            &quot;request&quot;: &quot;attach&quot;,
            &quot;name&quot;: &quot;Attach to Office Add-ins&quot;,
            &quot;port&quot;: 9222,
            &quot;trace&quot;: &quot;verbose&quot;,
            &quot;url&quot;: &quot;http://127.0.0.1:5500/?_host_Info=Word$Win32$16.01$ja-JP$$$$0&quot;,
            &quot;webRoot&quot;: &quot;${workspaceFolder}&quot;,
            &quot;timeout&quot;: 3000
          }</code></pre>
<a href="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/officeaddin-debug6.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/officeaddin-debug6-300x162.png" alt="" /></a>
<ul>
<li>
<p>VSCodeで、任意の場所にブレークポイントを置きます。<br />
<a href="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/officeaddin-debug7.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/officeaddin-debug7-300x192.png" alt="" /></a></p>
</li>
<li>
<p>Live Serverで実施する場合、右下の「Go Live」ボタンをクリックします。  (※)<br />
<a href="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/officeaddin-debug8.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/officeaddin-debug8-300x195.png" alt="" /></a></p>
</li>
<li>
<p>Wordを起動し、Officeアドインを開きます。  (※)<br />
<a href="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/officeaddin-debug9.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/officeaddin-debug9-300x192.png" alt="" /></a></p>
</li>
<li>
<p>VSCodeに戻り、左メニューの「実行」をクリック後、左上の「Launch」と書かれている再生ボタンの右の一覧をクリックし、「Attach to Office Add-ins」を選択します。  (※)<br />
<a href="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/officeaddin-debug10.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/officeaddin-debug10-300x192.png" alt="" /></a></p>
</li>
<li>
<p>そのまま、左上の「Launch」と書かれている再生ボタンをクリックします。  (※)<br />
正常にデバッグが完了すれば、VSCodeのページ上部に下記キャプチャのような表示が行われます。<br />
<a href="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/officeaddin-debug11.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/officeaddin-debug11-300x196.png" alt="" /></a></p>
</li>
<li>
<p>Wordのアプリのjs処理を実行してみます。 (※)<br />
<a href="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/officeaddin-debug12.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/officeaddin-debug12-300x191.png" alt="" /></a></p>
</li>
<li>
<p>VSCodeで、ブレークポイントで停止しました。<br />
<a href="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/officeaddin-debug13.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/officeaddin-debug13-300x194.png" alt="" /></a></p>
</li>
</ul>
<h2>再度、デバッグを実施する場合</h2>
<p>端末の再起動などで、再度デバッグを実施する場合は、手順に(※)と記載の部分のみ、実施を行ってください。</p>
<h1>やっぱり動かない場合</h1>
<p>どうもこのOfficeアドインのデバッグは不安定なようで、どうやっても正常に動作しない、というご報告をいただいていました。<br />
そのため、Office Onlineでの動作手順も、今後記事にしようと思っています。気長にお待ちください。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://develop.kajitori.co.jp/archives/129/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Sharepoint Frameworkにプロパティ要素を追加し、画面から設定値を変更できるようにする</title>
		<link>https://develop.kajitori.co.jp/archives/61</link>
					<comments>https://develop.kajitori.co.jp/archives/61#respond</comments>
		
		<dc:creator><![CDATA[hsatou]]></dc:creator>
		<pubDate>Mon, 17 Jun 2019 12:14:27 +0000</pubDate>
				<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[SharePointFramework]]></category>
		<category><![CDATA[TypeScrript]]></category>
		<guid isPermaLink="false">https://develop.kajitori.co.jp/?p=61</guid>

					<description><![CDATA[はじめに 前回の記事では、SharePoint Framework内でWordPress REST API処理を追加し、SharePointページ内でコンテンツを表示する対応を行いました。 しかし前回の記事のままだと、取...]]></description>
										<content:encoded><![CDATA[<h1>はじめに</h1>
<p>前回の記事では、SharePoint Framework内でWordPress REST API処理を追加し、SharePointページ内でコンテンツを表示する対応を行いました。</p>
<p>しかし前回の記事のままだと、取得先のWordPressのURLは、ソースコード内に埋め込まれており、変更できません。<br />
URLを変更するためには、都度ソースコードを変更する必要があり、非常に面倒です。</p>
<p>そのため今回は、SharePoint Frameworkにプロパティ要素を追加し、画面から設定値を変更できるようにする機能を追加します。<br />
今回は、「取得先のWordPressのURLを、画面から変更できるようにする対応」とします。</p>
<p><!-- more --></p>
<h2>SharePoint Frameworkのプロパティとは</h2>
<p>前回作成したWebパーツを起動すると、「Edit web part」と、Webパーツを編集するタイルが表示されています。<br />
<img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/20190617140038-300x183.png" alt="" /></p>
<p>このボタンをクリックすると、画面右に、プロパティを変更する要素が表示されます。<br />
<img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/20190617140211-276x300.png" alt="" /></p>
<p>現在は「Description Field」、つまり説明文を変更する要素のみになりますが、今回はここに、取得先のWordPress APIを変更できるようにしていきます。</p>
<h1>実装</h1>
<p>今回の参考資料：<br />
<a href="https://docs.microsoft.com/ja-jp/sharepoint/dev/spfx/web-parts/get-started/build-a-hello-world-web-part#configure-the-web-part-property-pane">https://docs.microsoft.com/ja-jp/sharepoint/dev/spfx/web-parts/get-started/build-a-hello-world-web-part#configure-the-web-part-property-pane</a></p>
<h2>プロパティの追加</h2>
<ul>
<li>前回修正した、「SharePointWordpressWebPart.ts」（アプリ名.ts）ファイルを開き、先頭の以下の要素を確認します。</li>
</ul>
<pre><code class="language-typescript">import {
  IPropertyPaneConfiguration,
  PropertyPaneTextField
} from &#039;@microsoft/sp-property-pane&#039;;</code></pre>
<p>この「PropertyPaneTextField」というのが、プロパティのテキストフィールドになります。<br />
ここで、プロパティ要素にチェックボックスを追加したい場合はPropertyPaneCheckbox、ドロップダウンメニューの場合はPropertyPaneDropdownなどを追加してください。<br />
例：  </p>
<pre><code class="language-typescript">import {
  IPropertyPaneConfiguration,
  PropertyPaneTextField,
  PropertyPaneCheckbox,
  PropertyPaneDropdown
} from &#039;@microsoft/sp-property-pane&#039;;</code></pre>
<p>※今回については、種類はテキストフィールドのみなので、上記の追加は不要です</p>
<ul>
<li>同じtsファイル内のインタフェース、「ISharePointWordpressWebPartProps」を確認します。デフォルトだと以下のようになっております。</li>
</ul>
<pre><code class="language-typescript">export interface ISharePointWordpressWebPartProps {
  description: string;
}</code></pre>
<p>ここに、プロパティとして追加したい要素と、その種類を追記していきます。<br />
今回はWordPressのURLなので、以下のように追加してください。その後、ファイルを保存します。</p>
<pre><code class="language-typescript">export interface ISharePointWordpressWebPartProps {
  description: string;
  wordPressUrl: string;
}</code></pre>
<ul>
<li>その下の、getPropertyPaneConfigurationメソッドを確認します。<br />
デフォルトだと、以下のような記述になっております。</li>
</ul>
<pre><code class="language-typescript">protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration {
    return {
      pages: [
        {
          header: {
            description: strings.PropertyPaneDescription
          },
          groups: [
            {
              groupName: strings.BasicGroupName,
              groupFields: [
                PropertyPaneTextField(&#039;description&#039;, {
                  label: strings.DescriptionFieldLabel
                })
              ]
            }
          ]
        }
      ]
    };
  }</code></pre>
<p>これを修正し、wordPressUrl要素を追加していきます。<br />
具体的には、以下のようになります。  </p>
<pre><code class="language-typescript">protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration {
    return {
      pages: [
        {
          header: {
            description: strings.PropertyPaneDescription
          },
          groups: [
            {
              groupName: strings.BasicGroupName,
              groupFields: [
                PropertyPaneTextField(&#039;description&#039;, {
                  label: strings.DescriptionFieldLabel
                }),
                // 追加-開始
                PropertyPaneTextField(&#039;wordPressUrl&#039;, {
                  label: &#039;WordPress URL&#039;
                }),
                // 追加-終了
              ]
            }
          ]
        }
      ]
    };
  }</code></pre>
<p>これで、SharePointWordpressWebPart.tsに関する設定は完了です。  </p>
<h2>デフォルト値の修正</h2>
<p>アプリのプロパティ既定値を追加していきます。  </p>
<ul>
<li>「SharePointWordpressWebPart.manifest.json」(アプリ名.manifest.json)を開きます。<br />
標準だと以下のような記載がされています。</li>
</ul>
<pre><code class="language-json">  &quot;preconfiguredEntries&quot;: [{
    &quot;groupId&quot;: &quot;5c03119e-3074-46fd-976b-c60198311f70&quot;, // Other
    &quot;group&quot;: { &quot;default&quot;: &quot;Other&quot; },
    &quot;title&quot;: { &quot;default&quot;: &quot;SharePointWordpress&quot; },
    &quot;description&quot;: { &quot;default&quot;: &quot;SharePointWordpress description&quot; },
    &quot;officeFabricIconFontName&quot;: &quot;Page&quot;,
    &quot;properties&quot;: {
      &quot;description&quot;: &quot;SharePointWordpress&quot;
    }
  }]
}</code></pre>
<ul>
<li>preconfiguredEntries &gt; properties が、プロパティの既定に関する内容です。<br />
この内容を変更します。今回は前回同等、弊社で提供しているサービスのURLにします。<br />
（他社のブログにアクセスするのも問題なので）</li>
</ul>
<pre><code class="language-json">  &quot;preconfiguredEntries&quot;: [{
    &quot;groupId&quot;: &quot;5c03119e-3074-46fd-976b-c60198311f70&quot;, // Other
    &quot;group&quot;: { &quot;default&quot;: &quot;Other&quot; },
    &quot;title&quot;: { &quot;default&quot;: &quot;SharePointWordpress&quot; },
    &quot;description&quot;: { &quot;default&quot;: &quot;SharePointWordpress description&quot; },
    &quot;officeFabricIconFontName&quot;: &quot;Page&quot;,
    &quot;properties&quot;: {
      &quot;description&quot;: &quot;SharePointWordpress&quot;,
      &quot;wordPressUrl&quot;: &quot;https://exment.net&quot;
    }
  }]
}</code></pre>
<ul>
<li>Ctrl + Shift + Bでビルドを行い、以下のコマンドでWorkBenchを表示します。  </li>
</ul>
<pre><code>gulp serve</code></pre>
<p>これで、先ほど確認したプロパティを表示すると、「WordPress URL」入力テキスト欄が追加されています。<br />
<img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/20190617143854-300x256.png" alt="" /></p>
<h2>プロパティ値をWebパーツに埋め込む</h2>
<p>いよいよ、今回作成したプロパティwordPressUrlを、Webパーツに埋め込む処理を追加していきます。  </p>
<ul>
<li>WordPress.tsのgetWordpressHtmlを、引数よりWordPressのURLを取得する方式に修正します。  </li>
</ul>
<pre><code class="language-typescript">export default class WordPress {
  public static getWordpressHtml = (wordPressUrl) =&gt; {
    var $defer = $.Deferred();
    var apiUrl = wordPressUrl + &#039;/wp-json/wp/v2/posts?_embed&#039;;
    $.getJSON(apiUrl).then((data) =&gt; {
        // 以下省略</code></pre>
<p>apiUrlを、wordPressUrl + '/wp-json/wp/v2/posts?_embed' より作成する方式に修正しました。  </p>
<ul>
<li>SharePointWordpressWebPart.tsのrender関数を修正します。  </li>
</ul>
<pre><code class="language-typescript">public render(): void {
    var wordPressUrl = this.properties.wordPressUrl;  // ポイント
    WordPress.getWordpressHtml(wordPressUrl)
      .then((html:string) =&gt; {
        $(this.domElement).html(html); 
      });
  }</code></pre>
<p>ポイントは「this.properties.wordPressUrl」です。<span style="font-weight:bold; color:red">this.propertiesで、プロパティ値を取得できます。</span><br />
今回はthis.properties.wordPressUrlで、WordPressのURLを取得しています。  </p>
<p>これにより、WordPressのURLを、画面から取得するようになりました。<br />
試しに、URLを変更してみます。プロパティウィンドウを開き、WordPress URLを、かつて私が書いていた個人ブログに変更します。  </p>
<img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/20190617145009-300x152.png" alt="" />
<p><small>めちゃくちゃ色々語ってますねｗ</small><br />
このように、画面からURLを変更することで、取得先のURLを変更することができます。  </p>
<p>ちなみに、レンダリング時に直接埋め込むことも可能なようです。<br />
参考サイトだと、以下のように記載しておりました。この中の「this.properties.description」が該当します。  </p>
<pre><code class="language-typescript">public render(): void {
  this.domElement.innerHTML = `
    &lt;div class=&quot;${ styles.helloWorld }&quot;&gt;
      &lt;div class=&quot;${ styles.container }&quot;&gt;
        &lt;div class=&quot;${ styles.row }&quot;&gt;
          &lt;div class=&quot;${ styles.column }&quot;&gt;
            &lt;span class=&quot;${ styles.title }&quot;&gt;Welcome to SharePoint!&lt;/span&gt;
            &lt;p class=&quot;${ styles.subTitle }&quot;&gt;Customize SharePoint experiences using web parts.&lt;/p&gt;
            &lt;p class=&quot;${ styles.description }&quot;&gt;${escape(this.properties.description)}&lt;/p&gt;
            &lt;a href=&quot;https://aka.ms/spfx&quot; class=&quot;${ styles.button }&quot;&gt;
              &lt;span class=&quot;${ styles.label }&quot;&gt;Learn more&lt;/span&gt;
            &lt;/a&gt;
          &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;`;
}</code></pre>
<h1>まとめ</h1>
<p>このように、プロパティを設定することで、ユーザーによる柔軟な設定変更ができるようになります。<br />
設定値は可能な限りプロパティ値にすることで、変化に柔軟なアプリ作りを心掛けましょう！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://develop.kajitori.co.jp/archives/61/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SharepointFrameworkを試してみる[WordPressの記事を表示]</title>
		<link>https://develop.kajitori.co.jp/archives/56</link>
					<comments>https://develop.kajitori.co.jp/archives/56#respond</comments>
		
		<dc:creator><![CDATA[hsatou]]></dc:creator>
		<pubDate>Mon, 17 Jun 2019 12:09:13 +0000</pubDate>
				<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[SharePointFramework]]></category>
		<guid isPermaLink="false">https://develop.kajitori.co.jp/?p=56</guid>

					<description><![CDATA[はじめに SharepointFrameworkの検証を行います。 この記事では、以下について扱います。 SharePointFrameworkのインストール とりあえずSharePointFrameworkで実行してみ...]]></description>
										<content:encoded><![CDATA[<h1>はじめに</h1>
<p>SharepointFrameworkの検証を行います。<br />
この記事では、以下について扱います。  </p>
<ol>
<li>SharePointFrameworkのインストール</li>
<li>とりあえずSharePointFrameworkで実行してみる</li>
<li>jqueryの追加</li>
<li>独自処理 - WordPress連携部分の追加</li>
</ol>
<p>※SharepointFrameworkの概念の話はしません。それはまた別の機会に。</p>
<h1>実装</h1>
<h2>今回の参考資料</h2>
<p><a href="https://docs.microsoft.com/ja-jp/sharepoint/dev/spfx/web-parts/get-started/build-a-hello-world-web-part">https://docs.microsoft.com/ja-jp/sharepoint/dev/spfx/web-parts/get-started/build-a-hello-world-web-part</a></p>
<p><!-- more --></p>
<h2>SharePointFrameworkのインストール</h2>
<ul>
<li>nodeを未インストールの場合、nodeをインストール   </li>
</ul>
<p><a href="https://nodejs.org/ja/">https://nodejs.org/ja/</a></p>
<ul>
<li>
<p>npm確認</p>
<pre><code>npm --version</code></pre>
</li>
<li>
<p>必要パッケージインストール</p>
<pre><code>npm install -g yo gulp
npm install -g @microsoft/generator-sharepoint</code></pre>
</li>
<li>
<p>SharepointFrameworkインストール先のフォルダを作成</p>
</li>
</ul>
<pre><code>mkdir SharePointWordpress
cd SharePointWordpress</code></pre>
<ul>
<li>SharepointFrameworkインストール実行
<pre><code>yo @microsoft/sharepoint</code></pre>
</li>
</ul>
<p>ここで、対話式でさまざまなことを聞かれるので、回答します。  </p>
<pre><code>  What is your solution name? : (任意のソリューション名)  
  Which baseline packages do you want to target for your component(s)? :(そのままEnter。SharePoint Onlineのみ)  
  Where do you want to place the files? : (そのままEnter。カレントフォルダにインストール)  
  Do you want to allow the tenant admin the choice of being able to deploy the solution to all sites immediately without running any feature deployment or adding apps in sites? : (N)  
  Will the components in the solution require permissions to access web APIs that are unique and not shared with other components in the tenant? : (N)  
  Which type of client-side component to create? : (そのままEnter。WebPart)  
  What is your Web part name? : (任意のWebパーツ名。この名前が画面に表示される様子)
  What is your Web part description? : (説明文。面倒なのでそのままEnter)
  Which framework would you like to use? : (JSのフレームワーク。Reactとか使う場合は指定する様子)  </code></pre>
<p>これが完了したら、インストールが開始されます。超時間かかりますが、待ちましょう。</p>
<ul>
<li>
<p>Visual Studio Codeで、インストールしたフォルダを開いて起動</p>
</li>
<li>
<p>Ctrl + Shift + Bで、gulpのビルド実行<br />
gulp buildを選択 → タスクのスキャンを出力せず実行 をクリック<br />
→これで、元々入っているSharePointFrameworkのビルドが実行されます。  </p>
</li>
<li>
<p>VSCodeで、以下のコマンドを実行</p>
<pre><code>gulp serve</code></pre>
<p>→ブラウザが立ち上がり、SharePoint WorkBenchが起動します。</p>
</li>
<li>
<p>「+」ボタンをクリック後、パーツ名をクリックし、Webパーツを配置します。<br />
<img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/20190605210417-300x140.png" alt="" /></p>
</li>
<li>
<p>既定のパーツが配置されていることを確認します。<br />
<img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/20190605210505-300x103.png" alt="" /></p>
</li>
</ul>
<h2>カスタマイズ</h2>
<p>デフォルト設定で起動できることを確認したら、ここからカスタマイズをしていきましょう。  </p>
<h3>jquery追加</h3>
<p>まずはjqueryの追加です。</p>
<ul>
<li>
<p>VSCodeで、以下のコマンドを実行</p>
<pre><code>npm install jquery@2 --save
npm install @types/jquery@2 --save</code></pre>
</li>
<li>
<p>VSCodeで、config/config.jsonを開き、externalsに以下を追加</p>
<pre><code class="language-json">&quot;jquery&quot;:&quot;node_modules/jquery/dist/jquery.min.js&quot;</code></pre>
</li>
</ul>
<h3>独自処理を追加</h3>
<p>独自処理として、今回はWordPressのAPIを使用し、WordPressの記事一覧を取得し表示します。<br />
※WordPressの向き先は、とりあえず自社サービスのものにしています。</p>
<ul>
<li>src\webparts\sharePointWordpressに、WordPress.tsを追加します。<br />
その後、以下のコードを追加します。</li>
</ul>
<pre><code class="language-typescript">import * as $ from &#039;jquery&#039;;

export default class WordPress {
  public static getWordpressHtml = () =&gt; {
    var $defer = $.Deferred();

    // wordpressのAPIのURL
    $.getJSON(&#039;https://exment.net/wp-json/wp/v2/posts?_embed&#039;).then((data) =&gt; {
          console.log(data);

          var html = &#039;&#039;;
          for(var index in data){
              var d = data[index];

              var title = d.title.rendered;
              var link = d.link;
              var excerpt = d.excerpt.rendered;
              var date = d.date;

              // ul作成
              var $a = $(&#039;&lt;a/&gt;&#039;, {&#039;href&#039; : link, &#039;style&#039; : &#039;margin-bottom:4em; display:block;&#039;});
              var $ul = $(&#039;&lt;ul/&gt;&#039;);

              $ul.append($(&#039;&lt;li/&gt;&#039;, {&#039;text&#039;: &#039;タイトル：&#039; + title}));
              $ul.append($(&#039;&lt;li/&gt;&#039;, {&#039;text&#039;: &#039;日付：&#039; + date}));
              $ul.append($(&#039;&lt;li/&gt;&#039;, {&#039;html&#039;: &#039;本文：&#039; + excerpt}));

              $a.append($ul);

              html += $a[0].outerHTML;
          }

          $defer.resolve(html);
      });

    return $defer.promise();
  }

}
</code></pre>
<ul>
<li>src\webparts\sharePointWordpress\SharePointWordpressWebPart.tsの記述を修正します。</li>
</ul>
<pre><code class="language-typescript">import { Version } from &#039;@microsoft/sp-core-library&#039;;
import { BaseClientSideWebPart } from &#039;@microsoft/sp-webpart-base&#039;;
import {
  IPropertyPaneConfiguration,
  PropertyPaneTextField
} from &#039;@microsoft/sp-property-pane&#039;;
import { escape } from &#039;@microsoft/sp-lodash-subset&#039;;

import styles from &#039;./SharePointWordpressWebPart.module.scss&#039;;
import * as strings from &#039;SharePointWordpressWebPartStrings&#039;;

///// 追加---s
import * as $ from &#039;jquery&#039;;
//WordPress.tsを読み込む
import WordPress from &#039;./WordPress&#039;;
///// 追加---e

export interface ISharePointWordpressWebPartProps {
  description: string;
}

export default class SharePointWordpressWebPart extends BaseClientSideWebPart&lt;ISharePointWordpressWebPartProps&gt; {

  public render(): void {
    ///// 修正---s
    // WordPress.ts内のgetWordpressHtml実行
    WordPress.getWordpressHtml()
      .then((html:string) =&gt; {
        $(this.domElement).html(html); 
      });
    ///// 修正---e
  }

  protected get dataVersion(): Version {
    return Version.parse(&#039;1.0&#039;);
  }

  protected getPropertyPaneConfiguration(): IPropertyPaneConfiguration {
    return {
      pages: [
        {
          header: {
            description: strings.PropertyPaneDescription
          },
          groups: [
            {
              groupName: strings.BasicGroupName,
              groupFields: [
                PropertyPaneTextField(&#039;description&#039;, {
                  label: strings.DescriptionFieldLabel
                })
              ]
            }
          ]
        }
      ]
    };
  }
}
</code></pre>
<ul>
<li>
<p>再度Ctrl + Shift + Bで、ビルドを行います。<br />
その後Sharepoint WorkBenchにアクセスすることで、WordPressの記事一覧が表示されます。<br />
<img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/20190605205537-300x150.png" alt="" /></p>
</li>
<li>
<p>無事、jqueryも呼び出した上で、独自の実装を実現できました！</p>
</li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://develop.kajitori.co.jp/archives/56/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Officeアドイン】OfficeアドインでSSOを有効化 実装編[Laravel]</title>
		<link>https://develop.kajitori.co.jp/archives/36</link>
					<comments>https://develop.kajitori.co.jp/archives/36#respond</comments>
		
		<dc:creator><![CDATA[hsatou]]></dc:creator>
		<pubDate>Tue, 28 May 2019 12:05:12 +0000</pubDate>
				<category><![CDATA[Officeアドイン]]></category>
		<category><![CDATA[Laravel]]></category>
		<guid isPermaLink="false">https://develop.kajitori.co.jp/?p=36</guid>

					<description><![CDATA[前回の記事の続きです。今回は、実際に実装して検証しました。 実装方針 MSのサイトに、node.jsとASP.NETのサンプルはすでにあるので、今回は別の言語で実装することにします。 今回は最近愛してやまない、PHPのL...]]></description>
										<content:encoded><![CDATA[<p>前回の記事の続きです。今回は、実際に実装して検証しました。</p>
<h1>実装方針</h1>
<p>MSのサイトに、<a href="https://docs.microsoft.com/ja-jp/office/dev/add-ins/develop/create-sso-office-add-ins-nodejs">node.js</a>と<a href="https://docs.microsoft.com/ja-jp/office/dev/add-ins/develop/create-sso-office-add-ins-aspnet">ASP.NET</a>のサンプルはすでにあるので、今回は別の言語で実装することにします。<br />
今回は最近愛してやまない、PHPの<b><span style="color: #ff0000">Laravel</span></b>で実装しました。Laravelサイコー。</p>
<p>なお、基本的には以下のドキュメントに記載の内容の後追いになります。こっちと自分の記事を読みながら検証するのがベスト。<br />
<a href="https://docs.microsoft.com/ja-jp/office/dev/add-ins/develop/sso-in-office-add-ins">https://docs.microsoft.com/ja-jp/office/dev/add-ins/develop/sso-in-office-add-ins</a></p>
<p><a href="https://docs.microsoft.com/ja-jp/office/dev/add-ins/develop/register-sso-add-in-aad-v2">https://docs.microsoft.com/ja-jp/office/dev/add-ins/develop/register-sso-add-in-aad-v2</a></p>
<p><span id="more-36"></span></p>
<h1>準備・設定</h1>
<h2>前提</h2>
<ul>
<li>
<p>今回構築するLaravelサイトの情報は以下になります。<br />
<a href="http://127.0.0.1:8000">http://127.0.0.1:8000</a><br />
※実際に公開する場合は、「127.0.0.1:8000」を修正してください<br />
※また、この記事を書き始めた当初、「localhost:9000」と思い、キャプチャを作成し始めてしまいました。そのため、キャプチャ内に「localhost:9000」があった場合、「127.0.0.1:8000」に修正をお願いします。  </p>
</li>
<li>
<p>Laravel5.6で構築しております。  </p>
</li>
</ul>
<h2>Office365インストール</h2>
<p>Office365のクライアント版を、Office365のサイトからインストールします。  </p>
<h2>Azure AD v2設定</h2>
<ul>
<li>
<p>以下のAzureポータルページにアクセスし、Office365のアカウントでサインインします。<br />
[<a href="https://go.microsoft.com/fwlink/?linkid=2083908">https://go.microsoft.com/fwlink/?linkid=2083908</a>]
</li>
<li>
<p>「アプリの登録」より、「新規登録」をクリックします。<br />
<img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/20190525213050-300x148.png" alt="" /></p>
</li>
<li>
<p>以下のように入力し、「登録」をクリックします。<br />
<img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/20190525213149-300x244.png" alt="" /></p>
</li>
<li>
<p>アプリケーション (クライアント) IDとディレクトリ (テナント) IDをコピーしておきます。（あとで使用します）<br />
<img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/20190525213414-300x116.png" alt="" /></p>
</li>
<li>
<p>「証明書とシークレット」をクリックし、「新しいクライアント シークレット」をクリックして、クライアントシークレットをコピーします。(こちらも後で使用します)<br />
<img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/20190525213534-300x118.png" alt="" /></p>
</li>
</ul>
<img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/20190525213643-300x197.png" alt="" />
<img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/20190525213747-300x37.png" alt="" />
<ul>
<li>「API の公開」→「設定」をクリックし、値に以下を入力します。<br />
api://(Webサイトのドメイン)/(先ほどコピしたアプリケーションID)<br />
例： api://127.0.0.1:8000/f4255842-2ac6-4b01-b8a6-aaaaaaaaaaaa  </li>
</ul>
<img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/20190525221840-300x138.png" alt="" />
<ul>
<li>「Scopeの追加」をクリックし、以下のように入力します。<br />
※スコープ名に「access_as_user」、同意できるのは誰ですかを「管理者とユーザー」と記入し、後は適当に  </li>
</ul>
<img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/20190525214443-300x281.png" alt="" />
<ul>
<li>「承認済みのクライアント アプリケーション」下の「クライアント アプリケーションの追加」をクリックし、<br />
「クライアントID」に以下の3つを入力し、「承認済みのスコープ」チェックを行い、「アプリケーションの追加」をクリックします。<br />
(Office系の設定値らしいです)<br />
d3590ed6-52b3-4102-aeff-aad2292ab01c<br />
57fb890c-0dab-4253-a5e0-7188c88b2bb4<br />
bc59ab01-8403-45c6-8796-ac3ef710b3e3  </li>
</ul>
<img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/20190525215007-300x261.png" alt="" />
<img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/20190525215115-300x133.png" alt="" />
<ul>
<li>「APIのアクセス許可」をクリックし、[Microsoft Graph] を選択してから [委任されたアクセス許可] を選択します。<br />
その後、以下にチェックを行い、「アクセス許可の更新」をクリックします。<br />
offline_access<br />
openid<br />
profile  </li>
</ul>
<img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/20190525215633-300x171.png" alt="" />
<img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/20190525215857-236x300.png" alt="" />
<p>最後に、「既定のディレクトリ に管理者の同意を与えます」をクリックします。  </p>
<img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/20190525220019-300x109.png" alt="" />
<p>以上で、Azure AD v2側の設定は完了です。  </p>
<h2>Laravel開発</h2>
<p>Laravelの開発を行っていきます。<br />
※composerをインストールしている前提です。composerの説明は割愛します。</p>
<ul>
<li>
<p>インストールするフォルダで、コマンドプロンプトなどで、以下のコマンドを実行します。<br />
実行後、officejs_sso_laravelフォルダにcdします。<br />
composer create-project &quot;laravel/laravel=5.6.*&quot; officejs_sso_laravel</p>
</li>
<li>
<p>以下のリポジトリより、phpファイルをダウンロードします。<br />
<a href="https://github.com/hirossyi73/office-js-sso-laravel">https://github.com/hirossyi73/office-js-sso-laravel</a></p>
</li>
</ul>
<p>該当ファイルを、Laravelディレクトリに上書きます。  </p>
<img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/20190525221236.png" alt="" />
<ul>
<li>.envファイルに、以下の値を記入します。<br />
CLIENT_ID=(コピーしたアプリケーションID)<br />
CLIENT_SECRET=&quot;(コピーしたクライアントシークレット。ダブルクオーテーションで囲むことを推奨)&quot;<br />
SCOPE=&quot;offline_access openid profile&quot;<br />
TENANT=(コピーしたテナントID)  </li>
</ul>
<img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/20190528091147-300x81.png" alt="" />
<ul>
<li>以下のコマンドを実行します。<br />
php artisan serve</li>
</ul>
<p>これで、以下のURLでサーバーが起動します。<br />
<a href="http://127.0.0.1:8000">http://127.0.0.1:8000</a>  </p>
<h2>Officeアドイン設定</h2>
<ul>
<li>githubより、マニフェストファイルをダウンロードします。  </li>
</ul>
<p><a href="https://github.com/hirossyi73/office-js-sso-laravel/blob/master/Office-Add-in-Laravel.xml">https://github.com/hirossyi73/office-js-sso-laravel/blob/master/Office-Add-in-Laravel.xml</a></p>
<ul>
<li>ダウンロードしたマニフェストファイルを開き、135行目以降のWebApplicationInfo以下の内容を修正します。</li>
</ul>
<pre><code>    &lt;WebApplicationInfo&gt;
      &lt;Id&gt;(アプリケーションID)&lt;/Id&gt;
      &lt;Resource&gt;api://(ドメイン)/(アプリケーションID)&lt;/Resource&gt;
        &lt;Scopes&gt;
            &lt;Scope&gt;openid&lt;/Scope&gt;
            &lt;Scope&gt;offline_access&lt;/Scope&gt;
            &lt;Scope&gt;profile&lt;/Scope&gt;
        &lt;/Scopes&gt;
    &lt;/WebApplicationInfo&gt;</code></pre>
<ul>
<li>
<p>マニフェストファイルを、Officeのセキュリティ設定で「カタログ URL」に設定したパスに配置します。  </p>
</li>
<li>
<p>PowerPointを開き、アドインを起動します。  </p>
</li>
</ul>
<img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/20190528143501-300x80.png" alt="" />
<ul>
<li>正常終了すると、このようにトークンが取得されます。</li>
</ul>
<img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2021/01/20190528143602-300x223.png" alt="" />
<ul>
<li>このうち、
<ul>
<li>アドイントークン：OfficeのSSOから取得したトークンです。</li>
<li>ユーザー名：アドイントークンから取得したログインユーザー名です。</li>
<li>Eメール：アドイントークンから取得したメールアドレスです。</li>
<li>Graphアクセストークン：アドイントークンを使用し、PHP(Laravel)側で取得したMicrosoft Graphトークンです。もちろん、このトークンをMicrosoft Graphに使用すれば、情報を取得できます。  </li>
<li>Graphリフレッシュトークン：アドイントークンを使用し、PHP(Laravel)側で取得したMicrosoft Graphのリフレッシュトークンです。  </li>
</ul>
</li>
</ul>
<h1>解説</h1>
<p>ソース単位でご説明します。</p>
<h3>アドイントークン取得</h3>
<p>以下の内容で、アドイントークンを取得しています。</p>
<pre><code class="language-javascript">//  app.js
(function(){
    // 初期化処理
    Office.onReady(function(info) {
        if(!Office.context.auth.getAccessTokenAsync){
            log(&#039;Office.context.auth.getAccessTokenAsync not supported&#039;);
            return;
        }

        // 認証実行
        Office.context.auth.getAccessTokenAsync(function (result) {
            if (result.status === &quot;succeeded&quot;) {
                // Use this token to call Web API
                var ssoToken = result.value;
                $(&#039;#addin_token&#039;).val(ssoToken);

                // decode user info
                var decoded = jwt_decode(ssoToken);

                $(&#039;#username&#039;).val(decoded.name);
                $(&#039;#email&#039;).val(decoded.preferred_username);

                getGraphToken(ssoToken);
            } else {
                if (result.error.code === 13003) {
                    // SSO is not supported for domain user accounts, only
                    // work or school (Office 365) or Microsoft Account IDs.
                } else {
                    // Handle error
                }

                log(&#039;error &#039; + result.error.code);
            }
        });
    });
})();</code></pre>
<p>ポイントは「Office.context.auth.getAccessTokenAsync(function (result) {」で、この関数で、PowerPointのアプリケーションからSSOで、アドインのトークンを取得しています。<br />
トークンはJWT形式なので、「//decode user info」の部分で内容を解析し、名前とメールアドレスを取得しています。  </p>
<h3>Microsoft Graphトークン取得</h3>
<p>以下の内容で、Microsoft Graphトークンを取得しています。</p>
<pre><code class="language-javascript">//  app.js

/**
 * Microsoft Graphのトークンをサーバーサイドから取得
 * @param string apptoken アドイントークン
 */
function getGraphToken(apptoken){
    var CSRF_TOKEN = $(&#039;meta[name=&quot;csrf-token&quot;]&#039;).attr(&#039;content&#039;);

    $.ajax({
        url:&#039;./graphtoken&#039;,
        type:&#039;POST&#039;,
        data:{
            &#039;apptoken&#039;:apptoken,
            &#039;_token&#039; : CSRF_TOKEN,
        }
    })
    // Ajaxリクエストが成功した時発動
    .done(function(data){
        $(&#039;#graph_token&#039;).val(data.access_token);
        $(&#039;#graph_refresh_token&#039;).val(data.refresh_token);
    })
    // Ajaxリクエストが失敗した時発動
    .fail(function(data){
        log(&#039;Graph token error : &#039; + JSON.stringify(data));
    })
    // Ajaxリクエストが成功・失敗どちらでも発動
    .always(function(data){
    });
}
</code></pre>
<pre><code class="language-php">// IndexController.php
    /**
     * Graphのトークン取得
     *
     * @return void
     */
    public function graphtoken(){
        $apptoken = request()-&gt;get(&#039;apptoken&#039;);

        // ホントはここで検証を行う

        // Graphのアクセストークンを代理フローで取得
        // https://docs.microsoft.com/ja-jp/azure/active-directory/develop/v2-oauth2-on-behalf-of-flow
        $client = new \GuzzleHttp\Client;

        $res = $client-&gt;request(
            &#039;POST&#039;,
            &#039;https://login.microsoftonline.com/common/oauth2/v2.0/token&#039;,
            [
                &#039;form_params&#039; =&gt; [
                    &#039;grant_type&#039; =&gt; &#039;urn:ietf:params:oauth:grant-type:jwt-bearer&#039;,
                    &#039;client_id&#039; =&gt; env(&#039;CLIENT_ID&#039;),
                    &#039;client_secret&#039; =&gt; env(&#039;CLIENT_SECRET&#039;),
                    &#039;assertion&#039; =&gt; $apptoken,
                    &#039;scope&#039; =&gt; env(&#039;SCOPE&#039;),
                    &#039;requested_token_use&#039; =&gt; &#039;on_behalf_of&#039;,
                ]
            ]
        );

        $list = json_decode($res-&gt;getBody()-&gt;getContents(), true);
        return $list;
    }</code></pre>
<p>検証をサボってますが、本番環境では検証、ちゃんとやってくださいね。<br />
この内容によって、代理フローを使用し、Microsoft Graphトークンを取得するわけです。</p>
<h1>まとめ</h1>
<p>長くなってしまいましたが、以上でSSOを使用したサンプルは完了します。<br />
今後実装を検討される方は、是非参考にしてみてください！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://develop.kajitori.co.jp/archives/36/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Officeアドイン】OfficeアドインでSSOを有効化し、ログインを1回のみにする[Preview版]</title>
		<link>https://develop.kajitori.co.jp/archives/34</link>
					<comments>https://develop.kajitori.co.jp/archives/34#respond</comments>
		
		<dc:creator><![CDATA[hsatou]]></dc:creator>
		<pubDate>Wed, 22 May 2019 11:56:46 +0000</pubDate>
				<category><![CDATA[Officeアドイン]]></category>
		<category><![CDATA[SSO]]></category>
		<guid isPermaLink="false">https://develop.kajitori.co.jp/?p=34</guid>

					<description><![CDATA[はじめに Officeアドインを開発時に気を付けなければいけない地雷まとめの「Officeのログイン者情報を、Officeアドインで取得することはできない」にも書いたのですが、Officeアドインの安定版では現在、「Of...]]></description>
										<content:encoded><![CDATA[<h1>はじめに</h1>
<p><a href="https://develop.kajitori.co.jp/?p=22">Officeアドインを開発時に気を付けなければいけない地雷まとめ</a>の「Officeのログイン者情報を、Officeアドインで取得することはできない」にも書いたのですが、Officeアドインの安定版では現在、「Officeにログインしているユーザー」を取得することはできません。<br />
<img decoding="async" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204834/ac1b3b4d-6691-8fcd-a5f9-f696395620f1.png" alt="画像" /><br />
どう考えても取れそうな「佐藤 裕」という情報が、残念ながら取得は出来ないのです。安定版では。  </p>
<p>そのため、もし「Officeアドインで、Office365のユーザー情報を取得してゴニョゴニョする」というアプリを検討していたとしても、ユーザーに再度ログインを強要する必要があります。<br />
これがクライアント版のOfficeならまだ良いのですが、Online版まで考えると本当に地獄。<br />
アプリがiframeで実装されているがゆえに、認証できず、dialogを表示する必要が出てしまいます。<br />
※これも<a href="https://develop.kajitori.co.jp/?p=22">Officeアドインを開発時に気を付けなければいけない地雷まとめ</a>の「認証が絡む場合、Office Onlineには本当に注意」を参照  </p>
<p>しかし、<b><span style="color: #ff0000">これがPreviewでは、一部できるようになります！</span></b><br />
Office系、それもAzure AD v2でのログインに限り、SSOとして、Officeのアプリにログインしている情報（正確にはアクセストークン）を取得できるようになるわけです。<br />
そのため、ユーザーはわざわざ2回目のログインを行う必要がなくなるわけですね。  </p>
<p>今回は、この「Office アドインのシングル サインオン」の概要をご紹介します。<br />
検証はまだなので、触りのみとなってしまうことをご了承ください。  </p>
<p><!-- more --></p>
<h1>概要</h1>
<p>基本的にはこちらの公式サイトをご参照ください。<br />
<a href="https://docs.microsoft.com/ja-jp/office/dev/add-ins/develop/sso-in-office-add-ins">https://docs.microsoft.com/ja-jp/office/dev/add-ins/develop/sso-in-office-add-ins</a><br />
キーポイントをかいつまんで解説します。  </p>
<h3>流れ</h3>
<p><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2019/05/20190522000532-300x251.png" alt="" /><br />
※引用：<a href="https://docs.microsoft.com/ja-jp/office/dev/add-ins/develop/sso-in-office-add-ins">https://docs.microsoft.com/ja-jp/office/dev/add-ins/develop/sso-in-office-add-ins</a></p>
<p>ざっくり流れをまとめると、以下のとおりです。</p>
<ul>
<li>
<p>Officeアプリ(各開発者が開発するWebアプリ)内のjsファイルで、getAccessTokenAsync関数を実行する</p>
</li>
<li>
<p>getAccessTokenAsync内の処理で、Officeプログラム（ExcelやWordの本体）に、現在ログインしているユーザー情報を取得するよう要求する</p>
</li>
<li>
<p>Officeプログラムにログインしていない場合、ログインするようユーザーに要求するダイアログを表示する</p>
</li>
<li>
<p>Officeプログラムは、Azure AD v2エンドポイントから、現在のユーザーの<strong>アドイン トークン</strong>を取得する</p>
</li>
<li>
<p>Officeプログラムから、getAccessTokenAsync関数の処理として、Officeアプリに、アドイントークンを返却する<br />
→アドイントークン(JWT)を解析して、ログインユーザーのメールアドレスなどを取得する  </p>
</li>
</ul>
<p>ユーザー情報などを取得するのみであれば、ここまでで処理は終了なのですが、Microsoft Graphなども絡める場合、以下の処理も必要になります。  </p>
<ul>
<li>
<p>Officeアプリから、サーバーサイドにアドイントークンを送信する</p>
</li>
<li>
<p>サーバーサイドで、Microsoft Graphなどで使用できるアクセストークンを取得し、Officeアプリに返却する</p>
</li>
</ul>
<p>このような処理になります。</p>
<h3>注意点</h3>
<p>ここからは、現在分かっている注意点を記載します。やはり地雷は多し。</p>
<h4>Office Insiderに参加が必要</h4>
<p>2019/05/21現在、プレビュー版のみ対応であるため、「Office Insider」に参加する必要があります。<br />
参加した上で、プレビュー版のOfficeをインストールする必要があります。</p>
<h4>Office2013や2016には非対応</h4>
<p>これがとっても大事ですね。<br />
SSOは「IdentityAPI」という要件セットが必要で、これは<strong><span style="color: #ff0000">Office2013や2016は非対応です。</span></strong>恐らく今後も。<br />
なので、このSSOを対応させるのであれば、2013や2016を切り捨てる必要がありますね。</p>
<h4>サーバーサイドの実装が必要</h4>
<p>これは実際のサンプルコードで実装した時に解説予定なのですが、Microsoft Graphなどのトークンを活用したい場合には、サーバーサイドの実装が必要になります。<br />
通常のhtmlとjavascriptだけのアプリを開発しよう！と思っても、それはNGなんですね。vueとかReactとかも多分NG。  </p>
<p>今回取得できるトークンは、あくまでも「アドイントークン」で、Microsoft Graphのアクセストークンではありません。<br />
Microsoft Graphのアクセストークンを取得する際には、別途サーバーサイドの処理が必要、ということを覚えておいてください。  </p>
<h1>まとめ</h1>
<p>このように、どうしても限定的な範囲にはなってしまいますので、これはOfficeストアのような全体公開向けのアプリではなく、組織内でのアプリの方が向いているかもしれないですね。<br />
また、現在はプレビュー版なので、いずれにせよ正式版に採用は難しいです。  </p>
<p>それでもメリットは十分にあります。Office365前提のアプリであれば、非常に便利な機能になることは間違いないです。  </p>
<p>実装の検証と、具体的な解説は次回行う予定です。ぜひお待ちください。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://develop.kajitori.co.jp/archives/34/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Officeアドインを開発時に気を付けなければいけない地雷まとめ</title>
		<link>https://develop.kajitori.co.jp/archives/22</link>
					<comments>https://develop.kajitori.co.jp/archives/22#respond</comments>
		
		<dc:creator><![CDATA[hsatou]]></dc:creator>
		<pubDate>Mon, 15 Apr 2019 11:48:01 +0000</pubDate>
				<category><![CDATA[Officeアドイン]]></category>
		<category><![CDATA[iframe]]></category>
		<category><![CDATA[PICKUP]]></category>
		<category><![CDATA[地雷]]></category>
		<guid isPermaLink="false">https://develop.kajitori.co.jp/?p=22</guid>

					<description><![CDATA[はじめに 「Officeアドイン」は、ざっくり言うとOffice上で動作するWebアプリケーションです。 Office2013から登場し、Office2016、Office365(クライアント版)、Office365(W...]]></description>
										<content:encoded><![CDATA[<h1>はじめに</h1>
<p>「Officeアドイン」は、ざっくり言うとOffice上で動作するWebアプリケーションです。<br />
Office2013から登場し、Office2016、Office365(クライアント版)、Office365(Web版)など、様々なOfficeで動作します。</p>
<img decoding="async" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204834/b6feaee7-d18b-413a-88c8-c658a536d416.png" alt="image.png" />
<p>Officeアドインは2013年頃に登場し、細々と機能追加を繰り返してきました。<br />
しかし、いかんせんノウハウと情報が少ないです。<br />
そしてこの技術を使えるエンジニアの方も非常に少ないので、なかなか広まらないのも事実です。<br />
「Officeアドイン」と日本語で検索すると、MS公式か、ほとんどが自分の発信な気がしてます・・・笑<br />
（先日、「officeアドイン」で検索したら、<strong>MS公式ページより先に、自分の過去の発信が上位に出てきました笑</strong>）</p>
<p>そしてもう一つ。<br />
このOfficeアドインは、いかんせん情報が少ないこともあり、いざやってみると、意外なところで詰まってしまう「<strong>地雷</strong>」が多いです。<br />
そこで今回は、幾多の案件を行ってきて、この地雷に立ち向かってきた自分が、「<strong>Officeアドインで気を付けなければいけないところ</strong>」についてまとめます。<br />
今後、もしOfficeアドインを案件や自社開発などで使用することを検討している方は、まずこの記事を読んでいただいて、事前に検証いただけることをオススメします。</p>
<h1>地雷まとめ</h1>
<h2>Officeの種類によって、出来ることがぜんぜん違う</h2>
<p>OfficeアドインはOffice2013から登場した、ということは上記で説明しました。<br />
そこからOffice2016、Office365(クライアント版)、Office365(Web版)と増えてくるにつれて、出来る機能も増えてきました。<br />
ですが、<strong>その出来る機能が、すべてのOfficeで使えるものではありません。</strong></p>
<p>例えば「アドインコマンド」。これはOfficeのメニューにコマンドを追加するという機能です。<br />
あらかじめアドインを設定しておけば、以降わざわざOfficeアドインを選択しなくても、メニューボタンをクリックするだけでアドインを実行できます。<br />
<img decoding="async" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204834/8ee7f3f9-9fd1-1cb3-5f21-f6f432b337a9.png" alt="image.png" /></p>
<p>※引用：(<a href="https://docs.microsoft.com/ja-jp/office/dev/add-ins/design/add-in-commands">https://docs.microsoft.com/ja-jp/office/dev/add-ins/design/add-in-commands</a>)</p>
<p>しかし、この機能はOffice2013とOffice2016では動作しません（ただしOutlook2016のみOK）。<br />
こちらに<a href="https://docs.microsoft.com/en-us/office/dev/add-ins/reference/requirement-sets/add-in-commands-requirement-sets">アドイン コマンドの要件セット</a>というページがあるのですが、ここでアドインコマンドは、Office2013と2016は「N/A」や「16.0.4678.1000 Supported in Outlook only」となっています。<br />
つまり非対応ですね。<br />
最新のOfficeだけで合わせると、「これ出来なかったのか」という事故につながるので、気をつける必要があります。</p>
<p>なお、各Officeで出来ること、出来ないことは、以下のページをご参照ください。<br />
<a href="https://docs.microsoft.com/en-us/office/dev/add-ins/reference/requirement-sets/office-add-in-requirement-sets">Office Common API requirement sets</a></p>
<h2>Officeのログイン者情報を、Officeアドインで取得することはできない</h2>
<p>Office2013から、Officeにログインを行うことができます。<br />
<img decoding="async" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204834/ac1b3b4d-6691-8fcd-a5f9-f696395620f1.png" alt="image.png" /></p>
<p>なのでOfficeアドインを始める際、「このログイン情報を取得しよう」と誰もが思うでしょう。このログイン情報からアクセストークンを取得し、ゴニョゴニョしよう、ということです。<br />
ですが、<strong>このOfficeの情報を、Officeアドインでは取得することが、現在は出来ません。</strong><br />
なので、ユーザーのOffice365の情報を絡めたアプリを作成する場合、ユーザーは再度、サインインページを表示する必要があります。</p>
<p>なお正確に言うと、2019/04/13現在、上記機能はプレビュー版です。<a href="https://docs.microsoft.com/en-us/office/dev/add-ins/reference/requirement-sets/identity-api-requirement-sets">Identity API</a>という名前で、現在プレビュー版ということで実装しているようです。<br />
ただし、それでもやはり「Office 2013 or later for Windows」では「N/A」になっているので、いずれにせよOffice2013と2016は切り捨てて実装しなければなりません。</p>
<h2>認証が絡む場合、Office Onlineには本当に注意</h2>
<p>クライアント版のOfficeアドインが、Office Onlineでも動作すると思っていると、確実に失敗します。<br />
なぜなら、クライアント版のOfficeアドインと、Office OnlineのOfficeアドインは、作られ方がぜんぜん違うからです。</p>
<p>クライアント版のOfficeアドインは、ざっくり言うとアプリ内で、ブラウザ（IE）を立ち上げるような形式に対し、<br />
<strong>Office OnlineのOfficeアドインは、iframeで起動します。</strong></p>
<p>もし、サードパーティ(GoogleやOffice365やGitHubなど)のアクセストークンを使用して、サードパーティの情報を使用したアプリを開発しようと考えた場合。<br />
iframeなので、つまりサードパーティ(GoogleやOffice365やGitHubなど)のログイン画面などは、パネル内で表示されないことになります。</p>
<p>一方で、クライアント版では普通に表示されます。<br />
なので、最初にクライアント版でログイン画面が表示され、よしこのままOnline版もやっちゃおう！となった場合、<br />
このことを知らないと、Office Onlineでは確実にエラーになってしまいます。</p>
<h2>回避方法もあるが、IEで以上に面倒なことになる</h2>
<p>これを回避するために、<a href="https://github.com/OfficeDev/office-js-helpers">office-js-helpers</a>という仕組みも用意されています。<br />
これは、ログイン画面をOfficeアドイン内ではなく、ダイアログを起動してログイン画面を表示する仕組みです。<br />
<img decoding="async" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204834/c5ba9332-cd91-22e4-0772-1fd9914d7d15.png" alt="image.png" /><br />
上記のように、アドインとは別のダイアログを起動します。<br />
未ログインの状況であれば、そのままログイン画面が表示され、IDパスワードを入力し、ログイン完了したら、ダイアログを自動で閉じて、アドイン側にトークンを受け渡す、という仕組みです。<br />
ダイアログ内で表示するので、iframeの制約にも引っかかることなく、ログインを行うことができます。</p>
<p>これを使えばいいじゃないか、と思うかもしれませんが、今度はIEの場合で、「<strong>信頼済みサイト</strong>」の問題が出てきます。<br />
「信頼済みサイト」の問題とは、簡単にいうと「<strong>ブラウザ内のすべてのサイトを、同一のセキュリティゾーンに入れなければいけない</strong>」、という制約です。</p>
<p>例えば、Office365にログインを行ってアクセストークンを取得し、Office365の情報を取得するようなアプリを考える場合。<br />
この場合、以下のページの信頼済みサイトを揃える必要があります。<br />
「Office OnlineのSharePointサイト」（<a href="https://foobar.sharepoint.com">https://foobar.sharepoint.com</a>）<br />
「アドインの本体のサイト」（<a href="https://foobar1234567.azurewebsites.net">https://foobar1234567.azurewebsites.net</a>）<br />
「Office365ログインページ」(<a href="https://login.microsoftonline.com">https://login.microsoftonline.com</a>)<br />
<img decoding="async" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204834/73238fc0-0c3b-7a33-6477-fef1f7725377.png" alt="image.png" /></p>
<p>「揃える」とはすなわち、<br />
「<strong>すべて信頼済みサイトに入れる</strong>」か、「<strong>すべて信頼済みサイトに入れない</strong>」の、どちらかです。<br />
これが揃っていないと、エラーが発生します。</p>
<p>そしてこれが厄介なのが、<strong>『いつの間にか、Office OnlineのSharePointサイトが追加されていることがある』</strong>ということです。<br />
Office365をいじっているときなのか、クライアント版のOfficeにアプリのURLを追加した場合なのかは分かりませんが、気付いたらこのSharePointサイトが信頼済みサイトに追加されているときがあります。<br />
そうなると、アプリが起動できなくなります。その場合には、残りのサイトを追加する必要があります。</p>
<p>そして、<strong>この一連の流れを、アプリを利用する利用者にやってもらわなければなりません。</strong><br />
会社でポリシー配布などを行っていればいいですが、そうでない場合でIEで実行を行う場合に、すべての利用者に、この信頼済みサイトの追加をやってもらわなければなりません。・・・まあ、超面倒ですね。<br />
対策としては、「IEをサポートから切り捨てる」というのも有りかもしれないですね笑</p>
<h2>Windows10のIE11で、データのやり取りが正常に動作しない場合がある</h2>
<p>上記のダイアログ形式で、アクセストークンのやり取りをするわけですが、<strong>ここまでやっても、正常に動作しないことがあります。</strong><br />
それはどうも、Windows10の、一定時期より古いIE11だと、正常に動作しないようです。<br />
かんたんに調査してみたでのすが、</p>
<ul>
<li>ダイアログ同士のデータのやり取りは、標準ではjavascriptのpostMessageで行う</li>
<li>だが、IEではpostMessageに対応していないので、localStorageの監視によりデータをやり取りしている</li>
<li>だがだが、Windows10のIE11だと、上記の「IEかどうか」という条件が正常にしておらず、うまく動かない（Office.jsのバグ？）</li>
<li>そのため結果的に、一部のWindows10のIE11だと動作しない</li>
</ul>
<p>ということで、Windows10のIE11だと、うまく動かないことがあるようです。<br />
なので、最終的な結論としては、Online版は<strong>IE非推奨</strong>にしてしまうのが一番ですね。（切実）</p>
<h1>まとめ</h1>
<p>Officeアドインはどうにも伸び悩んでいます。<br />
その背景は多々ありますが、一つはこの地雷の多さにあると、私は思っています。<br />
それでも、Officeアドインで開発する！という事になった場合、まずはこの記事を読んでいただき、どんな地雷があるかどうか、知ってもらえると嬉しいです。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://develop.kajitori.co.jp/archives/22/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Officeアドイン】設定値を保存する2つの方法</title>
		<link>https://develop.kajitori.co.jp/archives/32</link>
					<comments>https://develop.kajitori.co.jp/archives/32#respond</comments>
		
		<dc:creator><![CDATA[hsatou]]></dc:creator>
		<pubDate>Mon, 10 Sep 2018 11:55:48 +0000</pubDate>
				<category><![CDATA[Officeアドイン]]></category>
		<guid isPermaLink="false">https://develop.kajitori.co.jp/?p=32</guid>

					<description><![CDATA[■はじめに Officeアドインで、設定値を保存したい場合。 例えば、アプリの表示言語を変更・設定できるようにしたい場合、 設定値を保持することが出来れば、アプリを再起動した場合でもわざわざ再設定する必要が無くなって便利...]]></description>
										<content:encoded><![CDATA[<h2>■はじめに</h2>
<p>Officeアドインで、設定値を保存したい場合。<br />
例えば、アプリの表示言語を変更・設定できるようにしたい場合、 設定値を保持することが出来れば、アプリを再起動した場合でもわざわざ再設定する必要が無くなって便利ですね。<br />
<a href="https://develop.kajitori.co.jp/wp-content/uploads/2016/06/1.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2016/06/1-768x339.png" alt="1" /></a></p>
<p>このような機能を実装したい場合、果たしてどのように開発すればいいでしょうか？<br />
その方法について、実は2つの方法があります。<br />
その2つの方法はどのようなものか？ その使い分けも含め、今回はその開発方法について解説します。 </p>
<h2>■解説</h2>
<p>上記でも記載した通り、Officeアドインで設定値を保存する方法は主に2つあります。<br />
それぞれメリット・デメリットあるので、それぞれ見てみましょう。 　</p>
<h3>①Officeアドインの関数&quot;Settings.set&quot;を使用する</h3>
<p>&quot;Office.context.document.settings.set&quot;というメソッドを使用することで、 Officeのドキュメントに名前/値のペアとして設定値を格納します。<br />
参考：<a href="https://msdn.microsoft.com/ja-jp/library/office/fp161063.aspx">https://msdn.microsoft.com/ja-jp/library/office/fp161063.aspx</a> </p>
<p>イメージとしては、<span class="font-red">Officeファイルに</span>名前/値のペアとして設定値を格納することになります。<br />
<a href="https://develop.kajitori.co.jp/wp-content/uploads/2016/06/2.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2016/06/2-768x419.png" alt="2" /></a> </p>
<p>Officeファイルに格納するので、<span class="font-red">保存時とは別のOfficeファイルを開いた場合は、その設定値を読み込むことは出来ません</span>。別の値として扱われます。<br />
<a href="https://develop.kajitori.co.jp/wp-content/uploads/2016/06/3.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2016/06/3-768x281.png" alt="3" /></a></p>
<p>一方で、<span class="font-red">別ユーザーが同じファイルを読み込んだ場合は、すでに保存済みの設定値を読み込むことができます</span>。<br />
これはファイルそのものに設定値を書き込みしているので、どのユーザーが開いても同じ設定値を利用することが出来るのです。<br />
<a href="https://develop.kajitori.co.jp/wp-content/uploads/2016/06/4.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2016/06/4-768x253.png" alt="4" /></a></p>
<h3>②HTML5の機能&quot;LocalStorage&quot;を使用する</h3>
<p>LocalStorageは、HTML5で新たに追加された機能です。<br />
ブラウザ側に名前/値のペアとして設定値を格納する事ができます。<br />
<a href="http://wp.tech-style.info/archives/742">http://wp.tech-style.info/archives/742</a><br />
<a href="https://develop.kajitori.co.jp/wp-content/uploads/2016/06/5.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2016/06/5.png" alt="5" /></a> </p>
<p>「OfficeなのにHTML5の機能を利用できるの？」と思う方もいるかもしれませんが、 OfficeアドインはれっきとしたWebアプリケーションなので、問題なくLocalStorageを使用できます。<br />
OfficeアドインでLocalStorageを使用した場合、そのアプリ内では共通して同じ値として管理されます。<br />
つまり、<span class="font-red">別のOfficeドキュメントでアプリを起動した場合でも、同じ設定値を保存・読込することが出来ます</span>。わざわざ保存し直す必要がなくて便利ですね。<br />
<a href="https://develop.kajitori.co.jp/wp-content/uploads/2016/06/6.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2016/06/6-768x258.png" alt="6" /></a></p>
<p>しかし、別ユーザーが同じファイルを開いたとしても、同じ設定値を使用することは出来ません。 そこはご注意下さい。<br />
<a href="https://develop.kajitori.co.jp/wp-content/uploads/2016/06/7.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2016/06/7-768x235.png" alt="7" /></a></p>
<h3>③結局どっちがいいの？</h3>
<p>ぶっちゃけ用途によります。 以下、簡単にまとめてみました。</p>
<p>※Settings.set関数<br />
・ドキュメントに設定値を格納する<br />
・同じファイルを開いた場合、どのユーザーであっても同じ設定値を保存・読み込むことができる<br />
・別のファイルを使用した場合、設定値は共有されない<br />
・Excelセルに記載された金額・人物名など、各Officeファイルに紐付いた値を保持しておきたい場合におすすめ </p>
<p>※LocalStorage<br />
・ブラウザに設定値を格納する<br />
・保存時とは別のファイルを開いた場合でも、設定値を共有することができる<br />
・別のユーザーが保存時のファイルを開いた場合、設定値は共有されない<br />
・アプリの表示言語など、実行したユーザーごとに異なる設定を保持しておきたい場合におすすめ </p>
<p>開発したいアプリの用途によって使い分けることをおすすめします。 もちろん両方使用することもアリでしょう！ あなたの開発にお役立て下さい。</p>
<h2>■おわりに（自己紹介）</h2>
<p>まだまだマイナーながら、無限の可能性を秘めた「Officeアドイン」の解説記事を少しずつ執筆しています。<br />
もっと詳しく知りたい！といったことや、この内容を解説して欲しい！ということがありましたら、 コメントなどにてお気軽にご連絡ください。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://develop.kajitori.co.jp/archives/32/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Facebookアプリの個人情報提供のリスクについて</title>
		<link>https://develop.kajitori.co.jp/archives/100</link>
					<comments>https://develop.kajitori.co.jp/archives/100#respond</comments>
		
		<dc:creator><![CDATA[hsatou]]></dc:creator>
		<pubDate>Sun, 02 Sep 2018 13:03:54 +0000</pubDate>
				<category><![CDATA[その他技術]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[OAuth]]></category>
		<guid isPermaLink="false">https://develop.kajitori.co.jp/?p=100</guid>

					<description><![CDATA[はじめに 前回の記事で、Facebookアプリの仕組みと、そのリスクや、巷で言われていることの真偽を記載しました。 https://develop.kajitori.co.jp/?p=97 その中で特に言いたかったのは、...]]></description>
										<content:encoded><![CDATA[<h2 class="h_midashi">はじめに</h2>
<p>前回の記事で、Facebookアプリの仕組みと、そのリスクや、巷で言われていることの真偽を記載しました。<br />
<a href="https://develop.kajitori.co.jp/?p=97">https://develop.kajitori.co.jp/?p=97</a></p>
<p>その中で特に言いたかったのは、</p>
<ul>
<li>Facebookアプリを使っても、アカウントが乗っ取られることはない</li>
<li>Facebookアプリが、アプリを使用していない別の友だちの情報を取得することはできない<br />
といったことです。</li>
</ul>
<p>なので、「Facebookアプリを使用すると、パスワード流出して乗っ取られるよ」「友だちの情報を守るためにFacebookアプリを使用するな」といった記事が散見されますが、<br />
そのような記事は<strong>盛り過ぎ</strong>なのでご注意ください。<br />
※ただし、アプリからタイムラインに投稿されるリスクはあります。それは前回の記事参照</p>
<p>しかし、個人情報提供のリスクについては、注意が必要です。<br />
巷では、すでにアプリを使用している方に対し、「対策はアプリの削除」というものがあると言われています。<br />
しかし、<strong>それだけでは済まない、非常に重要なリスクがあります。</strong>それは、「後でアプリ削除すればいいや」では済まない問題です。<br />
今回はその点を解説します。いつものように技術的な観点も含みます。<br />
結論だけまとめた分かりやすい記事は、誰かにお任せします笑</p>
<h2 class="h_midashi">先に結論を書くと(最低限これだけ)</h2>
<ul>
<li>Facebookアプリを使用した場合の対策として、Facebookから「アプリの削除」を行うというものがあるが、それはあくまでも、「新しくFacebookから情報を取得できない」ということだけ</li>
<li>一度でもアプリを使用すると、それだけでアプリの開発者（業者など）に個人情報を渡す</li>
<li>そして、その個人情報は永続的に保管される可能性がある</li>
<li>それが嫌な人は、やはりアプリを使用しないのが吉</li>
<li>ただ、Facebookアプリは実は浸透しているので、どのアプリを使用するか、必ず吟味すること</li>
</ul>
<h2 class="h_midashi">データベースについて(システム的なお話)</h2>
<p>Facebookアプリをはじめ、一般的なシステムでは、「データベース」と呼ばれる仕組みを備えています。<br />
データベースとは、ざっくりいうと「情報を貯めて、情報の検索や更新などに使用するための仕組み」のことです。</p>
<p>例えばTwitterだと、<br />
・TwitterのユーザーのIDやメールアドレス、表示名<br />
・つぶやいた日時、投稿<br />
・つぶやきの「いいね」や「リツイート」<br />
などは、すべて「データベース」とよばれる仕組みに蓄積され、WebページやTwitterアプリで使用されます。</p>
<p><a href="https://develop.kajitori.co.jp/wp-content/uploads/2018/09/capture_20180830193646.png"><img fetchpriority="high" decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2018/09/capture_20180830193646-768x180.png" alt="" width="768" height="180" class="alignnone size-large wp-image-598"></a></p>
<p>他の例としては、ソシャゲのパズドラで、<br />
・パズドラのユーザー情報<br />
・所有しているモンスター情報<br />
・ダンジョン攻略情報<br />
などもすべて、データベースに保持しています。（※パズドラあんまり詳しくないです）</p>
<p>このように、システムを構築する際には切っても切れない仕組み、それがデータベースです。</p>
<p>では、Facebookアプリではどのように、データベースを使用しているのでしょうか？<br />
※それぞれのFacebookアプリで使われ方は違いますので、あくまでも「こう使われているかも、可能性がある」というニュアンスで読んでください。すべてのFacebookアプリがこの例ではありません。</p>
<p>まずは、ログインユーザーごとの「アクセストークン」を保存しています。<br />
アクセストークンは、前回も記載したように「Facebookからユーザー情報などを取得する際に使用する文字列」のことです。<br />
※詳しくは前回参照</p>
<p><a href="https://develop.kajitori.co.jp/wp-content/uploads/2018/08/capture_20180830193640.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2018/08/capture_20180830193640-768x340.png" alt="" width="768" height="340" class="alignnone size-large wp-image-567"></a></p>
<p>このトークンを保存しておくことで、今後ユーザーが再ログインしなくても、Facebookからユーザー情報などを取得することが出来るようになります。<br />
ユーザーはわざわざFacebookにログインする必要がなく、アプリを使用できるようになるので、結構便利です。</p>
<p>そして、こっからが非常に重要なのですが、<strong>Facebookから取得したユーザー情報、すなわちidや名前など公開情報を、データベースに保存しています。</strong><br />
これはアプリ内で、名前などを表示するために使用しています。</p>
<p><a href="https://develop.kajitori.co.jp/wp-content/uploads/2018/09/capture_20180830193647.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2018/09/capture_20180830193647-768x186.png" alt="" width="768" height="186" class="alignnone size-large wp-image-599"></a></p>
<h2 class="h_midashi">Facebookアプリの対策「アプリの削除」について</h2>
<p>診断系Facebookアプリの危険性を謳っているサイトで、対策としてだいたい書いているのが、「アプリの削除をする」です。<br />
具体的には、Facebookの設定画面の「アプリとウェブサイト」から、該当するアプリを削除することです。</p>
<p><a href="https://develop.kajitori.co.jp/wp-content/uploads/2018/09/capture_20180830193644.png"><img loading="lazy" decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2018/09/capture_20180830193644-768x296.png" alt="" width="768" height="296" class="alignnone size-large wp-image-600"></a><br />
<a href="https://www.facebook.com/help/204306713029340"><a href="https://www.facebook.com/help/204306713029340">https://www.facebook.com/help/204306713029340</a></a></p>
<p>不審なアプリがあったとして、この手順は正しいです。この手順を行うとどうなるかを解説します。</p>
<p>アプリを削除すると、Facebookアプリがアクセストークンを使って、Facebookから情報を取得することが出来なくなります。</p>
<p><a href="https://develop.kajitori.co.jp/wp-content/uploads/2018/08/capture_20180830193640.png"><img decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2018/08/capture_20180830193640-768x340.png" alt="" width="768" height="340" class="alignnone size-large wp-image-567"></a></p>
<p><a href="https://develop.kajitori.co.jp/wp-content/uploads/2018/09/capture_20180830193648.png"><img loading="lazy" decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2018/09/capture_20180830193648-768x253.png" alt="" width="768" height="253" class="alignnone size-large wp-image-601"></a></p>
<p>他にも、Facebook設定からアプリを削除することで、<strong>Facebookアプリがタイムラインに、投稿を行うことも出来なくなります。</strong><br />
そのため、不審なアプリを設定から削除するというのは、間違いなく必要な手順です。</p>
<p>ですが、ここで大きな落とし穴があります。<br />
先ほど、各Facebookアプリでは、データベースという仕組みで、個人情報などを保存している、という話をしました。<br />
ですが、<strong>Facebook設定からアプリを削除しても、このFacebookアプリのデータベースから、あなたの個人情報が削除されることはありません。</strong><br />
あくまでも、「新しく」Facebookの情報をアプリが取得できないだけで、<br />
<span class="font-bold font-red">データベースに保存済みのデータは削除されることはなく、永続的に保存されたままです。</span></p>
<p>ネガティブに言い方を変えると、<br />
<span class="font-bold font-red">Facebookアプリで「Facebookにログイン」をし、アプリにログインを行った時点で、その後設定からアプリを削除したとしても、<span class="font-large">あなたの情報は業者のデータベースに、ずっと保存されたままになります。</span></span></p>
<p>もしアプリの開発者が、非常に悪徳な業者であった場合、このデータベースに保存した情報をもとに、おそらく悪いことをしていくことになるでしょう。<br />
スパムメールを送ったり、・・・その他色々なことが起きてしまいます。</p>
<p><a href="https://develop.kajitori.co.jp/wp-content/uploads/2018/08/capture_20180830193636.png"><img loading="lazy" decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2018/08/capture_20180830193636-701x768.png" alt="" width="701" height="768" class="alignnone size-large wp-image-563"></a></p>
<p>仮にこんなアプリに、一度でもログインしてしまったら、<br />
あなたの氏名も誕生日も、出身地も写真も動画も性別もタイムラインも年齢層も、すべて・・・ずっと保存されたままです。<br />
非常に非常に危険ですね。</p>
<h2 class="h_midashi">対策</h2>
<p>確かに、アプリ利用による乗っ取りは起きません。<br />
そして、アプリを利用していない友達の情報を、アプリが取得することも出来ません。なので関係ない人に迷惑をかけることもありません。</p>
<p>しかし、この「アプリに個人情報を渡す仕組みやリスク」については、重々承知する必要があります。</p>
<p>この対策ですが、適切かつ明確なのが、<br />
<strong>アプリを利用しない</strong><br />
というのが一番です。</p>
<p>ですが、このFacebookアプリの仕組み、実は意外と色んなところで使われています。<br />
例えば前回紹介した「キャンディークラッシュ」。</p>
<p><a href="https://develop.kajitori.co.jp/wp-content/uploads/2018/08/2018-08-30-21.59.43.jpg"><img loading="lazy" decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2018/08/2018-08-30-21.59.43-374x768.jpg" alt="" width="374" height="768" class="alignnone size-large wp-image-557"></a></p>
<p>これもFacebookの友達情報と連携して、アプリに活用しています。<br />
なので、厳密に言えばこのようなアプリも使用できなくなります。</p>
<p>他にも、グルメ系の投稿サイト「Retty」も、Facebookログインを用意しています。</p>
<p><a href="https://develop.kajitori.co.jp/wp-content/uploads/2018/09/capture_20180830193645.png"><img loading="lazy" decoding="async" src="https://develop.kajitori.co.jp/wp-content/uploads/2018/09/capture_20180830193645-768x364.png" alt="" width="768" height="364" class="alignnone size-large wp-image-602"></a></p>
<p>このサイトを利用する場合、このRettyにも、他のアプリと同様に情報を提供することになるので、ログインできなくなっちゃいます。</p>
<p>すなわち何が言いたいかと言うと、このFacebookアプリの仕組み、すでに世の中で色んな所で使われているわけです。<br />
もし、本当にこれらを使わない、となると、けっこう不自由を受ける可能性があります。<br />
悪いのは悪徳な業者です。真っ当な会社やシステムであれば、本来であればアプリを利用しても問題ないはずです。</p>
<p>なので大切なことは、<br />
<strong>・どのアプリを使用するかどうかを、必ず吟味すること。情報を提供する先の会社はどんな業者かを必ず確認すること<br />
・Facebookアプリにログインする前に、「受け取る情報」がどうなっているかを必ず確認すること<br />
・一度でもアプリにログインを行ったら、その後アプリを削除したとしても、情報はアプリに渡っていることを理解すること<br />
<span class="font-red">・すべては自己責任</span></strong><br />
ということです。</p>
<h2 class="h_midashi">結論</h2>
<p><span class="font-red font-large font-bold">不安だったら利用しない<br />
すべては自己責任と理解した人だけアプリを使用すべし</span></p>
]]></content:encoded>
					
					<wfw:commentRss>https://develop.kajitori.co.jp/archives/100/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>診断系のFacebookアプリは危険！？Facebookアプリの仕組みについて解説(2018年版)</title>
		<link>https://develop.kajitori.co.jp/archives/97</link>
					<comments>https://develop.kajitori.co.jp/archives/97#respond</comments>
		
		<dc:creator><![CDATA[hsatou]]></dc:creator>
		<pubDate>Thu, 30 Aug 2018 13:00:32 +0000</pubDate>
				<category><![CDATA[その他技術]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[PICKUP]]></category>
		<guid isPermaLink="false">https://develop.kajitori.co.jp/?p=97</guid>

					<description><![CDATA[はじめに 最近、筆者の周りで 「Facebookの診断系アプリは危険」 「あらゆる個人情報を、業者に渡すことになる」 「やってしまうと、Facebook乗っ取られたり、投稿」 「やってしまった方は、今すぐパスワードを変更...]]></description>
										<content:encoded><![CDATA[<style type="text/css">
.h_midashi, .h_midashi2{<br />
    margin-top: 3em;<br />
}<br />
</style>
<h2 class="h_midashi">はじめに</h2>
<p>最近、筆者の周りで<br />
「Facebookの診断系アプリは危険」<br />
「あらゆる個人情報を、業者に渡すことになる」<br />
「やってしまうと、Facebook乗っ取られたり、投稿」<br />
「やってしまった方は、今すぐパスワードを変更して二段階認証を設定するべき」<br />
という話が上がっていました。</p>
<p>Facebookの診断系アプリというと、例えば今だと以下のようなものです。</p>
<p><a href="https://hirossyi.net/wp-content/uploads/2018/08/capture_20180830192756.png"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-555" src="https://hirossyi.net/wp-content/uploads/2018/08/capture_20180830192756-768x670.png" alt="" width="768" height="670"></a></p>
<p>これ系のアプリの診断結果は、ちょいちょいFacebookのフィードにも上がってきますね。</p>
<p>これらのアプリをあまりやらないほうがいいのは、筆者も同意見です。<br />
ですが、「ものすごく危険」「やると乗っ取られる」といったこととは、事実と若干異なる部分があります。</p>
<p>そこで今回は、</p>
<ul>
<li>Facebookアプリとはそもそもなにか</li>
<li>どのような情報を取得しているか</li>
<li>どのような仕組みなのか</li>
<li>巷で言われていることの事実・間違いの切り分け</li>
</ul>
<p>を、可能な限りシステム疎い方でも分かるように、頑張って解説していこうと思います！</p>
<p>※個人の見解を含みます。また間違いや情報の更新などございましたら、ご指摘いただければ幸いです。</p>
<p><span id="more-97"></span></p>
<h2 class="h_midashi">先に結論を書くと(最低限これだけ)</h2>
<ul>
<li>Facebookアプリはパスワードを盗めないから乗っ取りも出来ないから安心しろ</li>
<li>あなたの友達がどんなアプリを使用していても、あなたには影響がない</li>
<li>ただし、アプリの設定によっては「あなたに代わって投稿」は出来ちゃうから、そこだけ注意</li>
<li>また、アプリの設定によっては「個人情報を不必要に悪用」されるリスクはある</li>
<li>100％安全というわけではないので、アプリ使用時の設定を必ず確認し、自己責任で使用すること</li>
</ul>
<h2 class="h_midashi">Facebookアプリとは？</h2>
<p>ざっくり言うと、Facebookの情報を使用したアプリすべてです。<br />
それはWebサイトの場合も、スマホのアプリの場合もあります。</p>
<p>例えば、前述したWebサイトの「nametests.com」は、典型的なFacebookアプリです。<br />
<a href="https://ja.nametests.com/"><a href="https://ja.nametests.com/">https://ja.nametests.com/</a></a><br />
<a href="https://hirossyi.net/wp-content/uploads/2018/08/capture_20180830193633.png"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-556" src="https://hirossyi.net/wp-content/uploads/2018/08/capture_20180830193633-768x536.png" alt="" width="768" height="536"></a></p>
<p>Facebookの情報を使用して、診断や占いなど行うものですね。</p>
<p>一方で、スマホのアプリでも、Facebookの情報を使用しているものがあります。<br />
例えば、一時期筆者もやっておりました「キャンディークラッシュ」。<br />
これはアプリの設定で、「Facebookでログイン」という表記がされています。<br />
<a href="https://hirossyi.net/wp-content/uploads/2018/08/2018-08-30-21.59.43.jpg"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-557" src="https://hirossyi.net/wp-content/uploads/2018/08/2018-08-30-21.59.43-374x768.jpg" alt="" width="374" height="768"></a></p>
<p>よくある診断系だけでなく、このようなスマホのアプリも、立派なFacebookアプリです。</p>
<p>そして、そのFacebookアプリをユーザーがはじめて使用するとき、このような表示がされます。</p>
<p><a href="https://hirossyi.net/wp-content/uploads/2018/08/capture_20180830193634.png"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-558" src="https://hirossyi.net/wp-content/uploads/2018/08/capture_20180830193634-750x768.png" alt="" width="750" height="768"></a></p>
<p>よく見るやつですね。<br />
そして、「裕としてログイン」をクリックすることで、アプリ（写真の場合はnametests.com）が、ユーザーの情報を取得することができるわけです。</p>
<h2 class="h_midashi">Facebookアプリの仕組み</h2>
<p>さて、ここからはFacebookアプリの仕組みを、簡単に解説します。<br />
順を追って解説していきますね。</p>
<h3 class="h_midashi2">開発者がFacebookアプリを作る時</h3>
<p>開発者がFacebookアプリを開発する際、「このアプリは、Facebookのどの情報を取得するか？」という情報を、開発者はあらかじめ設定しておきます。<br />
例えば、</p>
<p>・ユーザーのEメールアドレス<br />
・ユーザーの写真一覧<br />
・ユーザーの誕生日<br />
・ユーザーの性別<br />
・ユーザーのタイムライン一覧<br />
・友達リスト<br />
といった情報です。</p>
<p><a href="https://hirossyi.net/wp-content/uploads/2018/08/capture_20180830193635.png"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-559" src="https://hirossyi.net/wp-content/uploads/2018/08/capture_20180830193635-768x368.png" alt="" width="768" height="368"></a></p>
<p>このような情報を、アプリごとに、あらかじめ設定しておく必要があります。ちなみにこれらの設定を「スコープ」といいます。</p>
<p>なお、ここで1点特記事項としては、これらの項目として、<strong><span style="color: #ff0000;"><span class="red bold">パスワードを設定することは出来ません。</span></span></strong><br />
<strong><span style="color: #ff0000;"><span class="red bold">Facebookアプリはパスワードを取得することは出来ませんし、変更することも出来ません。</span></span></strong></p>
<h3 class="h_midashi2">ユーザーがFacebookアプリを使用する時</h3>
<p>そして、Facebookアプリを使用する場合です。<br />
下の画像のように、Facebookアプリを使用する際、「Facebookにログイン」のボタンをクリックします。</p>
<p>すると、上にも貼り付けた画像が表示されます。</p>
<p><a href="https://hirossyi.net/wp-content/uploads/2018/08/capture_20180830193634_2.png"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-561" src="https://hirossyi.net/wp-content/uploads/2018/08/capture_20180830193634_2-750x768.png" alt="" width="750" height="768"></a></p>
<p>ここで重要なのは、赤線で囲った部分です。<br />
これは、これから使用するFacebookアプリが、Facebookから取得する情報・もしくは使用する権限を、一覧で表示します。</p>
<p>ちなみにキャンディクラッシュの場合はこちらです。</p>
<p><a href="https://hirossyi.net/wp-content/uploads/2018/08/2018-08-30-20.30.41.jpg"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-562" src="https://hirossyi.net/wp-content/uploads/2018/08/2018-08-30-20.30.41-374x768.jpg" alt="" width="374" height="768"></a><br />
「友達リスト」が含まれていますね。なのでキャンディクラッシュは、ログインしたユーザーの友達リストも取得することができるようになっています。<br />
（そして、この「友達リスト」についても重要な事実があります。詳しくは後述します）</p>
<p>ユーザーは、ここに書かれている情報を確認することで、「これから使用するFacebookアプリは、いったいどんな情報を使用するか」ということを、確認することができるわけです。</p>
<p>なので、必要以上にてんこ盛りだと、「あれ、なにか怪しくない？」となるわけです。<br />
設定を大量にぶち込むと、こんな感じになります。</p>
<p><a href="https://hirossyi.net/wp-content/uploads/2018/08/capture_20180830193636.png"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-563" src="https://hirossyi.net/wp-content/uploads/2018/08/capture_20180830193636-701x768.png" alt="" width="701" height="768"></a></p>
<p>これはあからさまに怪しいですねｗこのようなアプリは怪しいので、ユーザーは使用しない方がいいです。</p>
<h3 class="h_midashi2">ユーザーがFacebookにログイン後、アプリで行っていること</h3>
<p>「Facebookにログイン」を実施した後、アプリ内部でどのような処理を行っているかを説明します。</p>
<p>まず、ログインすることで、Facebookから「アクセストークン」と呼ばれる、超長い文字列が返ってきます。</p>
<p><a href="https://hirossyi.net/wp-content/uploads/2018/08/capture_20180830193637.png"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-564" src="https://hirossyi.net/wp-content/uploads/2018/08/capture_20180830193637-768x140.png" alt="" width="768" height="140"></a></p>
<p>こんな感じの文字列です。実際には200字以上あります。</p>
<p>この文字列を使用して、アプリはFacebookから、情報を取得するわけです。<br />
例えば、ログインユーザーのプロフィールを、アプリから取得したい場合、</p>
<p>・先ほど取得したアクセストークン<br />
・取得したい内容<br />
この2点をFacebookに渡します。</p>
<p><a href="https://hirossyi.net/wp-content/uploads/2018/08/capture_20180830193638.png"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-565" src="https://hirossyi.net/wp-content/uploads/2018/08/capture_20180830193638-768x354.png" alt="" width="768" height="354"></a></p>
<p>こうすることによって、Facebookはプロフィール情報を、アプリに送り返すわけです。</p>
<p><a href="https://hirossyi.net/wp-content/uploads/2018/08/capture_20180830193639.png"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-566" src="https://hirossyi.net/wp-content/uploads/2018/08/capture_20180830193639-768x219.png" alt="" width="768" height="219"></a></p>
<p>ちなみにここで取得できるのは、ユーザーがログインしたときに設定している、「スコープ」の範囲内です。<br />
上の画像で使用している例でいうと、アプリBでは「友達リスト」を設定しています。<br />
そのため、アプリは友達リストを取得することができます。</p>
<p><a href="https://hirossyi.net/wp-content/uploads/2018/08/capture_20180830193640.png"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-567" src="https://hirossyi.net/wp-content/uploads/2018/08/capture_20180830193640-768x340.png" alt="" width="768" height="340"></a></p>
<p><a href="https://hirossyi.net/wp-content/uploads/2018/08/capture_20180830193641.png"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-568" src="https://hirossyi.net/wp-content/uploads/2018/08/capture_20180830193641-768x230.png" alt="" width="768" height="230"></a></p>
<p>一方、アプリAでは「友達リスト」を、取得する情報として設定していません。<br />
そのため、仮にアプリAが友達リストを取得しようとすると、エラーが発生して取得できません。</p>
<p><a href="https://hirossyi.net/wp-content/uploads/2018/08/capture_20180830193642.png"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-569" src="https://hirossyi.net/wp-content/uploads/2018/08/capture_20180830193642-768x331.png" alt="" width="768" height="331"></a></p>
<p><a href="https://hirossyi.net/wp-content/uploads/2018/08/capture_20180830193643.png"><img loading="lazy" decoding="async" class="alignnone size-large wp-image-570" src="https://hirossyi.net/wp-content/uploads/2018/08/capture_20180830193643-768x205.png" alt="" width="768" height="205"></a></p>
<p>このように、Facebookから情報を受け取ったアプリは、この情報を使用して、その後のプログラムで活用できることになります。</p>
<p>※この仕組みは、システム用語で言うと「API」と呼ばれます。<br />
また、ログインなどの仕組みを「認証」「認可」、Facebookアプリで採用している仕組みは「OAuth2」と呼びます。<br />
テストには出ないです。</p>
<p>これが、Facebookアプリの一連の流れです。<br />
ここで重要なのは、<br />
・Facebookアプリでは、ログインユーザーのパスワードを受け取っていないし、受け取ることは決して出来ない<br />
・ログインユーザーの情報は、「アクセストークン」と呼ばれる超長い文字列を使用することで、取得できる。そしてこれは、パスワードを使用しない<br />
・Facebookアプリがアクセストークンを取得するためには、ログインユーザーが一度、「Facebookでログイン」ボタンを押す必要がある<br />
ということです。</p>
<h2 class="h_midashi">巷で言われている話の真偽、QA</h2>
<p>これらの話を踏まえ、Facebookアプリ（特に診断系）について、巷で言われていることの真偽やQAをまとめていきます。</p>
<h3 class="h_midashi2">Facebookアプリを使用すると、アカウントが乗っ取られる！！</h3>
<p>「乗っ取られる」の定義が何かによりますが、「IDパスワードが盗まれる」「自分のアカウントを誰かに勝手に使われる」という意味だと、それはNOです。<br />
なぜなら、<strong><span style="color: #ff0000;"><span class="red bold">Facebookアプリはログインユーザーのパスワードを取得することが出来ない</span>からです。</span></strong><br />
パスワードを取得出来ないので、悪意のある開発者が、その後のアカウントをどうこうしようとしても、それは出来ません。<br />
※ただしFacebookアプリでは、「タイムラインの投稿」というスコープがあります。これは文字通り、Facebookアプリが、ログインユーザーのタイムラインに投稿をすることができる権利です。<br />
そのため、<span class="font-bold">アプリのスコープに「タイムラインの投稿」が含まれていた場合、悪意のあるアプリが、ユーザーにタイムラインに投稿することは出来てしまいます。</span>そこは要注意です。</p>
<h3 class="h_midashi2">診断系アプリを使用してしまったら、今すぐパスワード変更をして二段階認証を設定すべき！</h3>
<p>これは意味がないです。なぜなら、もうおわかりだと思いますが、Facebookアプリはパスワードを使用していません。<br />
いくらパスワードを変更しようとも、二段階認証を設定しようとも、アクセストークンが有効な限り、Facebookアプリはあなたの情報を取得できてしまいます。<br />
なのでこの点に関しては、二段階認証も無意味です。<br />
（ただ一般論として、現代では二段階認証の有無で情報流出のリスクが段違いなので、二段階認証は設定するようにしてくださいね）</p>
<h3 class="h_midashi2">アプリを使用すると、個人情報を抜かれるんでしょ？</h3>
<p>これは、上で解説している「スコープ」次第です。スコープで設定した内容のみ、Facebookから情報が取得できます。<br />
ちなみに標準設定だと、アプリが取得できるのは、<br />
<span class="red">※2018/09/02 1:00訂正</span><br />
・id<br />
・名前<br />
・公開プロフィール(プロフィール写真、性別など)<br />
です。<br />
※当初、idと名前のみと記載しておりましたが、公開プロフィールも含まれておりました。訂正いたします。<br />
なお、公開プロフィールは、Facebookに登録していなくても、誰でも閲覧できる情報になります。</p>
<p>これらはFacebookの画面からかんたんに取得できる、公開情報になります。<br />
それ以上の情報は、アプリごとに設定されているスコープ次第です。ログイン画面でユーザーが許可した内容のみ、Facebookアプリに渡すことになります。</p>
<p>この設定によって、例えば以下のような情報をアプリに渡すことになります。<br />
・メールアドレス<br />
・誕生日<br />
・写真<br />
・タイムライン投稿の一覧<br />
なにかに悪用しようと思えば十分ですね。<br />
そのため、Facebookアプリを使用する場合、<span class="font-bold">ログイン時の「受け取る情報」がどうなっているかを確認し、自己判断で行ってください。</span><br />
ちなみに、実際に個人情報悪用のニュースもあるようです。<br />
<a href="https://r.nikkei.com/article/DGXMZO29264270R10C18A4X11000?s=0" rel="noopener noreferrer" target="_blank"><a href="https://r.nikkei.com/article/DGXMZO29264270R10C18A4X11000?s=0">https://r.nikkei.com/article/DGXMZO29264270R10C18A4X11000?s=0</a></a></p>
<h3 class="h_midashi2">友達のあの人がFacebookアプリを使用すると、自分の個人情報まで流出するからやめろ！！</h3>
<p>これは明確にNOです。<br />
その根拠は、Facebook APIの「友達リスト」の仕様に記載があります。<br />
<a href="https://developers.facebook.com/docs/graph-api/reference/v3.1/user/friends"><a href="https://developers.facebook.com/docs/graph-api/reference/v3.1/user/friends">https://developers.facebook.com/docs/graph-api/reference/v3.1/user/friends</a></a><br />
ざっくり和訳すると、以下になります。</p>
<p>↓↓↓↓↓↓<br />
友達リスト<br />
あなたに以下の情報を提供します<br />
・このFacebookアプリをインストールした、あなたの友達ユーザーの一覧<br />
・あなたの友達ユーザーの総数（このFacebookアプリをインストールしていないユーザーを含む）<br />
↑↑↑↑↑↑</p>
<p>つまり、悪意のあるアプリを友達が利用しちゃってたとして、<strong>あなたがそのアプリを使用しない限り、あなたの情報を友達が取得することは出来ません。</strong></p>
<p>キャンディークラッシュを例にとります。キャンディークラッシュのアプリで取得できる、Facebookの友達の情報は、すでにキャンディークラッシュをインストールしている友達のもののみです。<br />
<strong>キャンディークラッシュを使用していないユーザーの情報を、キャンディークラッシュが取得することは出来ません。</strong></p>
<p>なので、どれだけ友達が変なアプリを使用していようが、イライラする必要はないです。ご安心を。</p>
<h3 class="h_midashi2">じゃあなんでレイ○ンの投稿や乗っ取りは終わらないの？</h3>
<p>Facebookアプリとは別の原因の可能性が高いです。例えばパスワード使い回しとかね。<br />
最低限パスワード使い回しは辞めて、二段階認証の設定は行いましょう。起こってからでは遅いです。</p>
<h3 class="h_midashi2">他のブログで、「個人情報が抜かれる！！」「こんなのやる人は頭が悪い！！」と書いてあったんだけど</h3>
<p>たぶん技術的なことが分かっていない人が書いたブログだと思います。それかアクセス稼ぎか。<br />
「Facebookにログイン」のときに書かれている項目以外の情報が、Facebookから抜き出されていたとしたら、<strong class="red font-bold font-large">それはFacebookの大セキュリティ事故です。</strong>それも株価大暴落ってレベルじゃない。<br />
そんなことができるとしたら、真っ先にこっそりFacebookに報告しましょう。すごい報酬がもらえるはずです。<br />
・・・まあ、それぐらい有り得ないレベルですね。</p>
<h3 class="h_midashi2">結局、Facebookアプリは100％安全なの？</h3>
<p><span class="font-large">100％安全という訳ではないです。</span><br />
乗っ取りや、関係ない友達の情報を悪用されることはありませんが、あなたの個人情報悪用のリスクがあります。</p>
<h3 class="h_midashi2">難しくて、良く分からなかった！</h3>
<p><span class="font-large">アプリを使用しないのが無難です。</span></p>
<h2 class="h_midashi">まとめ</h2>
<p>以上、Facebookアプリの仕様をまとめました。<br />
昔はFacebookアプリは、割と自由だった記憶があります。なので友達の情報を勝手に利用とか、そういうことが起きていたのかもしれません。<br />
が、最近厳しくなったようです。悪意のある業者が勝手に投稿など行ったんでしょう。<br />
それもあってか、少なくとも2018年現在では、アプリに関するセキュリティはかなり厳重になっております。なので、悪意のあるアプリによる被害というのは、限りなく低いと思います。<br />
（考えてみると、Facebookアプリのそういった投稿、昔に比べて減ってますよね）</p>
<p>ただ、それでもリスクが無いわけではないです。<br />
例えば診断系のアプリでは、写真を使うものがあります。<br />
「写真を取得」のスコープを設定すれば、アプリがログインユーザーの写真を取得することが出来ますので、その写真を使って、どうこうすることは考えられます。</p>
<p>なので、やはりFacebookアプリを使用する場合は、自己判断で行うほうが良いです。<br />
そのアプリが信頼できる業者なのか、その辺は自分自身で判断してください。</p>
<h2 class="h_midashi">最後に</h2>
<p>Facebookアプリが、情報を取得できないようにする方法です。<br />
この方法を実行すれば、実行後はFacebookアプリは、一度許可していたとしても、情報を取得することができなくなります。<br />
その手順は以下のURLをご参照ください。（書こうとしたけど力尽きた）<br />
<a href="https://www.facebook.com/help/204306713029340"><a href="https://www.facebook.com/help/204306713029340">https://www.facebook.com/help/204306713029340</a></a></p>
<h2 class="h_midashi">つづき</h2>
<p>個人情報提供のリスクについて書きました<br />
<a href="https://develop.kajitori.co.jp/?p=100">https://develop.kajitori.co.jp/?p=100</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://develop.kajitori.co.jp/archives/97/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
