IIJ Technical WEEK REST API型クラウドストレージサービス「FV/S」の自社への実装

Similar documents
DIGNO® ケータイ ユーザーガイド

SoftBank 304SH 取扱説明書

メールをサーバーに保存する 実行 SD カードに保存したメールデータを サーバーに保存します ほかの携帯電話でも利用可能な形式で保存するため データの一 部が破棄 または変更される場合があります 保存が開始されます 保存を中断する場合は キャンセルをタップします 中断した場合 データは保存されません

AQUOS ケータイ2 ユーザーガイド

Xperia™ Z3 ユーザーガイド

Java (9) 1 Lesson Java System.out.println() 1 Java API 1 Java Java 1

新・明解Java入門

Javaセキュアコーディングセミナー東京 第3回 入出力(File, Stream)と例外時の動作 演習解説

DIGNO® G ユーザーガイド

PowerPoint Presentation

LogisticaTRUCKServer-Ⅱ距離計算サーバ/Active-Xコントロール/クライアント 概略   

K227 Java 2

Xperia™ XZs ユーザーガイド

TopLink å SampleClient.java... 5 Ò readallsample() querysample() cachesample() Ç..

文字列操作と正規表現

オブジェクト指向プログラミング・同演習 5月21日演習課題


10/ / /30 3. ( ) 11/ 6 4. UNIX + C socket 11/13 5. ( ) C 11/20 6. http, CGI Perl 11/27 7. ( ) Perl 12/ 4 8. Windows Winsock 12/11 9. JAV

