SlideShare a Scribd company logo
JWTトークン認証つきの
Web APIを作るのは
Grails+Spring Security
REST Pluginを使えば非常
に簡単である件
JGGUG G*WS LT大会 2016/05/13
Copyright (C) 2016 NTT Software Corporation. All rights reserved.
2
自己紹介
上原潤二(@uehaj)
NTTソフトウェア(株)Grails推進室
JGGUG運営委員
書籍:
プログラミングGROOVY(技評)
Grails徹底入門(翔泳社)
ブログ「Grな日々」
Copyright (C) 2016 NTT Software Corporation. All rights reserved. 3
Web APIの認証をどうする?
• セッション・クッキー
• トークンベース認証 ステートレス
スケーラブル
クロスドメイン
疎結合
Copyright (C) 2016 NTT Software Corporation. All rights reserved. 4
Web APIの認証をどうする?
• セッション・クッキー
• トークンベース認証
– 払い出し方式
– 電子署名方式
• OAuth2.0 アクセストークン
• 上記の簡易版としてのJWTアクセストークン使用
簡単
Copyright (C) 2016 NTT Software Corporation. All rights reserved. 5
JWT(JSON Web Token)
• Webアプリでclaimをうけわたすための仕様
(URL-safe)
• OAuth2.0、OpenID Connectの要素技術
• 実体は電子署名+Base64されたJSON
– Authorization: Bearer eyJhbGciOiJIUzI1….
• アクセストークンにも使用できる
• 利点
– 払い出したトークン値の保存管理が不要
– オフライン検証、第三者による検証
Copyright (C) 2016 NTT Software Corporation. All rights reserved.
Spring Security REST plugin
JWTトークンによ
るAPI認証をデ
フォルトで提供
Copyright (C) 2016 NTT Software Corporation. All rights reserved.
以下の流れ
•まずはRESTサーバを動かす
•Spring Securityの設定
•アクセストークンを取得
•アクセストークンを使ってREST APIア
クセス
7
Copyright (C) 2016 NTT Software Corporation. All rights reserved.
まずはRESTサーバを動かす(1)
$ grails create-app restapp3
| Application created at ../restapp3
$ cd restapp3
$ mkdir -p grails-app/domain/sample
$ cat << EOT > grails-app/domain/sample/Book.groovy
package sample
import grails.rest.*
@Resource
class Book {
String title
int price
}
EOT
8
Copyright (C) 2016 NTT Software Corporation. All rights reserved.
まずはRESTサーバを動かす(2)
URLMapping
grails-app/controllers/restapp3/UrlMappings.groovyに以
下を追加
package restapp3
:
static mappings = {
"/api/books"(resources:"book")
9
Copyright (C) 2016 NTT Software Corporation. All rights reserved.
まずはRESTサーバを動かす(3)
動作確認
$ grails run-app
$ curl http://localhost:8080/api/books.json
[]
$ curl -H "Accept: application/json" -H "Content-type:
application/json" -X POST -d '{"title":"title",
"price":100}' http://localhost:8080/api/books.json
{"class":"sample.Book","id":2,"price":100,"title":"title"}
$ curl http://localhost:8080/api/books.json
[{"class":"sample.Book","id":1,"price":100,"title":"title"}
]
$ curl http://localhost:8080/api/books/1.json
{"class":"sample.Book","id":1,"price":100,"title":"title"}
10
Copyright (C) 2016 NTT Software Corporation. All rights reserved.
Spring Securityの設定(1)
build.gradleのdependenciesに以下を設定
compile "org.grails.plugins:spring-security-core:3.0.3"
compile "org.grails.plugins:spring-security-
rest:2.0.0.M2“
11
Copyright (C) 2016 NTT Software Corporation. All rights reserved.
Spring Securityの設定(2)
$ grails run-app
$ grails s2-quickstart sample User Role
$ cat grails-app/conf/BootStrap.groovy
import sample.*
class BootStrap {
def init = { servletContext ->
def adminRole = new Role('ROLE_ADMIN').save()
def userRole = new Role('ROLE_USER').save()
def testUser = new User('me', 'password').save()
UserRole.create testUser, adminRole
UserRole.withSession { it.flush(); it.clear() }
assert User.count() == 1
assert Role.count() == 2
assert UserRole.count() == 1
}
:
12
ユーザ・ロール情報
をDB登録
Copyright (C) 2016 NTT Software Corporation. All rights reserved.
Spring Securityの設定(3)
grails-app/conf/application.groovy に以下を追加
grails.plugin.springsecurity.userLookup.userDomainClassName
= 'sample.User'
grails.plugin.springsecurity.userLookup.authorityJoinClassName
= 'sample.UserRole'
grails.plugin.springsecurity.authority.className
= 'sample.Role'
grails.plugin.springsecurity.controllerAnnotations.staticRules
= [[pattern:'/**', access:['ROLE_USER', 'ROLE_ADMIN']]]
grails.plugin.springsecurity.filterChain.chainMap
= [[ pattern: '/api/**',
filters: 'JOINED_FILTERS,-anonymousAuthenticationFilter,-
exceptionTranslationFilter,-authenticationProcessingFilter,-
securityContextPersistenceFilter,-rememberMeAuthenticationFilter‘ ],
[ pattern: '/**',
filters: 'JOINED_FILTERS,-restTokenValidationFilter,-
restExceptionTranslationFilter‘ ]]
13
APIを呼ぶ権限
その他の権限
Copyright (C) 2016 NTT Software Corporation. All rights reserved.
アクセストークンを取得
$ curl -H "Accept: application/json" -H "Content-type:
application/json" -X POST -d '{"username":"me",
"password":"password"}' http://localhost:8080/api/login
{"username":"me","roles":["ROLE_ADMIN"],"token_typ
e":"Bearer","access_token":"eyJhbGciOiJIUzI1…","e
xpires_in":3600,"refresh_token":"eyJhbGc…"}
14
認証エンドポイント
アクセストークン
(JWT)
リフレッシュトークン
(JWT)
Copyright (C) 2016 NTT Software Corporation. All rights reserved.
アクセストークンを使ってREST API
アクセス
$ curl -H “Accept: application/json” -H “Content-type:
application/json” -H “Authorization: Bearer
eyJhbGciOiJIUzI1…." -X GET
http://localhost:8080/api/books.json
[{"id":1,"price":100,"title":"Book Title"}]
15
Copyright (C) 2016 NTT Software Corporation. All rights reserved.
まとめ
• GrailsでのREST API開発は超簡単
• JWT便利。メール認証などにも。
• トークン無効化が不要ならシンプル
• トークン無効化するにはexpire期限を指定しリ
フレッシュトークンで再発行
– http://stackoverflow.com/questions/196559
11/request-new-access-token-using-
refresh-token-in-username-password-grant-
in-sprin
16
Copyright (C) 2016 NTT Software Corporation. All rights reserved.
参考リンク
• Grails3対応のSpring Securty RESTドキュメント
http://alvarosanchez.github.io/grails-spring-security-
rest/latest/docs/
• Grails2対応のSpring Securty RESTドキュメント
http://alvarosanchez.github.io/grails-spring-security-
rest/1.5.3/docs/guide/index.html
• Grails 3でWeb APIを簡単に作ろう!
https://speakerdeck.com/yamkazu/grails-3deweb-
apiwojian-dan-nizuo-rou
17

More Related Content

PDF
Groovy Bootcamp 2015 by JGGUG
PDF
Groovy Shell Scripting 2015
PDF
Java開発の強力な相棒として今すぐ使えるGroovy
KEY
G* Workshop in fukuoka 20120901
PDF
Introduce Groovy 2.3 trait
PDF
Java SE 9の紹介: モジュール・システムを中心に
PDF
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
PDF
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Groovy Bootcamp 2015 by JGGUG
Groovy Shell Scripting 2015
Java開発の強力な相棒として今すぐ使えるGroovy
G* Workshop in fukuoka 20120901
Introduce Groovy 2.3 trait
Java SE 9の紹介: モジュール・システムを中心に
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例

What's hot (18)

PPTX
Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃん
PDF
インフラ自動化とHashicorp tools
PDF
Reactive Extensionsで非同期処理を簡単に
PDF
linq.js - Linq to Objects for JavaScript
PPTX
RLSを用いたマルチテナント実装 for Django
PDF
Quarkus による超音速な Spring アプリケーション開発
PDF
Head toward Java 16 (Night Seminar Edition)
PDF
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
PDF
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
PDF
Jjug 20140430 gradle_basic
PPT
第4回勉強会 Groovyの文法からSpockまで
PDF
Synthesijer jjug 201504_01
PDF
Introduction to Spock
PDF
キメるClojure
PDF
LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )
PDF
Introduction to JShell: the Java REPL Tool #jjug_ccc #ccc_ab4
PDF
Reactive Webアプリケーション - そしてSpring 5へ #jjug_ccc #ccc_ef3
PDF
Javaのログ出力: 道具と考え方
Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃん
インフラ自動化とHashicorp tools
Reactive Extensionsで非同期処理を簡単に
linq.js - Linq to Objects for JavaScript
RLSを用いたマルチテナント実装 for Django
Quarkus による超音速な Spring アプリケーション開発
Head toward Java 16 (Night Seminar Edition)
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
Jjug 20140430 gradle_basic
第4回勉強会 Groovyの文法からSpockまで
Synthesijer jjug 201504_01
Introduction to Spock
キメるClojure
LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )
Introduction to JShell: the Java REPL Tool #jjug_ccc #ccc_ab4
Reactive Webアプリケーション - そしてSpring 5へ #jjug_ccc #ccc_ef3
Javaのログ出力: 道具と考え方
Ad

