LoginSignup
2
2

More than 5 years have passed since last update.

HoloLensでTwitter認証&投稿

Last updated at Posted at 2018-06-02

HoloLensからTwitter認証を行い投稿したい!ということで調査してみました。

現状、HoloLensのDirect3Dアプリはアプリ内でブラウザを使用することができません。ですので、OAuthの中でも「PIN認証」と呼ばれる方法を用いて認証を行います。

ちょうどAssetStoreに、「Let's Tweet In Unity」というPIN認証を行ってくれる無料のAssetがありますので、こちらを使用させていただきます。

HashTableの修正

そのままではコンパイルが通らないので、下記ブログを参考にしてHashTableではなくDictionaryに置き換えました。

var headers = new Hashtable();
headers["Authorization"] = GetHeaderWithAccessToken("POST", PostTweetURL, consumerKey, consumerSecret, response, parameters);

var headers = new Dictionary<string, string>();
headers.Add("Authorization", GetHeaderWithAccessToken("POST", PostTweetURL, consumerKey, consumerSecret, response, parameters));

UWP向けの修正

また、HoloLensあるあるですが、UWP向けにコンパイルが通らないので、ハッシュ化の部分を修正します。

ヘッダーに追加

#if UNITY_WSA && !UNITY_EDITOR
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Security.Cryptography;
using Windows.Security.Cryptography.Core;
using Windows.Storage.Streams;
#endif

「// Generate the hash」の部分を書き換え(#ifとUWPのコードを追加)

#if UNITY_WSA && !UNITY_EDITOR
 var objMacProv = MacAlgorithmProvider.OpenAlgorithm("HMAC_SHA1");
 var messageBytes = Encoding.UTF8.GetBytes(signatureBaseString);
 var keyBytes = Encoding.UTF8.GetBytes(key);
 CryptographicKey hmacKey = objMacProv.CreateKey(keyBytes.AsBuffer());
 IBuffer buffHMAC = CryptographicEngine.Sign(hmacKey, messageBytes.AsBuffer());
 return Convert.ToBase64String(buffHMAC.ToArray());
#else
 // Generate the hash
 HMACSHA1 hmacsha1 = new HMACSHA1(Encoding.ASCII.GetBytes(key));
 byte[] signatureBytes = 
 hmacsha1.ComputeHash(Encoding.ASCII.GetBytes(signatureBaseString));
 return Convert.ToBase64String(signatureBytes);
#endif

HoloLens向けUIの作成

Let's Tweet in UnityはOnGUIでUIが作られていますが、HoloLensはOnGUIが動作しないため、uGUIに作り変えます。

ここで問題となるのが、HoloLensでの文字入力の方法です。今回は、
HoloToolKit-Examples > Input > Scenes > KeyboardTest
を複製して、UIオブジェクトを足す形で調整しました。
これでバーチャルキーボードや音声認識を使った文字入力が可能となります。

ui.PNG

そして、Demo.csを下記のように書き換えます。
uGUIの中で行っているイベント処理を別の関数に書き出しています。

Sceneのセットアップ

空のGameObjectを作成して、Demo.csをアタッチします。

tempsnip.png

  • CONSUMER_KEY / CONSUMER_SECRET
  • Message / PIN Field / Tweet Field
    • それぞれ作成したUI部品を割り当て

uGUIボタンのイベント設定

  • Get PINボタンのイベント
    • public void onClick_GetRequestToken()
  • Enter PINボタンのイベント
    • public void onClick_EnterPIN()
  • Tweetボタンのイベント
    • public void onClick_PostTweet()

button.PNG

コンパイル・実行

これで実行すると、「Get PIN」をAirTapした時に別ウインドウでEdgeが起動します。そこでTwitterにログインするとPINが表示されるので、再度作成したアプリに切り替えて、InputFieldのところに入力し、「Enter PIN」をAirTapします。認証が成功すると、Messageのところにアカウント名が入りますので、「Tweet」ボタンで投稿ができるようになります。

Edgeに切り替わってしまうのは利用者から見れば煩雑なフローなので、アプリ内ブラウザの登場が待たれるところですね。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2