Slide 1

Slide 1 text

1 社内CSサービスを支える権限管理について Mercari CS/CRE Tech Talk #1 ISHII Reo @hukurou

Slide 2

Slide 2 text

2 2020/04 新卒でメルカリに入社
 
 CRE CSTool Team
 Software Engineer / Scrum Master
 石井 怜央 / ISHII Reo


Slide 3

Slide 3 text

3 Authorization Tool ● 社内の情報・オペレーション を扱える権限を管理する サービス これから話すこと

Slide 4

Slide 4 text

4 権限管理のマイクロサービス CS tool MOD tool Contact tool Authz tool CS tool その他CS tool 機能 お問い合せ 返信機能 MOD機能 権限管理機能

Slide 5

Slide 5 text

5 なぜAuthzを作っているか 権限管理の仕組みが初期の頃からあまり変わっていない ● RBAC(Role-based access control)っぽい方式 ○ Roleで付与できる権限を制限 ○ Roleに許可されている権限の中で、必要な権限を適宜追加 旧CSToolの権限管理 メンバー 管理者 権限 権限 ロール 権限

Slide 6

Slide 6 text

6 なぜAuthzを作っているか ● 現在の組織の構造が考慮されていない ○ CSの規模の拡大(複数に部署)、Merpayなど ○ 権限の管理者が全メンバーの権限を設定する必要がある ○ 組織やメンバーごとの厳密な権限管理のためには 大量の権限とRoleが必要 ● Microservice化にともない、複数のサービスの権限管理が必要になった 何を解決したいか

Slide 7

Slide 7 text

7 ● サーバーサイド ○ Go ○ gqlgen ● フロントエンド ○ TypeScript ○ React ○ @apollo/client ■ GraphQL client ○ graphql-codegen ■ GraphQL Schemaから型定義を生成するツール ○ Graphql-tag ■ GraphQL queryをパースしてくれるリテラルを提供してくれる Authzの開発

Slide 8

Slide 8 text

8 admin-graphqlとの関係 admin-graphql 各MSのbackend 各MSのfrontend Old CSTool(一部API) Old API 権限を確認 Authz backend Authz frontend

Slide 9

Slide 9 text

9 Authzでの権限管理の構造 管理者がグループを作成し利用可能な権限を設定 ● グループ管理者: 自分のグループのメンバー管理とロールとの紐付け ● ロール管理者: 特定のグループに属さず、各グループにロールを作成 グループ メンバー 管理者 権限 権限 ロール 権限 ロール管理者 グループ管理者 グループごとに使用 できる権限を制限

Slide 10

Slide 10 text

10 Graphqlでの権限管理 Custom directiveを定義しschemaに権限情報を付与 directive @hasPermission(permission: [String!]!) on FIELD_DEFINITION Query { itemCase(id: ID!): ItemCase @hasPermission(permission: [“case:read”]) } type ItemCase { id: ID! name: String! item: Item! @hasPermission(permission: ["item:read"]) } Schemaのイメージ :

Slide 11

Slide 11 text

11 処理の流れ admin-graphql backend frontend Authz backend ①Gatewayで認証し tokenを取得 ② middlewareで Tokenを使って ユーザー情報を取得 ③ “case:read”の権限を 持っていることを確認 ④ 権限を持っているので resolverで処理 query ItemCase{ itemCase(id: 1) { id name } } { permissions: [“case:read”] }

Slide 12

Slide 12 text

12 処理の流れ admin-graphql backend frontend Authz backend ①Gatewayで認証し tokenを取得 ② middlewareで Tokenを使って ユーザー情報を取得 ⑤ "item:read"の権限を 持っていないので Permission Denied ④ ItemCaseの Resolverを処理 query ItemCase{ itemCase(id: 1) { id  item{ id } } } { permissions: [“case:read”] } ③ “case:read”の権限を 持っていることを確認

Slide 13

Slide 13 text

13 なぜAuthzにGraphqlを使用しているのか Admin graphqlとの相性 ● 将来的にFederation gatewayの子サービスになることを想定 ○ 他サービスからも権限の取得がしやすい ■ 権限ごとの画面の情報の出し分けなど Schemaに権限が書かれることによるドキュメントとしての意味

Slide 14

Slide 14 text

14 federationのイメージ federation gateway backend frontend Authz backend admin-graphql 権限を確認

Slide 15

Slide 15 text

15 まとめ ● RBAC+グループという形で、CS組織の構造に合わせた 権限管理サービスを開発 ● Graphqlのdirectiveを用いた権限情報 ○ Schemaにメタ情報として付与 ○ Gateway的なサービスのところでAPIへのアクセスを制限

Slide 16

Slide 16 text

16 ありがとうございました