はじめに
Auth0を使ってJWT認証をしようとしてたがRBACやPermissionの設定等がいまいちわからなかったため検証した。
前提
フロントエンド : Vue 3.0
バックエンド : Java 11
認証サービス : Auth0
バックエンド側はJWTのスコープを見てアクセス制御している。
OKな権限だったらHTTP Status:200, NGな権限だったらHTTP Status:403を返却する
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.mvcMatchers("/api/private-scoped-read").hasAuthority("SCOPE_read:message")
.mvcMatchers("/api/private-scoped-write").hasAuthority("SCOPE_write:message")
.and().cors()
.and().oauth2ResourceServer().jwt();
}
Springの他の実装はSpring Boot API: Authorizationを参照してください
まとめ
Auth0のユーザー権限設定とユーザーの同意の組み合わせ表
RABC : ON
- Add Permissions in the Access TokenがOFFの場合はJWTにPermissionの項目はない
Auth0 | フロント | 認証画面 | API呼び出し結果 HTTP Status | JWT | |||||
---|---|---|---|---|---|---|---|---|---|
API Permission | User Permission | Scope | ユーザーに同意を求める権限 | Read | Write | Scope | Permission | ||
① | read:message write:message |
- | read:message | profile |
403 | 403 | openid profile email | - | |
② | read:message write:message |
read:message | - | profile |
403 | 403 | openid profile email | read:message | |
③ | read:message write:message |
read:message | read:message | profile read:message |
200 | 403 | openid profile email read:message |
read:message | |
④ | read:message write:message |
read:message | write:message | profile |
403 | 403 | openid profile email | read:message | |
⑤ | read:message write:message |
read:message | read:message write:message |
profile read:message |
200 | 403 | openid profile email read:message |
read:message |
- JWTのScopeに設定される値は、Auth0のUserに設定されているかつ同意した権限
- JWTのPermissionに設定される値は、Auth0のUserに設定されている権限
- 同意していない権限もPermissionに設定される
RABC : OFFの場合
- Add Permissions in the Access TokenはONにできない
Auth0 | フロント | 認証画面 | API呼び出し結果 HTTP Status | JWT | |||||
---|---|---|---|---|---|---|---|---|---|
API Permission | User Permission | Scope | ユーザーに同意を求める権限 | Read | Write | Scope | Permission | ||
① | read:message write:message |
- | read:message | profile read:message |
200 | 403 | openid profile email read:message |
- | |
② | read:message write:message |
read:message | - | profile |
403 | 403 | openid profile email | - | |
③ | read:message write:message |
read:message | read:message | profile read:message |
200 | 403 | openid profile email read:message |
- | |
④ | read:message write:message |
read:message | write:message | profile write:message |
403 | 200 | openid profile email write:message |
- | |
⑤ | read:message write:message |
read:message | read:hoge write:message |
profile read:message |
200 | 200 | openid profile email read:message write:message |
- JWTのスコープに設定されるのは同意した権限
- ユーザーに権限がついてなくてもAPIにアクセスできる
JWTのSCOPEに設定される組み合わせ
RBAC | 項目 |
---|---|
ON | User Permission 同意した権限(フロントのscopeで設定した値) |
OFF | 同意した権限(フロントのscopeで設定した値) |
詳細
Auth0の設定
API Permission
このAPIが要求するPermissionを設定する
フロント側でここにない権限をscopeに設定しても認証画面に反映されない
UserのPermission
APIに紐づいてる権限を付与できる。
Role毎の権限も個人毎の権限も設定可能
RBAC
ここでRBACとトークンのON/OFFを設定
トークンをONにするとJWTにpermissionが追加される
フロント側の設定
export const Auth0Plugin = createAuth0({
domain: domain,
client_id: clientId,
redirect_uri: window.location.origin,
audience: audience,
scope: "read:message"
});
scopeにユーザーに許可をもらいたい権限を記載する。複数ある場合はスペース区切り。
フロント側のscopeにread:messageを指定しているので、認証画面にメッセージのread権限を求める項目が表示される
Vueの他の実装はVue: Loginと、The Complete Guide to Vue.js User Authentication with Auth0を参照してください