Viewers also liked (7)

PDF
Indy(Invokedynamic) and Bytecode DSL and Brainf*ck
PDF
enterprise grails challenge, 2013 Summer
PDF
Shibuya JVM Groovy 20150418
PDF
Read Groovy Compile process(Groovy Benkyoukai 2013)
PDF
New features of Groovy 2.0 and 2.1
PDF
Markup Template Engine introduced Groovy 2.3
PDF
何となく勉強した気分になれるパーサ入門
Indy(Invokedynamic) and Bytecode DSL and Brainf*ck
enterprise grails challenge, 2013 Summer
Shibuya JVM Groovy 20150418
Read Groovy Compile process(Groovy Benkyoukai 2013)
New features of Groovy 2.0 and 2.1
Markup Template Engine introduced Groovy 2.3
何となく勉強した気分になれるパーサ入門
Ad

Similar to Use JWT access-token on Grails REST API (20)

PDF
Microsoft Azure Update 20151112
PDF
VSCodeで始めるAzure Static Web Apps開発
PDF
Java/Androidセキュアコーディング
PPTX
サーバー管理よ、サヨウナラ。サーバーレス アーキテクチャの意義と実践
PDF
Windows コンテナを AKS に追加する
PPTX
Prometheus入門から運用まで徹底解説
PDF
シスコ装置を使い倒す!組込み機能による可視化からセキュリティ強化
PPT
Inside mobage platform
PDF
Microsoft Antimalware for Azure による Azure 仮想マシンの簡易的なマルウェア対策
PDF
[AC11] サーバー管理よ、サヨウナラ。サーバーレスアーキテクチャの意義と実践
PDF
Unityゲームにオンラインランキングとゴースト機能を追加しよう!
PDF
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
PPTX
エンジニアのための Azure 基礎知識
PDF
20150704 MS Azure最新 - innovation egg 第4回
PDF
20150127 jawsug京王線 ec2_config
PDF
ソーシャルアプリ勉強会(第一回資料)配布用
PDF
IETF94 M2M Authentication関連報告
PDF
Building React, Flutter and Blazor development and debugging environment with...
PDF
SCALR OSS版のインストール手順のご紹介 20131204 01
PDF
201312 scalr[oss] installation_idcf
Microsoft Azure Update 20151112
VSCodeで始めるAzure Static Web Apps開発
Java/Androidセキュアコーディング
サーバー管理よ、サヨウナラ。サーバーレス アーキテクチャの意義と実践
Windows コンテナを AKS に追加する
Prometheus入門から運用まで徹底解説
シスコ装置を使い倒す!組込み機能による可視化からセキュリティ強化
Inside mobage platform
Microsoft Antimalware for Azure による Azure 仮想マシンの簡易的なマルウェア対策
[AC11] サーバー管理よ、サヨウナラ。サーバーレスアーキテクチャの意義と実践
Unityゲームにオンラインランキングとゴースト機能を追加しよう!
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
エンジニアのための Azure 基礎知識
20150704 MS Azure最新 - innovation egg 第4回
20150127 jawsug京王線 ec2_config
ソーシャルアプリ勉強会(第一回資料)配布用
IETF94 M2M Authentication関連報告
Building React, Flutter and Blazor development and debugging environment with...
SCALR OSS版のインストール手順のご紹介 20131204 01
201312 scalr[oss] installation_idcf