55 7 Java C Java TCP/IP TCP/IP TCP TCP_RO.java import java.net.*; import java.io.*; public class TCP_RO { public static void main(string[] a

JAVA とテンプレート

intra-mart Accel Platform — 外部ソフトウェア接続モジュール 仕様書   第3版  

Brekeke PBX - Version 2.1 ARSプラグイン開発ガイド

Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版   None

Java プログラミング Ⅰ 3 回目変数 変数 変 数 一時的に値を記憶させておく機能型 ( データ型 ) と識別子をもつ 2 型 ( データ型 ) 変数の種類型に応じて記憶できる値の種類や範囲が決まる 型 値の種類 値の範囲 boolean 真偽値 true / false char 2バイト文

12.1 インターネットアドレス インターネットアドレス インターネットアドレス 32 ビットの長さを持つインターネットに接続されたマシンを識別するのに使う インターネットアドレスは ピリオドで区切られたトークンの並びで表現されることもある インターネットアドレス

Java プログラミング Ⅰ 3 回目変 数 今日の講義講義で学ぶ内容 変数とは 変数の使い方 キーボード入力の仕方 変 数 変 数 一時的に値を記憶させておく機能 変数は 型 ( データ型 ) と識別子をもちます 2 型 ( データ型 ) 変数に記憶する値の種類変数の型は 記憶できる値の種類と範囲

2016 年度 JAVA 講座第六週目 目次 パッケージ... 2 パッケージの作成... 2 パッケージの使用方法... 3 異なるパッケージ同名クラスの宣言... 4 パッケージの側面から見たアクセス修飾子... 4 ラッパークラス... 5 ラッパークラス利用法:キャスト... 5 ラッパーク

エレクトーンのお客様向けiPhone/iPad接続マニュアル

File IO

Android Layout SDK プログラミング マニュアル

そして 取得した OutputStream インスタンスを使い 文字コードは UTF-8 として PrintWriter インスタンスを生成して あとは PrintWriter.append() で書き込みたい文字 列を渡して close() で保存する というだけです ファイルの読込み方法 それで

storage-sdk-Java

Prog1_15th

TestDesign for Web

インターネット接続ガイド v110

Javaセキュアコーディングセミナー東京 第2回 数値データの取扱いと入力値の検証 演習解説

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版  

目 次 Java GUI 3 1 概要 クラス構成 ソースコード例 課題...7 i

3 Java 3.1 Hello World! Hello World public class HelloWorld { public static void main(string[] args) { System.out.println("Hello World");

PowerPoint Presentation

基本操作ガイド

はじめに インフォマート API の呼び出しには OAuth2.0 による認証を受ける必要があります OAuth2.0 を使うことで インフォマート API を利用するサービスは インフォマートプラットフォーム ID( 1 以下 PFID) とパスワードを保存したり処理したりすることなく PFID

JavaプログラミングⅠ

ALG ppt

操作ガイド(本体操作編)

iPhone/iPad接続マニュアル

ただし 無作為にスレッドを複数実行すると 結果不正やデッドロックが起きる可能性がある 複数のスレッド ( マルチスレッド ) を安全に実行する ( スレッドセーフにする ) ためには 同期処理を用いるこ とが必要になる 同期処理は 予約語 synchronized で行うことができる ここでは sy

untitled

JUMAN++ version

インターネットマガジン2001年4月号―INTERNET magazine No.75

Morphological Analysis System JUMAN Copyright 2016 Kyoto University All rights reserved. Licensed under the Apache License, Version 2.0 (the Li

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 今日の講義講義で学ぶ内容 switch 文 論理演算子 条件演算子 条件判断文 3 switch 文 switch 文 式が case のラベルと一致する場所から直後の break; まで処理しますどれにも一致致しない場合 def

操作ガイド(本体操作編)

Programming-C-9.key

GEC-Java

Microsoft PowerPoint - Lecture_3

SonicWALL SSL-VPN 4000 導入ガイド

やさしいJavaプログラミング -Great Ideas for Java Programming サンプルPDF

PowerPoint Presentation

FW ファイルアップロード ダウンロード機能利用ガイド Version 年 9 月 21 日富士通株式会社 i All Right Reserved, Copyright FUJITSU LIMITED

r1.dvi

C/C++からJVMを起動します

ScanFront300/300P セットアップガイド

JavaプログラミングⅠ

PowerPoint プレゼンテーション

Prog2_9th

Q&A集

Microsoft PowerPoint - prog09.ppt

ご利用のコンピュータを設定する方法 このラボの作業を行うには 事前設定された dcloud ラボを使用するか 自身のコンピュータをセットアップします 詳細については イベントの事前準備 [ 英語 ] とラボの設定 [ 英語 ] の両方のモジュールを参照してください Python を使用した Spar

問題1 以下に示すプログラムは、次の処理をするプログラムである

Java演習(4) -- 変数と型 --

Microsoft PowerPoint - prog09.ppt


2

第14回若年者ものづくり競技大会「業務用ITソフトウェア・ソリューションズ」職種 模擬競技課題

Systemwalker IT Service Management Systemwalker IT Service Management V11.0L10 IT Service Management - Centric Manager Windows

JavaプログラミングⅠ

基本操作ガイド

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 条件判断文 3 switch 文 switch 文式が case の値と一致した場合 そこから直後の break; までを処理し どれにも一致しない場合 default; から直後の break; までを処理する 但し 式や値 1

Oracle Forms Services R6i

(Microsoft PowerPoint - \223\306\217KJava\221\346\202R\224\305.ppt)

問題1 以下に示すプログラムは、次の処理をするプログラムである

Microsoft Word - keisankigairon.ch doc

Java知識テスト問題

機能紹介 : Java ゲートウェイとインターシステムズ製品

Javaセキュアコーディングセミナー2013東京第1回 演習の解説

Microsoft PowerPoint ppt

JavaプログラミングⅠ

AWS Client VPN - ユーザーガイド

デジタル表現論・第6回


WebReportCafe

tkk0408nari

2

Servlet JSP JSP Servlet/JSP における 日 本 語 の 処 理 - 1

第 2 章インタフェース定義言語 (IDL) IDL とは 言語や OS に依存しないインタフェース定義を行うためのインタフェース定義言語です CORBA アプリケーションを作成する場合は インタフェースを定義した IDL ファイルを作成する必要があります ここでは IDL の文法や IDL ファイ

VB.NETコーディング標準

intra-mart Accel Platform — 外部ソフトウェア接続モジュール 仕様書   第2版  

FileMaker ODBC and JDBC Guide

Transcription:

Tech WEEK 2011 REST API FV/S 2011/11/09 1

FV/S / 2

FV/S 3

FV/S RESTful API HTTP S REST API FV/S API - - - - GET Object VPN / NW 4

/ IIJ API Java Python C# HTTP(S) (HTTPS) SAN I/O 5

IIJ I/O FV/S API / 6

7

IIJ FV/S 100GB AccessKeyId SecretAccessKey FV/S AccessKeyId SecretAccessKey 8

AccessKeyId / SecretAccessKey FV/S Signature Bucket URL Object FV/S FV/S 9

/ FV/S HTTP(S) HTTP(S) Java Python C# 10

GET Service AccessKeyId Bucket API API Java IIJ TCP HTTP Bse64 commons-codec 11

Signature Java import HTTP SHA-1 HTTP Signature HTTP API TCP API (HTTP ) API HTTP HTTP FV/S API HTTP 12

// package import private static String ACCESS_KEY_ID = XXXXXXXXXXXXXXXXXXXX"; private static String SECRET_ACCESS_KEY = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; private static String DOMAIN = "gss.iijgio.com"; private static String DATE_PATTERN = "EEE, dd MMM yyyy HH:mm:ss z"; private static SimpleDateFormat formatter = new SimpleDateFormat(DATE_PATTERN, Locale.US); static { formatter.settimezone(new SimpleTimeZone(0, "GMT")); AccessKeyId SecretAccessKey Signature HTTP 13

Signature Ⅰ / ----------------------------------------------------------------------------- Signature ----------------------------------------------------------------------------- / StringBuilder buffer = new StringBuilder(); buffer.append("get\n"); buffer.append( \n ); // MD5 buffer.append("\n"); // content-type buffer.append(formatter.format(date) + \n ); // HTTP buffer.append( / ); // ObjectKey GET Service ObjectKey / // byte[] bytestosign = null; try { bytestosign = buffer.tostring().getbytes("utf-8"); catch (Exception e) { e.printstacktrace(); Signature HTTP MD5 5 x-iijgio HTTP ObjectKey (HTTP ) / ( / ) 14

Signature Ⅱ // HMAC-SHA1 SecretKeySpec signingkey = new SecretKeySpec(SECRET_ACCESS_KEY.getBytes(), "HmacSHA1"); Mac mac = null; try { mac = Mac.getInstance("HmacSHA1"); mac.init(signingkey); catch (Exception e) { e.printstacktrace(); // String signature = new String(Base64.encodeBase64(mac.doFinal(bytesToSign))); (byte ) Signature SecretAccessKey MAC( ) MAC Signature Base64 Signature HTTP Authorization 15

HTTP / ----------------------------------------------------------------------------- HTTP ----------------------------------------------------------------------------- / buffer = new StringBuilder(); buffer.append("get / HTTP/1.1\r\n"); buffer.append("authorization: IIJGIO " + ACCESS_KEY_ID + ":" + signature + "\r\n"); buffer.append( Date: + formatter.format(date) + \r\n ); // Signature buffer.append("host: " + DOMAIN + "\r\n"); buffer.append("connection: close\r\n"); String request = buffer.tostring(); HTTP HTTP GET / HTTP/1.1 Authorization: IIJGIO XXXXXXXXXXXXXXXXXXXX:HDyWxb4D0pJmSJGJIEV6y7W2XQk= Date: Fri, 21 Oct 2011 01:57:46 GMT Host: gss.iijgio.com Connection: close ( ) Content-Type Content-MD5 Content- Length Content-Type application/octet-stream 16

API Ⅰ // try-catch // FV/S socket = new Socket(InetAddress.getByName(DOMAIN), 80); socketin = new LineNumberReader(new BufferedReader( new InputStreamReader(socket.getInputStream()))); socketout = new BufferedOutputStream(socket.getOutputStream()); // socketout.write(request.getbytes()); // HTTP // (PUT Object) // socketout.write("\r\n".getbytes()); // socketout.write(uploda-data); // upload-date byte[] socketout.write("\r\n".getbytes()); socketout.flush(); FV/S TCP Java Java 17

API Ⅱ // try-catch String line = null; boolean isbody = false; while ((line = socketin.readline())!= null) { if(line.trim() == ) isbody = true; // response.append(line + \n ); // if(isbody) bodypart.append(line + \n ); // Java HTTP 18

HTTP Signature HTTP Signature SHA-1 Hash HTTP IIJ Java Signature REST API 19

IIJ TEL 03-5205-4466 9 30 17 30 / / info@iij.ad.jp http://www.iij.ad.jp/ 20

/ Copyright 2011 IIJGIO.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance with the License. A copy of the License is located at http://www.apache.org/licenses/license-2.0 or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. / import java.io.bufferedoutputstream; import java.io.bufferedreader; import java.io.inputstreamreader; import java.io.linenumberreader; import java.io.outputstream; import java.net.inetaddress; import java.net.socket; import java.text.simpledateformat; import java.util.date; import java.util.locale; import java.util.simpletimezone; import javax.crypto.mac; import javax.crypto.spec.secretkeyspec; import org.apache.commons.codec.binary.base64; / Tech WEEK 2011 REST API 型クラウドストレージサービス FV/S の自社への実装 サンプルアプリケーション 本アプリケーションは IIJ Tech WEEK 2011 で行われたプレゼンテーション [REST API 型クラウドストレージサービス FV/S の自社への実装 ] で説明 された処理内容を実装したものです 本ソフトウェアは現況を以て提供され いかなる保証 サポートも提供され ません ビルドと実行 - このプログラムは commoncs-codec を使用します Apache Software Foundation のサイトから commons-codec のライブラリ をダウンロードし commons-codec-1.x.jar をこのファイルと同じ ディレクトリに配置して下さい 本プログラムの作成 / 検証では commons-codec-1.3.jar を使用しており 以下の説明はこのバージョンを前提に記述します - JDK このプログラムは JDK6 update 26 で検証しています ビルドの際には JDK6 update 26 以上の環境を用意して下さい - AccessKeyId/SecretAccessKey このプログラム中で指定された場所に 入手した AccessKeyId と SecretAccessKey を設定して下さい 設定箇所はそれぞれ一箇所で クラス定義先頭の定数宣言部にあります - ビルド commons-codec ライブラリが存在する事 javac へのパスが通っている 事等を確認の上 本ソースコードが配置されたディレクトリへ移動し 以下のコマンドでプログラムをコンパイルして下さい javac -cp./commons-codec-1.3.jar -encoding UTF-8 SimpleFvsSample.java - 実行 本プログラムは インターネットを経由して FV/S のサービスへアクセスします 本プログラムの実行には FV/S のご契約及びインターネット接続が可能な環境が 必要になります インターネット接続が可能 (HTTP 通信 /Port80 が可能な環境 ) に 上記ビルドで 作成した SimpleFvsSample.class と 予めダウンロードした commons-codec-1.3.jar を配置します 同ディレクトリで以下のコマンドを実行して下さい java -cp./:./commons-codec-1.3.jar SimpleFvsSample 尚 上記コマンドラインのクラスパス区切り文字は 必要に応じて適切なものに 変更して下さい @author Internet Initiative Japan Inc. @version $Rev$, $Date$ / public class SimpleFvsSample { private static String ACCESS_KEY_ID = " 入手した AccessKeyId をここに設定 "; private static String SECRET_ACCESS_KEY = " 入手した SecretAccessKey をここに設定 "; private static String DOMAIN = "gss.iijgio.com"; private static String DATE_PATTERN = "EEE, dd MMM yyyy HH:mm:ss z"; private static SimpleDateFormat formatter = new SimpleDateFormat(DATE_PATTERN, Locale.US); static { formatter.settimezone(new SimpleTimeZone(0, "GMT")); private void exec() { Date date = new Date(); // 実行日時 / ----------------------------------------------------------------------------- Signature の生成 ----------------------------------------------------------------------------- / StringBuilder buffer = new StringBuilder(); buffer.append("get n"); buffer.append(" n"); // No content, No MD5 value. buffer.append(" n"); // No content, No content-type. buffer.append(formatter.format(date) + " n");

buffer.append("/"); System.out.println("Headers to be signed:"); System.out.println("--------------------------------------"); System.out.println(buffer.toString()); System.out.println("--------------------------------------"); System.out.println(""); // バイト配列へ変換 byte[] bytestosign = null; try { bytestosign = buffer.tostring().getbytes("utf-8"); catch (Exception e) { e.printstacktrace(); // HMAC-SHA1 でエンコード SecretKeySpec signingkey = new SecretKeySpec(SECRET_ACCESS_KEY.getBytes(), "HmacSHA1"); Mac mac = null; try { mac = Mac.getInstance("HmacSHA1"); mac.init(signingkey); catch (Exception e) { e.printstacktrace(); // シグネーチャ完成 String signature = new String(Base64.encodeBase64(mac.doFinal(bytesToSign))); System.out.println("Signature to be used:"); System.out.println("--------------------------------------"); System.out.println(signature); System.out.println("--------------------------------------"); System.out.println(""); / ----------------------------------------------------------------------------- HTTP リクエストの作成 ----------------------------------------------------------------------------- / buffer = new StringBuilder(); buffer.append("get / HTTP/1.1 r n"); buffer.append("authorization: IIJGIO " + ACCESS_KEY_ID + ":" + signature + " r n"); buffer.append("date: " + formatter.format(date) + " r n"); buffer.append("host: " + DOMAIN + " r n"); buffer.append("connection: close r n"); String request = buffer.tostring(); System.out.println("Request to be sent:"); System.out.println("--------------------------------------"); System.out.println(request); System.out.println("--------------------------------------"); System.out.println(""); / ----------------------------------------------------------------------------- FV/S との通信 ----------------------------------------------------------------------------- / Socket socket = null; LineNumberReader socketin = null; OutputStream socketout = null; StringBuilder response = new StringBuilder(); StringBuilder bodypart = new StringBuilder(); try { // FV/S と通信する為のソケットをオープン socket = new Socket(InetAddress.getByName(DOMAIN), 80); socketin = new LineNumberReader(new BufferedReader( new InputStreamReader(socket.getInputStream()))); socketout = new BufferedOutputStream(socket.getOutputStream()); // リクエストの送信 socketout.write(request.getbytes()); socketout.write(" r n".getbytes()); socketout.flush(); // レスポンスの読み込み String line = null; boolean isbody = false; while ((line = socketin.readline())!= null) { if(line.trim() == "") isbody = true; response.append(line + " n"); if(isbody) { bodypart.append(line + " n"); catch (Exception e) { e.printstacktrace(); finally { try { socketout.close(); socketin.close(); socket.close(); catch(exception ignore) { / Should be just ignored. / // レスポンスの書き出し System.out.println(response.toString()); // End of file / @param args / public static void main(string[] args) { new SimpleFvsSample().exec(); http://www.iij.ad.jp/company/development/report/sample.html