<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Japan Azure Mobile Apps Support Blog</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/jpamablog/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/jpamablog/feed.xml</link>
    <description>Just another Developer Network site</description>
    <lastBuildDate>Wed, 17 Apr 2019 03:39:48 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Azure Mobile Apps の認証設定について（その２）</title>
      <link>https://docs.microsoft.com/archive/blogs/jpamablog/authsettings2</link>
      <pubDate>Fri, 20 May 2016 10:20:54 GMT</pubDate>
      <dc:creator><![CDATA[jpwdkblg]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/jpamablog/?p=65</guid>
      <description><![CDATA[前回に引き続き、Azure Mobile Apps の認証設定について説明します。前回は [要求が認証されない場合に実行するアクション] について説明しましたが、今回は次の画像の青枠の詳細設定にある...]]></description>
      <content:encoded><![CDATA[<a href="https://blogs.msdn.microsoft.com/jpamablog/2016/04/22/authsettings1/" target="_blank">前回</a>に引き続き、Azure Mobile Apps の認証設定について説明します。前回は [要求が認証されない場合に実行するアクション] について説明しましたが、今回は次の画像の青枠の詳細設定にある [トークン ストア] について説明します。

<a href="https://msdnshared.blob.core.windows.net/media/2016/05/auth_settings2.png"><img class="alignnone wp-image-75 size-full" src="https://msdnshared.blob.core.windows.net/media/2016/05/auth_settings2.png" alt="auth_settings2" width="510" height="736" /></a>

&nbsp;

<strong>[</strong><strong>トークン ストア] について</strong><strong>
</strong>例えばアプリケーションが次のようなシナリオを実現しようとしていたとします。
<ol>
	<li>Facebook の認証を使用して、Azure Mobile Apps のバックエンド アプリケーションにサインインする</li>
	<li>クライアント アプリが、１の認証結果を利用し、Facebook のタイムラインに写真などをポストする</li>
</ol>
1 については、<a href="https://azure.microsoft.com/ja-jp/documentation/articles/app-service-mobile-how-to-configure-facebook-authentication/" target="_blank">チュートリアル</a>に記載がある通り Facebook 認証が利用できるようクライアント アプリとバックエンドを構成することで実現できます。
一方、2 については、Facebook API にアクセスするための適切なアクセス権を持ったトークンが必要となります。

このような場合、[トークン ストア] の設定を “オン” としておくことで、この機能 が Facebook API にアクセスするために必要なトークンを自動的に取得し、保持するようになります。

もし、クライアント アプリが実際にトークンに対してアクセスする必要がある場合、クライアント アプリから Azure Mobile Apps のバックエンド サーバーの “/.auth/me” に対して HTTP GET リクエストを発行することで、トークンを取得することができます。
具体的には、<a href="https://azure.microsoft.com/ja-jp/documentation/articles/app-service-mobile-windows-store-dotnet-get-started-users/%23add-authentication" target="_blank">「Windows アプリに認証を追加する - アプリケーションに認証を追加する」</a> で紹介されている手順 3 のコードに対して、以下の黄色部分のようなコードを追加することで実現できます。なお、発行する GET リクエストは、当然、認証が済んでいる必要があるため、<em>AuthenticationAsync()</em> の呼び出し後である必要があります。
<table class="MsoNormalTable" style="height: 450px;border-collapse: collapse" border="0" width="731" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="width: 587.9pt;border: solid windowtext 1.0pt;padding: 0mm 5.4pt 0mm 5.4pt" valign="top" width="784">
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: blue;background: white">private</span> <span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: blue;background: white">async</span> <span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: blue;background: white">void</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: black;background: white"> ButtonLogin_Click(</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: blue;background: white">object</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: black;background: white"> sender, </span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white">RoutedEventArgs</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: black;background: white"> e)
</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: black;background: white">{
</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: blue;background: yellow">    var </span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: black;background: yellow">client = </span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: yellow">App</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: black;background: yellow">.MobileService;
</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: yellow">    JToken</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: black;background: yellow"> tokens;</span></p>
<span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: black;background: white">    </span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: green;background: white">// Login the user and then load data from the mobile app.
</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: black;background: white">    </span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: blue;background: white">if</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: black;background: white"> (</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: blue;background: white">await</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: black;background: white"> AuthenticateAsync())
</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: black;background: white">    {
</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: black;background: white">        </span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: green;background: white">// Hide the login button and load items from the mobile app.
</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: black;background: white">        ButtonLogin.Visibility = Windows.UI.Xaml.</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: white">Visibility</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: black;background: white">.Collapsed;
</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: black;background: white">        </span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: green;background: white">//await InitLocalStoreAsync(); //offline sync support.
</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: black;background: yellow">        </span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: blue;background: yellow">try
</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: black;background: yellow">        {
</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: black;background: yellow">            tokens = </span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: blue;background: yellow">await</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: black;background: yellow"> client.InvokeApiAsync(</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: #a31515;background: yellow">"/.auth/me"</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: black;background: yellow">, System.Net.Http.</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: yellow">HttpMethod</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: black;background: yellow">.Get, </span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: blue;background: yellow">null</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: black;background: yellow">);
</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: black;background: yellow">        }
</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: black;background: yellow">        </span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: blue;background: yellow">catch</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: black;background: yellow"> (</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: yellow">MobileServiceInvalidOperationException</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: black;background: yellow"> exception)
</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: black;background: yellow">        {</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: black;background: yellow">
</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: blue;background: yellow"><span lang="EN-US" style="background: yellow;color: black;font-family: Consolas;font-size: 9.5pt">        <span style="color: #000000;font-family: Consolas;font-size: small">    </span></span>await</span> <span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: blue;background: yellow">new</span> <span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: #2b91af;background: yellow">MessageDialog</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: black;background: yellow">(exception.Message, </span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: #a31515;background: yellow">"Error calling GET /.auth/me"</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: black;background: yellow">).ShowAsync();
</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: black;background: yellow">        }
</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: black;background: white">        </span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: blue;background: white">await</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: black;background: white"> RefreshTodoItems();
</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: black;background: white">    }
</span><span lang="EN-US" style="font-size: 9.5pt;font-family: Consolas;color: black;background: white">}</span></td>
</tr>
</tbody>
</table>
上記コードを実際に動作させ、Visual Studio 2015 のデバッガーでその様子を見てみると、以下のような結果となり、<em>InvokeApiAsync</em> メソッドの戻り値 (<em>tokens</em>) に、トークンの情報が格納されていることが確認できます。

<a href="https://msdnshared.blob.core.windows.net/media/2016/05/vs2015_dbgview.png"><img class="alignnone wp-image-85 size-full" src="https://msdnshared.blob.core.windows.net/media/2016/05/vs2015_dbgview.png" alt="vs2015_dbgview" width="849" height="663" /></a>

&nbsp;

<strong>&lt;</strong><strong>関連情報&gt;
</strong><a title="Azure Active Directory ログインを使用するよう" href="https://azure.microsoft.com/ja-jp/documentation/articles/app-service-mobile-how-to-configure-active-directory-authentication/" target="_blank">Azure Active Directory ログインを使用するように App Service アプリケーションを構成する方法</a>
<a href="https://azure.microsoft.com/ja-jp/documentation/articles/app-service-mobile-ios-get-started-users/" target="_blank">iOS アプリに認証を追加する</a>
<a href="https://azure.microsoft.com/ja-jp/documentation/articles/app-service-mobile-xamarin-android-get-started-users/" target="_blank">Xamarin.Android アプリに認証を追加する</a>
<a href="https://azure.microsoft.com/ja-jp/documentation/articles/app-service-mobile-windows-store-dotnet-get-started-users/" target="_blank">Windows アプリに認証を追加する</a>

&nbsp;]]></content:encoded>
    </item>
    <item>
      <title>Azure Mobile Apps の認証設定について（その１）</title>
      <link>https://docs.microsoft.com/archive/blogs/jpamablog/authsettings1</link>
      <pubDate>Fri, 22 Apr 2016 04:14:47 GMT</pubDate>
      <dc:creator><![CDATA[jpwdkblg]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/jpamablog/?p=15</guid>
      <description><![CDATA[初めまして、Azure Mobile Apps デベロッパー サポートです。...]]></description>
      <content:encoded><![CDATA[初めまして、Azure Mobile Apps デベロッパー サポートです。 開発者向けにブログを開設しました。ここで開発者にいろいろな情報をご提供できればと思います！今後ともよろしくお願いします。

&nbsp;

では、早速１回目の投稿です。 モバイル アプリでは、ユーザーが利用する前に認証 (ログイン) を求める機能を有しているものが多いと思います。Azure Mobile Apps では、その認証プロバイダーとして、Azure Active Directory, Facebook, Google, Twitter, Microsoft アカウントおよびカスタム認証が利用できます。 この認証機能を構成する際、以下の画像で赤く囲った 2 つの設定がありますが、これらがどのように機能するのかを説明します。今回は、１つ目の [要求が認証されない場合に実行するアクション] について解説します。

<img src="https://msdnshared.blob.core.windows.net/media/2016/04/auth_settings.png" alt="認証・承認設定" />

<strong>[</strong><strong>要求が認証されない場合に実行するアクション] について</strong>

いまいち、わかりにくい日本語ですが、原文は [Action to take when request is not authenticated] です。 これは、バックエンド サーバー アプリケーションが提供する API などに対し、クライアント アプリがリクエスト（POST や GET など）を発行した時、もし認証されていないクライアントからの要求であった場合、バックエンド側の挙動としてどのように振る舞うか、を決める設定となります。 認証が必要な API の場合、C# の .NET バックエンドでは、以下のように <em>[Authorize]</em> という属性をクラスやメソッドに付加しています。 ここで、<em>[Authorize]</em> 属性を付加していないものについては、認証なしで呼び出し可能とする場合には [要求が認証されない場合に実行するアクション] を "要求の許可（操作不要）" に設定します。 一方で、<em>[Authorize]</em> 属性を付加していないものについても、何かしらの認証を要求する場合は、"要求の許可（操作不要）" 以外の認証プロバイダーを選択するようにします。そうすることで、認証されていないすべての要求は、指定した認証プロバイダーへリダイレクトされるようになります。

<img src="https://msdnshared.blob.core.windows.net/media/2016/04/code_ex1.png" alt="コード例" />

クライアント アプリがプッシュ通知などに関連した機能で、認証をせず処理することが求められるような場合については、この設定を "要求の許可（操作不要）" とする必要があります。もし、こういったケースでアプリがうまく動作しないといった場合は、この設定を見直してみると良いかもしれません。

次回は、[トークン ストア] について、解説します。

&nbsp;

<strong>&lt;</strong><strong>関連情報&gt;
</strong><a title="Azure Active Directory ログインを使用するように App Service アプリケーションを構成する方法" href="https://azure.microsoft.com/ja-jp/documentation/articles/app-service-mobile-how-to-configure-active-directory-authentication/" target="_blank">Azure Active Directory ログインを使用するように App Service アプリケーションを構成する方法</a>

&nbsp;]]></content:encoded>
    </item>
  </channel>
</rss>