More from Uehara Junji (20)

PDF
Groovy kisobenkyoukai20130309
PDF
groovy 2.1.0 20130118
PDF
New feature of Groovy2.0 G*Workshop
KEY
JJUG CCC 2012 Real World Groovy/Grails
KEY
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
PDF
Java x Groovy: improve your java development life
KEY
Groovy 1.8の新機能について
PDF
Let's go Developer 2011 sendai Let's go Java Developer (Programming Language ...
KEY
Jggug ws 15th LT 20110224
PDF
Easy Going Groovy 2nd season on DevLOVE
PDF
Easy Going Groovy(Groovyを気軽に使いこなそう)
PDF
GroovyServ concept, how to use and outline.
PDF
Clojure
PDF
Groovy, Transforming Language
KEY
Jggug Nagoya 20090925 Groovy
PDF
Lisp Builder
PDF
G*WS 3rd Lightning talk
PDF
Groovy Now And Future
PDF
Seasar Conference2008 Grails(Final)
PPT
Groovy Conference2008 Nttsoft
Groovy kisobenkyoukai20130309
groovy 2.1.0 20130118
New feature of Groovy2.0 G*Workshop
JJUG CCC 2012 Real World Groovy/Grails
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Java x Groovy: improve your java development life
Groovy 1.8の新機能について
Let's go Developer 2011 sendai Let's go Java Developer (Programming Language ...
Jggug ws 15th LT 20110224
Easy Going Groovy 2nd season on DevLOVE
Easy Going Groovy(Groovyを気軽に使いこなそう)
GroovyServ concept, how to use and outline.
Clojure
Groovy, Transforming Language
Jggug Nagoya 20090925 Groovy
Lisp Builder
G*WS 3rd Lightning talk
Groovy Now And Future
Seasar Conference2008 Grails(Final)
Groovy Conference2008 Nttsoft

Use JWT access-token on Grails REST API

  • 1. JWTトークン認証つきの Web APIを作るのは Grails+Spring Security REST Pluginを使えば非常 に簡単である件 JGGUG G*WS LT大会 2016/05/13
  • 2. Copyright (C) 2016 NTT Software Corporation. All rights reserved. 2 自己紹介 上原潤二(@uehaj) NTTソフトウェア(株)Grails推進室 JGGUG運営委員 書籍: プログラミングGROOVY(技評) Grails徹底入門(翔泳社) ブログ「Grな日々」
  • 3. Copyright (C) 2016 NTT Software Corporation. All rights reserved. 3 Web APIの認証をどうする? • セッション・クッキー • トークンベース認証 ステートレス スケーラブル クロスドメイン 疎結合
  • 4. Copyright (C) 2016 NTT Software Corporation. All rights reserved. 4 Web APIの認証をどうする? • セッション・クッキー • トークンベース認証 – 払い出し方式 – 電子署名方式 • OAuth2.0 アクセストークン • 上記の簡易版としてのJWTアクセストークン使用 簡単
  • 5. Copyright (C) 2016 NTT Software Corporation. All rights reserved. 5 JWT(JSON Web Token) • Webアプリでclaimをうけわたすための仕様 (URL-safe) • OAuth2.0、OpenID Connectの要素技術 • 実体は電子署名+Base64されたJSON – Authorization: Bearer eyJhbGciOiJIUzI1…. • アクセストークンにも使用できる • 利点 – 払い出したトークン値の保存管理が不要 – オフライン検証、第三者による検証
  • 6. Copyright (C) 2016 NTT Software Corporation. All rights reserved. Spring Security REST plugin JWTトークンによ るAPI認証をデ フォルトで提供
  • 7. Copyright (C) 2016 NTT Software Corporation. All rights reserved. 以下の流れ •まずはRESTサーバを動かす •Spring Securityの設定 •アクセストークンを取得 •アクセストークンを使ってREST APIア クセス 7
  • 8. Copyright (C) 2016 NTT Software Corporation. All rights reserved. まずはRESTサーバを動かす(1) $ grails create-app restapp3 | Application created at ../restapp3 $ cd restapp3 $ mkdir -p grails-app/domain/sample $ cat << EOT > grails-app/domain/sample/Book.groovy package sample import grails.rest.* @Resource class Book { String title int price } EOT 8
  • 9. Copyright (C) 2016 NTT Software Corporation. All rights reserved. まずはRESTサーバを動かす(2) URLMapping grails-app/controllers/restapp3/UrlMappings.groovyに以 下を追加 package restapp3 : static mappings = { "/api/books"(resources:"book") 9
  • 10. Copyright (C) 2016 NTT Software Corporation. All rights reserved. まずはRESTサーバを動かす(3) 動作確認 $ grails run-app $ curl http://localhost:8080/api/books.json [] $ curl -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"title":"title", "price":100}' http://localhost:8080/api/books.json {"class":"sample.Book","id":2,"price":100,"title":"title"} $ curl http://localhost:8080/api/books.json [{"class":"sample.Book","id":1,"price":100,"title":"title"} ] $ curl http://localhost:8080/api/books/1.json {"class":"sample.Book","id":1,"price":100,"title":"title"} 10
  • 11. Copyright (C) 2016 NTT Software Corporation. All rights reserved. Spring Securityの設定(1) build.gradleのdependenciesに以下を設定 compile "org.grails.plugins:spring-security-core:3.0.3" compile "org.grails.plugins:spring-security- rest:2.0.0.M2“ 11
  • 12. Copyright (C) 2016 NTT Software Corporation. All rights reserved. Spring Securityの設定(2) $ grails run-app $ grails s2-quickstart sample User Role $ cat grails-app/conf/BootStrap.groovy import sample.* class BootStrap { def init = { servletContext -> def adminRole = new Role('ROLE_ADMIN').save() def userRole = new Role('ROLE_USER').save() def testUser = new User('me', 'password').save() UserRole.create testUser, adminRole UserRole.withSession { it.flush(); it.clear() } assert User.count() == 1 assert Role.count() == 2 assert UserRole.count() == 1 } : 12 ユーザ・ロール情報 をDB登録
  • 13. Copyright (C) 2016 NTT Software Corporation. All rights reserved. Spring Securityの設定(3) grails-app/conf/application.groovy に以下を追加 grails.plugin.springsecurity.userLookup.userDomainClassName = 'sample.User' grails.plugin.springsecurity.userLookup.authorityJoinClassName = 'sample.UserRole' grails.plugin.springsecurity.authority.className = 'sample.Role' grails.plugin.springsecurity.controllerAnnotations.staticRules = [[pattern:'/**', access:['ROLE_USER', 'ROLE_ADMIN']]] grails.plugin.springsecurity.filterChain.chainMap = [[ pattern: '/api/**', filters: 'JOINED_FILTERS,-anonymousAuthenticationFilter,- exceptionTranslationFilter,-authenticationProcessingFilter,- securityContextPersistenceFilter,-rememberMeAuthenticationFilter‘ ], [ pattern: '/**', filters: 'JOINED_FILTERS,-restTokenValidationFilter,- restExceptionTranslationFilter‘ ]] 13 APIを呼ぶ権限 その他の権限
  • 14. Copyright (C) 2016 NTT Software Corporation. All rights reserved. アクセストークンを取得 $ curl -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"username":"me", "password":"password"}' http://localhost:8080/api/login {"username":"me","roles":["ROLE_ADMIN"],"token_typ e":"Bearer","access_token":"eyJhbGciOiJIUzI1…","e xpires_in":3600,"refresh_token":"eyJhbGc…"} 14 認証エンドポイント アクセストークン (JWT) リフレッシュトークン (JWT)
  • 15. Copyright (C) 2016 NTT Software Corporation. All rights reserved. アクセストークンを使ってREST API アクセス $ curl -H “Accept: application/json” -H “Content-type: application/json” -H “Authorization: Bearer eyJhbGciOiJIUzI1…." -X GET http://localhost:8080/api/books.json [{"id":1,"price":100,"title":"Book Title"}] 15
  • 16. Copyright (C) 2016 NTT Software Corporation. All rights reserved. まとめ • GrailsでのREST API開発は超簡単 • JWT便利。メール認証などにも。 • トークン無効化が不要ならシンプル • トークン無効化するにはexpire期限を指定しリ フレッシュトークンで再発行 – http://stackoverflow.com/questions/196559 11/request-new-access-token-using- refresh-token-in-username-password-grant- in-sprin 16
  • 17. Copyright (C) 2016 NTT Software Corporation. All rights reserved. 参考リンク • Grails3対応のSpring Securty RESTドキュメント http://alvarosanchez.github.io/grails-spring-security- rest/latest/docs/ • Grails2対応のSpring Securty RESTドキュメント http://alvarosanchez.github.io/grails-spring-security- rest/1.5.3/docs/guide/index.html • Grails 3でWeb APIを簡単に作ろう! https://speakerdeck.com/yamkazu/grails-3deweb- apiwojian-dan-nizuo-rou 17