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

Similar documents
IoT 共通プラットフォーム実証環境 アプリケーション開発ガイド 認証認可編 第 1.3 版 2019 年 4 月 高松市 i

目次 第 1 章はじめに 本ガイドの位置付け 認証から API 呼び出しまでの流れ 関連ガイド 4 第 2 章 API の利用準備 5 第 3 章 OAuth 2.0 認証と API 呼び出し OAuth 2.0 認証の概要 アプリケーショ

intra-mart Accel Platform — OAuth プログラミングガイド   初版  

intra-mart Accel Platform

intra-mart Accel Platform — OAuth認証モジュール 仕様書   初版  

自己紹介 氏縄武尊 (Ujinawa Takeru) Work 株式会社オージス総研テミストラクトソリューション部 4 年目認証 認可 ID 管理 PKI OpenID Foundation Japan EIWGメンバー Favorite Spec: OpenID Connect, OAuth2.0

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

OSSTechドキュメント

OSSTechプレゼンテーション

ステップ 1:Cisco Spark にサインアップして試してみよう 1. Spark のホームページ ( で電子メールアドレスを入力し 指示に従って Spark アカウントを作成します 注 : 自身の電子メールアカウントにアクセスして Spar

Microsoft Word - 注文ステータス変更API仕様書(EC)_ver1.docx

Prog1_15th

Microsoft Word - アクセストークン取得API仕様書(AS)_ver1.docx

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

1 ユーザ認証を受けた権限で アプリケーションを利用するために ログインプロキシにアクセスします 2 ログインプロキシにより Shibboleth SP から Shibboleth IdP の認証画面にリダイレクトされます 3 ブラウザに認証画面を表示します 4 認証画面にユーザ / パスワードを入

Googleカレンダー連携_管理者マニュアル

メソッドのまとめ

今後の認証基盤で必要となる 関連技術の動向 株式会社オージス総研テミストラクトソリューション部八幡孝 Copyright 2016 OGIS-RI Co., Ltd. All rights reserved.

変更履歴 版数 修正日 修正箇所 修正内容 /7/27 初版 /12/4 - プロパティを修正 2 / 10

SpringSecurity

intra-mart Accel Platform — IM-Repository拡張プログラミングガイド   初版  

内容 ( 演習 1) 脆弱性の原理解説 基礎知識 脆弱性の発見方法 演習 1: 意図しない命令の実行 演習解説 2

メディプロ1 Javaサーブレット補足資料.ppt

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

API 一 覧 ユーザー 認 証 API No 名 称 Method URL 1ユーザー 認 証 API POST データ 取 得 API No 名 称 Method URL 1 株 式 現 物 日 次 四 本 値 GET h

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

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

Prog2_9th

第 7 回の内容 動的な Web サイト フォーム Web システムの構成

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

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

勉強会の流れ Google API の概要 デモ curl で実際に体験 Copyright 2010 SRA OSS, Inc. Japan All rights reserved. 2

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

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

WEBシステムのセキュリティ技術

IM-SecureBlocker

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

WTM2019SingleSignOn

K227 Java 2

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

JAVA H13 OISA JAVA 1

自己紹介 氏縄武尊 (Ujinawa Takeru) Work 株式会社オージス総研テミストラクトソリューション部 3 年目 ID 管理 認証周りの開発 OpenID Connect, AWS Private 滋賀県彦根市出身 Copyright 2016 OGIS-

PowerPoint プレゼンテーション

SinfonexIDaaS機能概要書

Prog2_10th

Active Directory フェデレーションサービスとの認証連携

JavaプログラミングⅠ

<4D F736F F F696E74202D204A4E E718F9096BC574795D78BAD89EF8E9197BF5F8CF68A4A97702E >

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

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

自己紹介 氏縄武尊 (Ujinawa Takeru) ThemiStruct 認証技術グループ技術開発 (Inventory 認証等 ) OpenID Connect OpenID Foundation Japan Enterprise Identity WG 2

API( アプリケーションプログラミングインターフェイス ) は 2 つのソフトウェアが相互に通信する際の方式です あなたは通常 ソフトウェアとのインターフェイスにどのようなものを使用しているでしょうか たとえば Web ブラウザ (Web インターフェイス ) を開いて電子メールにアクセスしている

ROBOTID_LINEWORKS_guide

SeciossLink クイックスタートガイド

PowerPoint プレゼンテーション

JavaプログラミングⅠ


Network Programming

Apache ActiveMQ における認証処理不備の脆弱性

PowerPoint Presentation

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

intra-mart WebPlatform/AppFramework

intra-mart Accel Platform — IM-BloomMaker プログラミングガイド   初版  

QualysGuard(R) Release Notes

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

Cloud Gate SSO 携帯端末ID制限

Programming-C-9.key

intra-mart Accel Platform — Office 365 連携プログラミングガイド   初版  

Prog1_10th

SAMBA Stunnel(Windows) 編 1. インストール 1 セキュア SAMBA の URL にアクセスし ログインを行います xxx 部分は会社様によって異なります xxxxx 2 Windows 版ダウンロード ボ

Ver1.10 セコムあんしんログインサービス利用者マニュアル ID パスワード認証 +ワンタイムパスワード認証 (Mac OS X) 2015 年 1 月 26 日 セコムトラストシステムズ株式会社 Copyright SECOM Trust Systems CO.,LTD. All Rights

マークアップ言語

PowerPoint Presentation

プログラミングA

コンピュータ中級B ~Javaプログラミング~ 第3回 コンピュータと情報をやりとりするには?

PowerPoint プレゼンテーション

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

メール利用マニュアル (Web ブラウザ編 ) 1

Prog1_13th

GEC-Java

POWER EGG 3.0 Office365連携

intra-mart Accel Platform — Slack連携モジュール 利用ガイド   初版  

: : : TSTank 2

プログラミング入門1


PowerPoint プレゼンテーション

SAMBA Stunnel(Mac) 編 1. インストール 1 セキュア SAMBA の URL にアクセスし ログインを行います xxxxx 部分は会社様によって異なります xxxxx 2 Mac OS 版ダウンロー

目次 1. 教育ネットひむかファイル転送サービスについて ファイル転送サービスの利用方法 ファイル転送サービスを利用する ( ひむか内 ) ファイル転送サービスへのログイン ひむか内 PCでファイルを送受信する

Microsoft PowerPoint - prog09.ppt

ライセンス管理

Microsoft PowerPoint - prog09.ppt

break 文 switch ブロック内の実行中の処理を強制的に終了し ブロックから抜けます switch(i) 強制終了 ソースコード例ソースファイル名 :Sample7_1.java // 入力値の判定 import java.io.*; class Sample7_1 public stati

デジタル表現論・第6回

JavaプログラミングⅠ

FUJITSU Cloud Service K5 API リファレンスマニュアル Version 1.7 FUJITSU LIMITED

スライド 1

Microsoft PowerPoint - ABC_2011_1_9_yoichiro.pptx

Disclaimer 当資料の位置づけ 当資料は IBM DataPower Gateway (IDG) における OAuth 機能の概要と 実装方法および考慮点をまとめたものです Firmware v を前提としています 注意事項 当資料に含まれる情報は可能な限り正確を期しております

プログラミング入門1

プログラミング基礎I(再)

Transcription:

インフォマート API 利用における OAuth2.0 認証手順 作成日 2017 年 6 月 14 日 更新日 2017 年 9 月 27 日 株式会社インフォマート 1

はじめに インフォマート API の呼び出しには OAuth2.0 による認証を受ける必要があります OAuth2.0 を使うことで インフォマート API を利用するサービスは インフォマートプラットフォーム ID( 1 以下 PFID) とパスワードを保存したり処理したりすることなく PFID を使用した BtoB プラットフォームサービスを利用することが出来ます 本文書では インフォマート API における OAuth2.0 認証の手続き 及び利用手順を説明します 1 インフォマートプラットフォーム ID とは インフォマートの BtoB プラットフォーム ( 受発注や請求書 ) にログインする際に入力するメール アドレス形式の ID のことです 2

1.OAuth2.0 の概要 OAuth とは サードパーティーアプリケーションによる HTTP サービスへのアクセスを可能にする認可フレームワークです サードパーティーアプリケーションでは インフォマートの提供する OAuth2.0 を利用することで ユーザの ID やパスワードをサービスの中に保持する必要なくインフォマートの認可情報を利用することができます OAuth2.0 概念図 3

2. インフォマートにおける OAuth2.0 認証フロー 4

1 認可リクエストインフォマート API を利用するユーザのブラウザに PFID の認証を行うためのページを表示させるためのリクエスト URL になります ユーザはこの認証ページにて PFID のユーザ ID とパスワードを入力すると 利用サービスが用意しているコールバック URL のページへリダイレクトします 認可リクエストの URL https://auth.infomart.co.jp/openam/oauth2/authorize?realm=/api 認可リクエスト入力パラメータ パラメータ 名前 説明 client_id クライアント ID 必須 サービスの申請時に発行されたクライアント ID redirect_uri コールバック URL 必須 PFID の認証後 リダイレクトされるページの URL サービスの申請時に指定した URL と一致する必要がある response_type レスポンスタイプ 必須 許可コードをリクエストするために code を指定する state ステートコード 任意の文字列 ユーザの認可後に行われるリダイレクト時にこの値が含まれます scope スコープ 必須 認証情報のアクセスについて要求する範囲を指定する インフォマート API を利用する場合は 下記を固定で指定 openid profile email qualified access_type アクセス種別 リフレッシュトークンを取得するために 下記を設定する offline リクエストサンプル https://auth.infomart.co.jp/openam/oauth2/authorize?realm=/api& client_id=sample_client_id& redirect_uri=http://xxxx/callback& response_type=code& scope=openid%20profile%20email%20qualified& state=sample_state_code& access_type=offline 5

2 コールバック URL コールバック URL とは インフォマートが ID 認証を行ったユーザのブラウザに対して 許可コードとステートコードとともにリダイレクトする URL です 許可コードは インフォマート API を利用するためのアクセストークンを発行するために使用します 許可コードの有効期間は 120 秒のため 有効期限が切れる前にアクセストークンを発行する必要があります アクセストークンの発行については後述します ステートコードは 認可リクエストを発行した際に設定した値がそのまま返却されます 認可リクエストの値と一致することを確認することで 他者が成りすましで認可リクエストを発行したりすることを防ぎ セキュリティが向上します コールバック URL への出力パラメータ パラメータ 名前 説明 code 許可コード ID 認証が行われた際に発行されるコード アクセストークンの取得に使用する state ステートコード 認可リクエストに設定した値がそのまま設定される リダイレクト URL のイメージ http://xxxx/callback? state=sample_state_code& code=e1a82b2b-c612-4c2c-8a15-a2afc8e7b743 6

3 アクセストークンの発行認可リクエスト後 コールバック URL に渡される認可コードとサービス申請時に発行された インフォマート API を利用するためのアクセストークンとリフレッシュトークンを発行します アクセストークンとリフレッシュトークンは利用サービス内で保存して再利用することで 継続的にインフォマート API を利用することができます アクセストークンの有効期間は 5 分となっており アクセストークンの有効期限が切れた場合 リフレッシュトークンを使用してアクセストークンの再発行をする必要があります アクセストークンの再発行は後述します アクセストークンの発行は Token EndPoint に対して application/x-www-form-urlencoded 形式のリクエストを送信します Token EndPoint の URL https://auth.infomart.co.jp/openam/oauth2/access_token アクセストークン リクエストパラメータ パラメータ 名前 説明 realm 利用区分 /api を設定 grant_type 権限種別 authorization_code を設定 code 許可コード コールバック URL で取得した許可コード redirect_uri コールバック URL 許可リクエストで使用したコールバック URL client_id クライアント ID サービス申請時に発行されたクライアント ID client_secret クライアントシークレット ID サービス申請時に発行されたクライアントシークレット ID リクエストイメージ POST https://auth.infomart.co.jp/openam/oauth2/access_token HTTP/1.1 Host: auth.infomart.co.jp Content-Type: application/x-www-form-urlencoded realm=/api& grant_type=authorization_code& code=e1a82b2b-c612-4c2c-8a15-a2afc8e7b743& redirect_uri=https%3a%2f%2fxxxxx%2ecallback& client_id=sample_client_id& client_secret=sample_secret 7

アクセストークン レスポンス内容 項目 説明 scope アクセストークンの持つスコープ expires_in アクセストークンの有効期限 ( 秒 ) token_type アクセストークンの種類 Bearer 固定 access_token 発行したアクセストークン refresh_token アクセストークンの再発行に使用するリフレッシュトークン アクセストークン レスポンスサンプル {"scope":"openid profile email qualified", "expires_in":300, "token_type":"bearer", "access_token":"db36aeb3-021e-4a51-aaa6-b94c0da4542e", "refresh_token":"f21b49b0-31b0-4441-8cc9-0ef7e14ae738"} 8

4 インフォマート API 呼び出しインフォマート API を呼び出す場合は 発行したアクセストークンを認証リクエストヘッダーに設定することで 認証を行った PFID でインフォマート API の処理を実行することができます リクエストヘッダーには下記の形式で設定してください Authorization: Bearer ACCESS_TOKEN インフォマート API の URL パラメータ等は各サービスのインフォマート API の仕様書をご確認 ください インフォマート API リクエストサンプル POST https://api.infomart.co.jp/sample_api?prm=x HTTP/1.1 Host: api.infomart.co.jp Authorization: Bearer db36aeb3-021e-4a51-aaa6-b94c0da4542e Content-Type: text/xml;charset=utf-8 9

5 期限切れアクセストークンの再発行アクセストークンの有効期限は 5 分となっており 有効期限の切れたアクセストークンは認証に使用できません アクセストークンの有効期限が切れた場合は アクセストークンの発行時に同時に発行されているリフレッシュトークンを用いて アクセストークンの再発行をする必要があります アクセストークンの再発行を行うと リフレッシュトークンも同時に再発行されます リフレッシュトークンの有効期限は 31 日となっており 有効期限が切れる前にリフレッシュトークンを再発行し保持しておく必要があります アクセストークンの再発行は Token EndPoint に対して application/x-www-form-urlencoded 形式のリクエストを送信します Token EndPoint の URI https://auth.infomart.co.jp/openam/oauth2/access_token アクセストークン リクエストパラメータ ( 再発行 ) パラメータ 名前 説明 realm 利用区分 /api を設定 grant_type 権限種別 refresh_token を設定 refresh_token リフレッシュトークン アクセストークンに対応するリフレッシュトークン client_id クライアント ID サービス申請時に発行されたクライアント ID client_secret クライアントシークレット ID サービス申請時に発行されたクライアントシークレット ID リクエストサンプル POST https://auth.infomart.co.jp/openam/oauth2/access_token HTTP/1.1 Host: auth.infomart.co.jp Content-Type: application/x-www-form-urlencoded realm=/api& grant_type=refresh_token& refresh_token= f21b49b0-31b0-4441-8cc9-0ef7e14ae738& client_id=sample_client_id& client_secret=sample_secret 10

アクセストークン レスポンス内容 項目 説明 scope アクセストークンの持つスコープ expires_in アクセストークンの有効期限 ( 秒 ) token_type アクセストークンの種類 Bearer 固定 access_token 発行したアクセストークン refresh_token アクセストークンの再発行に使用するリフレッシュトークン アクセストークン レスポンスサンプル {"scope":"openid profile email qualified", "expires_in":3600, "token_type":"bearer", "access_token":"db36aeb3-021e-4a51-aaa6-b94c0da4542e", "refresh_token":"f21b49b0-31b0-4441-8cc9-0ef7e14ae738"} 11

3. 認証処理実装サンプル (Java) OAuth2.0 の仕様どおりであれば実装のプログラム言語 使用するモジュールは問いません 今回は Java プログラムにおける実装サンプルを提示します サンプルでは Spark Framework と Google URL Shortener API を使用しています public class Sample { public static void main(string... args) { setport(8080); /** * OAuth 認証を行う * クライアント ID とコールバック URL を指定して OAuth 認証ページへリダイレクトする */ get("/auth", (Request request, Response response) -> { }); // 認証 EndPoint とクライアント ID を指定 AuthorizationCodeRequestUrl codeurl = new AuthorizationCodeRequestUrl( "https://auth.infomart.co.jp/openam/oauth2/authorize?realm=/api", "infomart_test"); // リクエストするスコープをセット codeurl.setscopes(arrays.aslist("openid profile qualified")); // 認証 EndPoint から許可コードを要求 codeurl.setresponsetypes(arrays.aslist("code")); // 任意でセッションごとに別々となるステートコードをセット ( セキュリティ担保のため ) codeurl.setstate("this_is_test_state_code"); // nonce をセット ( codeurl.set("nonce", "this_is_one_time_phrase"); // RefreshToken を併せて要求 codeurl.set("access_type", "offline"); // コールバック URL を設定 codeurl.setredirecturi("http://localhost:8080/api/callback.page"); // 認証 EndPoint へリダイレクト response.redirect(codeurl.build()); return null; 12

/** * コールバック処理 * 1 許可コードから AccessToken と RefreshToken を要求する * 2 この場合は そのまま AccessToken を利用できるが * AccessToken は有効期限を短く切っているため * サンプルとして あえて RefreshToken を利用して最新の AccessToken を再発行させる * 3 AccessToken を組み込んで API を呼ぶ */ get("/api/callback.page", (Request request, Response response) -> { /** * 1 の処理 */ // 許可コードとステートコードを取得 String allowcode = request.queryparams("code"); String statecode = request.queryparams("state"); // 許可コードが自身の設定したものかを確認することで // セキュリティの強度が上がるが ここでは処理は割愛する /** * 許可コードを利用して AccessToken と RefreshToken を要求 */ AuthorizationCodeTokenRequest tokenurl = new AuthorizationCodeTokenRequest( new NetHttpTransport(), new JacksonFactory(), new GenericUrl("https://auth.infomart.co.jp/openam/oauth2/access_token?realm=/api"), allowcode ); // authorization_code を指定 tokenurl.setgranttype("authorization_code"); // コールバック URL を設定 tokenurl.setredirecturi("http://localhost:8080/api/callback.page"); // クライアント ID を設定 tokenurl.set("client_id", "infomart_test"); // クライアントシークレット ID を設定 tokenurl.set("client_secret", "XXXXXXXXXX"); ( 次頁に続く ) TokenResponse tr = null; String accesstoken = null; String refreshtoken = null; String idtoken = null; try { tr = tokenurl.execute(); accesstoken = tr.getaccesstoken(); refreshtoken = tr.getrefreshtoken() == null? "null" : tr.getrefreshtoken(); idtoken = (String)tr.get("id_token"); } catch (IOException e) { } finally { tr = null; } 13

}); /** * 2 の処理 */ TokenRequest treq = new TokenRequest( new NetHttpTransport(), new JacksonFactory(), new GenericUrl("https://auth.infomart.co.jp/openam/oauth2/access_token?realm=/api"), "refresh_token" ); treq.set("client_id", "infomart_test"); treq.set("client_secret", "XXXXXXXXXX"); treq.set("refresh_token", refreshtoken); TokenResponse tres = null; try { tres = treq.execute(); // 再発行された AccessToken accesstoken = tres.getaccesstoken(); // ReffeshToken も再発行のセットであることに注意すること refreshtoken = tres.getrefreshtoken(); } catch (IOException e) { } finally { tres = null; } /** * 3 の処理 */ StringBuilder response_all = new StringBuilder(); try { HttpURLConnection con = null; // インフォマート API へのリクエスト URL url = new URL("https://api.infomart.co.jp/sampleapi"); con = (HttpURLConnection)url.openConnection(); con.setrequestmethod("get"); // リクエストヘッダーへのトークン埋め込み con.setrequestproperty("authorization", "Bearer " + accesstoken); con.connect(); try { try (BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"))) { String res; while ((res = reader.readline())!= null) response_all.append(res); } catch (IOException ex) { } } finally { con.disconnect(); } } catch (MalformedURLException ex) { Logger.getLogger(Sample.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(Sample.class.getName()).log(Level.SEVERE, null, ex); } return "AccessToken == " + accesstoken + "<br>" + "RefreshToken == " + refreshtoken + "<br><br>" + response_all.tostring(); } } 14