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
Microservices /w Spring Security OAuth
PDF
Spring bootでweb セキュリティ(ログイン認証)編
PDF
OAuth2.0によるWeb APIの保護
PPTX
Spring Security 4.1 の新機能
PPTX
Webアプリ開発実践tips共有会
PDF
どこよりも早い Spring Boot 1.2 解説 #渋谷Java
PDF
OAuth 2.0のResource Serverの作り方
PDF
「金融API向けOAuth」にみるOAuthプロファイリングの実際 #secjaws #finsecjaws01 #oauth #oidc #api
PDF
株式会社カサレアル 山本による講演「認証・認可におけるKeycloakの活用」の資料
PDF
AWS Black Belt Online Seminar 2017 AWSにおけるアプリ認証パターンのご紹介
PDF
OAuth / OpenID Connectを中心とするAPIセキュリティについて #yuzawaws
PDF
API提供におけるOAuthの役割 #apijp
PPTX
2013.01.18 G*Workshop GGX 2012 Report
PDF
Grails 2.0.0.M1の話
PPTX
Spring Fest 2017 「エンタープライズで利用するSpring Boot」#jsug #sf_h1
PDF
OpenStack Study#9 JOSUG
PDF
OAuth 2.0 MAC Authentication
PDF
Apache Axis2におけるXML署名検証不備
PPTX
NGINXでの認可について考える
PPTX
FAPI and beyond - よりよいセキュリティのために
Microservices /w Spring Security OAuth
Spring bootでweb セキュリティ(ログイン認証)編
OAuth2.0によるWeb APIの保護
Spring Security 4.1 の新機能
Webアプリ開発実践tips共有会
どこよりも早い Spring Boot 1.2 解説 #渋谷Java
OAuth 2.0のResource Serverの作り方
「金融API向けOAuth」にみるOAuthプロファイリングの実際 #secjaws #finsecjaws01 #oauth #oidc #api
株式会社カサレアル 山本による講演「認証・認可におけるKeycloakの活用」の資料
AWS Black Belt Online Seminar 2017 AWSにおけるアプリ認証パターンのご紹介
OAuth / OpenID Connectを中心とするAPIセキュリティについて #yuzawaws
API提供におけるOAuthの役割 #apijp
2013.01.18 G*Workshop GGX 2012 Report
Grails 2.0.0.M1の話
Spring Fest 2017 「エンタープライズで利用するSpring Boot」#jsug #sf_h1
OpenStack Study#9 JOSUG
OAuth 2.0 MAC Authentication
Apache Axis2におけるXML署名検証不備
NGINXでの認可について考える
FAPI and beyond - よりよいセキュリティのために

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