XojoでOAuth2認証を扱う方法(Dropbox編)

2017.11.21  投稿者: moongift
開発

Dropbox APIを例にXojoでOAuth2アプリケーションを作る方法を紹介します。

現在、Web APIにおける認証の主流はOAuth2となっています。Facebook、Twitter、Google、Instagram…などなど各社がOAuth2認証を提供しています。

XojoではOAuth2用のライブラリなどは提供していませんが、Webを使った認証方式であればさほど難しくありません。今回はDropbox APIを通じてOAuth2認証の使い方を紹介します。なおプラットフォームはデスクトップを想定しています。

コツはURLの取り扱い

OAuth2の場合クライアントIDとクライアントシークレットIDという二つのキーを扱いますが、Webブラウザベースの場合はクライアントIDだけで使えます。クライアントIDは各OAuth2サービスプロバイダにおいて、OAuth2アプリケーションを作ると自動的に生成されます。

https://www.dropbox.com/oauth2/authorize?client_id=YOUR_CLIENT_ID&response_type=token&redirect_uri=REDIRECT_URL

REDIRECT_URLというのは認証後にリダイレクトするURLになります。このURLは何でも良いのですが、アクセスした時にリダイレクト処理されない(例えばモバイル用のサイトであったり、日本語サイトなど)URLを指定しておく必要があります。

現在のURLをウォッチする

そしてXojoのWebページを取り扱うコンポーネントであるHTMLViewerの場合、URLを取得する方法としてDocumentCompleteとTitleChangedが使えます。この二つのイベントを使って、認証後のページに表示されるaccess_tokenパラメータを取得します。細かい方法については HTMLViewerで表示されているURLを取得する | Xojo|グレープシティ株式会社 を参考にしてください。

以下はTitleChangedのイベントで、access_tokenパラメータを取得する例です。

if instr(newTitle,"zurl")>0 then
  Dim rg As New RegEx
  Dim myMatch As RegExMatch
  rg.SearchPattern = ".*access_token=([a-zA-Z0-9\-_]*)&.*"
  myMatch = rg.Search(newTitle)
  if (myMatch <> Nil) Then
    wMain.txtToken.Text = myMatch.SubExpressionString(1)
    wAuth.Hide
  end if
end if

アクセストークンを使ってWeb APIを操作する

アクセストークンが分かれば、Web APIの操作は簡単です。例えばDropboxでコンテンツを追加するコードは次のようになります。

Dim http As New HTTPSecureSocket
Dim token as String = txtToken.Text // アクセストークン

http.SetRequestHeader("Authorization", "Bearer " + token)
// ファイルの保存先
http.SetRequestHeader("Dropbox-API-Arg",  "{""path"":""/" + txtFileName.text + """}")
// ファイルの内容
http.SetRequestContent(txtNote.Text, "application/octet-stream")
Dim result As String
result = http.Post("https://content.dropboxapi.com/2/files/upload", 30)

Authorization ヘッダーに対してアクセストークンを適用すれば良いだけなので簡単です。OAuth2については多少の違いはありますが、基本的にはAuthorizationヘッダーを使うようになっています。


今回のコードはgoofmint/Xojo_Dropbox_Demo: Using Dropbox API on Xojoで公開しています。OAuth2アプリケーション実装の参考にしてください。