Screaming Loud

日々是精進

goaのjwtにおけるscopeに関して

goaのjwtやOAuthにおけるScopeってなんなんだろうと思ったので調べてみた

結論

claimに含まれているscope or scopesで判別

前提

Jwtは.で連結されたbase64encodeの文字列となっています。 3つのパートに分かれており、順番に ヘッダーペイロード署名 となっています。

JSON Web Token(JWT)の紹介とYahoo! JAPANにおけるJWTの活用 - Yahoo! JAPAN Tech Blog

実際にjwtでやってくるリクエストをjwt.ioでデコードすると、分かれて出力されます。 payloadと言われている2番目のパートのことをgoaではclaimと表現しています。

Scope

goaのSecurityではスコープという機能がありますが、そのScopeって何を持って判別しているか分かりませんでした。

セキュリティ · goa :: Design-first API Generation

そこでgoaのソースを読んでみたところ、payloadに含まれる scope もしくは scopes というキーを読んで、対応していれば認可されるという感じでした。

実際のソースでいうとここ

github.com

design部分のコードが以下の場合、

var jwt = JWTSecurity("jwt", func() {
    Scope("api:read", "Provides read access")
})

var _ = Resource("secured", func(){
    Security(jwt, func() { // Use JWT to auth requests to this endpoint
       Scope("api:read") // Enforce presence of "api" scope in JWT claims.
    })
})

Jwt tokenのpayloadに以下のような scope の値が入ってれば認可される

{
  "sub":"23343442",
  "name":"taro",
  "scope":"api:read"
}