SlideShare a Scribd company logo
1 of 37
Download to read offline
React(TypeScript) + Go + Auth0
で実現する管理画面
Kenta Endoh. M3, Inc.
2020/01/28
About me
遠藤健太 @en_ken
好きなこと:
サウナ・銭湯、ラジオ、お酒
好きな言語:
TypeScript
- 2020年1月にエムスリー(BIR)入社
- 前職はメーカー開発者
- 組み込み〜Windowsアプリ〜業務支援系
背景
一般論として
- 認証・認可機能を自前で実装するのは負担大
- 実装ミスはセキュリティリスクに直結
- 保守コスト(security update)の負担
BIRの方針として
- 実現したいアンケートごとにマイクロサービスとして
アンケートシステムを構築していく方針
→ 各サービスごとに管理画面の認証・認可機能が必要
3
認証・認可の実現は外部サービスに移譲して
必要な機能実現にエンジニアリソースを集中したい
Auth0
https://auth0.com
Webアプリやモバイルなどに対して認証・認可
機能をクラウドで提供するIDaaS(IDentity as a
Service)ベンダー
- ソーシャルアカウント連携が豊富
- 2021/01/22時点で50以上
- 標準的なSSO連携技術をサポート
- OIDC, SAML, AD etc…
- 多要素認証(MFA)可能
- 導入検討時点では、
Firebase Authは未サポート
4
なんでこの発表するの?
公式ドキュメントは充実
- https://auth0.com/docs
- 言語ごとの実装例も割とあるので実装自体はどうにかなる
一方で、以下の要因でスムーズに導入するは難しい
- Auth0のモデルの理解不足
- 豊富な設定項目から必要な設定のみを行うのが困難
- 英語...
5
Auth0のモデルの概要や最低限必要な設定項目を
中心に整理・紹介します
この発表で話すこと
- シンプルな管理画面(SPA)
ユースケースでの認可実現方法
- Auth0の基本的な設定
- 実装の紹介
この発表で話さないこと
- Auth0が使っている技術の説明
- Json Web Token(JWT), etc...
- 複雑な認証・認可ユースケース
での実現方法
- 多要素認証, etc...
6
2.API呼び出し
(+トークン)
1.認証 トークン
公開鍵取得
3.検証(認可)
App
Auth0
Auth0のトークン
Auth0の発行するトークンには大きく2種類ある
IDトークン(JWT)
Auth0ではあくまで
ユーザー属性情報提供のためのデータという位置づけ
(JWT形式の意味はない気がする...)
アクセストークン(JWT)
検証することで、認可(特定の条件において、
リソースへのアクセス権限を付与すること
)の判断ができる
→ API呼び出しに利用するトークンはこちら
7
2.API呼び出し
(+トークン)
1.認証 トークン
公開鍵取得
3.検証(認可)
App
Auth0
※ ライブラリ(auth0-reactなど)によっては
そもそも生のIDトークンは取れない
※ アクセストークンはaudienceを指定して
リクエストしないとJWT形式にならない
やらなければいけないこと
Auth0の設定
1. Applicationの作成
2. APIの作成
3. Permissionの追加
4. Roleの作成
5. Roleの付与
フロントエンド(React)の実装
1. 認証していなければ Auth0のログインページへリダイレクト
2. API呼び出し時にアクセストークンを取得し Authorizationヘッダに設定
サーバーサイド(Go)の実装
1. Auth0テナント公開鍵の取得
2. 公開鍵によるJWTの検証
3. アプリケーションごとの検証
8
2.API呼び出し
(+トークン)
1.認証 トークン
公開鍵取得
3.検証(認可)
App
Auth0
やらなければいけないこと
Auth0の設定
1. Applicationの作成
2. APIの作成
3. Permissionの追加
4. Roleの作成
5. Roleの付与
フロントエンド(React)の実装
1. 認証していなければ Auth0のログインページへリダイレクト
2. API呼び出し時にアクセストークンを取得し Authorizationヘッダに設定
サーバーサイド(Go)の実装
1. Auth0テナント公開鍵の取得
2. 公開鍵によるJWTの検証
3. アプリケーションごとの検証
9
2.API呼び出し
(+トークン)
1.認証 トークン
公開鍵取得
3.検証(認可)
App
Auth0
Tenant
Auth0のモデル概要
10
Application
API
(= audience)
Permission
(=scope)
Role
User
利用する
アプリケーションを識
別する概念
どのAPIに対し
どのPermissionを
持っているかを定義
認可を必要とする
APIのまとまり
必要な権限
Tenant
Auth0のモデル概要
11
Application
API
(= audience)
Permission
(=scope)
Role
User
1.Userがaudience,scopeを指定して
アクセストークン要求
2. Userに紐づくRoleを取得
3. 指定されたAPI(audience)に対する
指定されたPermission(scope)を
Roleが保有しているかを検証し、
保有していたらアクセストークンを発行
Auth0の設定
1. Applicationの作成
- Single Page Applicationとして作成
- Application URLsの各項目に対象
アプリケーションのURLを設定
12
※2020/01/22時点での設定画面・デフォルト設定をもとにして
います
Auth0の設定
2. APIの作成
APIs -> Settings
- (必要なら)アクセストークンの
有効期限変更
- デフォルトは24h
- RBAC(Role Based Access Control)を有
効
- これをONにしないとユーザーのRole
に基づいて認可されない
13
※2020/01/22時点での設定画面・デフォルト設定をもとにして
います
Auth0の設定
3. Permissionの追加
API -> Permissions
- APIが利用するPermissionの追
加
14
※2020/01/22時点での設定画面・デフォルト設定をもとにして
います
Auth0の設定
4. Roleの作成
- API x Permissionを追加
15
※2020/01/22時点での設定画面・デフォルト設定をもとにして
います
Auth0の設定
5. Roleの付与
- Roleの付与方法はユースケース次第なので詳細は割愛
- 例えば...
- ユーザーが多くない
→ 申請ベースで手動で付与
- 特定条件でデフォルトで付与すべき
Role
→ Ruleでサインアップイベントをフックして付与
- 権限付与が複雑
→ 権限管理画面を作って、Management APIで付与
16
Auth0の設定
Auth0の設定はコード管理可能
- auth0-deploy-cli
https://auth0.com/docs/extensions/deploy-cli-tool
テナントの設定のimport/export可能
- Terraformでもサポート
https://registry.terraform.io/providers/alexkappa/auth0/latest/docs
17
やらなければいけないこと
Auth0の設定
1. Applicationの作成
2. APIの作成
3. Permissionの追加
4. Roleの作成
5. Roleの付与
フロントエンド(React)の実装
1. 認証していなければ Auth0のログインページへリダイレクト
2. API呼び出し時にアクセストークンを取得し Authorizationヘッダに設定
サーバーサイド(Go)の実装
1. Auth0テナント公開鍵の取得
2. 公開鍵によるJWTの検証
3. アプリケーションごとの検証
18
2.API呼び出し
(+トークン)
1.認証 トークン
公開鍵取得
3.検証(認可)
App
Auth0
Reactの実装
- Auth0の公式ライブラリは色々ある
- https://auth0.com/docs/libraries
- 使用するライブラリは@auth0/auth0-react
- SPA向けの@auth0/auth0-spa-jsを更にラップしてhooks化した
もの
19
Reactの実装
import { Auth0Provider } from "@auth0/auth0-react";
// ...
render(
<Auth0Provider
domain={auth0Config.domain}
clientId={auth0Config.clientId}
audience={auth0Config.audience}
scope={auth0Config.scope}
redirectUri={window.location.origin}
>
<DimmingLoaderProvider>
<AuthController>
<App />
</AuthController>
</DimmingLoaderProvider>
</Auth0Provider>,
document.body.querySelector("#root")
);
20
Auth0Providerの設定
- domain, clientId
Applications
-> Settings
-> Basic Information に記載
- audience
APIの識別子
- scope
APIの要求するPermission
- redirectUri
認証後にリダイレクトするURL
→ 現在のURL
@auth0/auth0-react: 1.2.0
Reactの実装
21
import { useAuth0 } from "@auth0/auth0-react";
// ...
const AuthController: React.FC = ({ children }) => {
const loader = useLoader();
const {
isAuthenticated, isLoading, error,
loginWithRedirect, logout, getAccessTokenSilently,
} = useAuth0();
useEffect(() => {
loader.displayLoader(isLoading);
}, [loader, isLoading]);
useEffect(() => {
configureAuthFunc({ getAccessTokenSilently, logout });
}, [getAccessTokenSilently, logout]);
if (isLoading) {
return null;
}
if (!isAuthenticated) {
loginWithRedirect();
return null;
}
if (error) {
return <エラー表示 />;
}
return {children};
};
認証関連処理の実装
- isLoading = falseになるまで
待機
- isAuthenticated = falseなら
ログイン画面にリダイレクト
- isAuthenticated = trueなら
画面を表示
1. 認証していなければ
Auth0のログインページへ
リダイレクト
API呼び出しで使えるように
設定
@auth0/auth0-react: 1.2.0
Reactの実装
22
export const fetchWithAuthz = async (
apiPath: string,
apiConfig: RequestInit
) => {
try {
const token = await getAccessTokenSilently();
apiConfig.headers = {
...apiConfig.headers,
Authorization: `Bearer ${token}`,
};
} catch (e) {
return new Failure(e, "auth error");
}
let resp: Response;
try {
resp = await fetch(apiPath, apiConfig);
} catch (e) {
return new Failure(e, "unknown error");
}
// …
}
API呼び出しの実装例
- getAccessTokenSilently()は呼び
出し時に必ず呼ぶ
- トークンのキャッシュなどは内
部でやってくれる
2. API呼び出し時にアクセス
トークンを取得し、
Authorizationヘッダに設定
@auth0/auth0-react: 1.2.0
やらなければいけないこと
Auth0の設定
1. Applicationの作成
2. APIの作成
3. Permissionの追加
4. Roleの作成
5. Roleの付与
フロントエンド(React)の実装
1. 認証していなければ Auth0のログインページへリダイレクト
2. API呼び出し時にアクセストークンを取得し Authorizationヘッダに設定
サーバーサイド(Go)の実装
1. Auth0テナント公開鍵の取得
2. 公開鍵によるJWTの検証
3. アプリケーションごとの検証
23
2.API呼び出し
(+トークン)
1.認証 トークン
公開鍵取得
3.検証(認可)
App
Auth0
Goの実装
サーバーサイドの実装でやること
1. Auth0テナント公開鍵の取得
2. 公開鍵によるJWTの検証
3. アプリケーションごとの検証
- issuerがAuth0テナントのドメインURLであること(不要かも?)
- audienceに要求するAPI識別子があること
- scopeに要求するPermissionがあること
ミドルウェアとして実現
- アプリケーションによらず処理が共通なので再利用可能
24
Goの実装
ルーティング層
r := chi.NewRouter()
//...
r.Route("/admin", func(r chi.Router) {
//...
r.Route("/api", func(r chi.Router) {
r.Use(auth0util.Auth0Middleware(appConfig.Auth0Config))
//各APIのルーティングの記載
})
})
//...
25
以下を参考に実装
Auth0 Docs
Go Authorization
Create a middleware to validate Access
Tokens
https://auth0.com/docs/quickstart/backend/go
lang/01-authorization#validate-access-tokens
github.com/auth0/go-jwt-middleware v1.0.0
github.com/form3tech-oss/jwt-go v3.2.2
github.com/go-chi/chi v4.1.2+incompatible
Goの実装
Middleware実装①
- go-jwt-middlewareは
auth0のライブラリだが、汎
用的
→ それなりに実装が必要
26
公開鍵取得 URL
import (
//(省略)
jwtmiddleware "github.com/auth0/go-jwt-middleware"
"github.com/form3tech-oss/jwt-go"
)
const ContextTokenKey = "Token"
func Auth0Middleware(auth0Config *config.Auth0Config) func(next
http.Handler) http.Handler {
middleware := jwtmiddleware.New(jwtmiddleware.Options{
ValidationKeyGetter: func(token *jwt.Token) (interface{}, error) {
cert, err := getPemCert(auth0Config.PemCertURL, token)
if err != nil {
return nil, errors.Wrap(err, "公開鍵の取得")
}
result, err := jwt.ParseRSAPublicKeyFromPEM([]byte(cert))
if err != nil {
return nil, errors.Wrap(err, "公開鍵のパース")
}
return result, nil
},
UserProperty: ContextTokenKey,
SigningMethod: jwt.SigningMethodRS256,
})
return func(next http.Handler) http.Handler { /* 検証処理(後述)*/ }
}
検証時、Contextに
このKeyでトークン情報が保存される
公開鍵取得 URL
以下を参考に実装
Auth0 Docs
Go Authorization
Create a middleware to validate Access
Tokens
https://auth0.com/docs/quickstart/backend/go
lang/01-authorization#validate-access-tokens
github.com/auth0/go-jwt-middleware v1.0.0
github.com/form3tech-oss/jwt-go v3.2.2
github.com/go-chi/chi v4.1.2+incompatible
1. Auth0テナント
公開鍵の取得
Goの実装
27
func getPemCert(pemURL string, token *jwt.Token) (string, error) {
resp, err := http.Get(pemURL)
if err != nil {
return "", err
}
defer resp.Body.Close()
var jwks = Jwks{}
if err = json.NewDecoder(resp.Body).Decode(&jwks); err != nil {
return "", err
}
cert := ""
for k := range jwks.Keys {
if token.Header["kid"] == jwks.Keys[k].Kid {
cert = "-----BEGIN CERTIFICATE-----n" + jwks.Keys[k].X5c[0] +
"n-----END CERTIFICATE-----"
}
}
if cert == "" {
return "", errors.New("鍵が見つかりません")
}
return cert, nil
}
Middleware実装②
- 「1.Auth0テナント公開鍵」の
取得の中身
以下を参考に実装
Auth0 Docs
Go Authorization
Create a middleware to validate Access
Tokens
https://auth0.com/docs/quickstart/backend/go
lang/01-authorization#validate-access-tokens
github.com/auth0/go-jwt-middleware v1.0.0
github.com/form3tech-oss/jwt-go v3.2.2
github.com/go-chi/chi v4.1.2+incompatible
Goの実装
公開鍵取得URLは
Applications
-> Settings
-> Advanced Settings
-> Endpoints
-> JSON Web Key Set
28
※2020/01/22時点での設定画面・デフォルト設定をもとにして
います
Goの実装
29
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if err := middleware.CheckJWT(w, r); err != nil {
w.WriteHeader(http.StatusForbidden)
return
}
token := r.Context().Value(ContextTokenKey)
claims := token.(*jwt.Token).Claims.(jwt.MapClaims)
if !verifyAccessTokenClaims(
r.Context(), claims,
auth0Config.Issuer,
auth0Config.Audience,
auth0Config.Scope) {
w.WriteHeader(http.StatusForbidden)
return
}
next.ServeHTTP(w, r)
})
}
}
Auth0のテナントドメイン URL(Issuer)
要求するAPI(Audience)
要求するPermission(Scope)
UserPropertyで指定した
Keyでトークン情報取得
2. 公開鍵による
JWTの検証
Middleware実装③
- 検証処理
github.com/auth0/go-jwt-middleware v1.0.0
github.com/form3tech-oss/jwt-go v3.2.2
github.com/go-chi/chi v4.1.2+incompatible
以下を参考に実装
Auth0 Docs
Go Authorization
Create a middleware to validate Access
Tokens
https://auth0.com/docs/quickstart/backend/go
lang/01-authorization#validate-access-tokens
3. アプリケーション
ごとの検証
Goの実装
30
Middleware実装④
- 「3.クレームの検証」の
中身
func verifyAccessTokenClaims(ctx context.Context, claims jwt.MapClaims,
expIss, expAud, expScope string) bool {
logger := logging.GetLogger(ctx)
if !claims.VerifyIssuer(expIss, true) {
logger.Warn("Issuerが%sではありません", expIss)
return false
}
audience, ok := claims["aud"].([]interface{})
if !ok {
logger.Warn("audクレームがありません")
return false
}
verifyAudience := func() bool {
for _, a := range audience {
if a.(string) == expAud {
return true
}
}
return false
}
if !verifyAudience() {
logger.Warn("Audienceに%sが含まれません", expAud)
return false
}
//次ページへ
以下を参考に実装
Auth0 Docs
Go Authorization
Create a middleware to validate Access
Tokens
https://auth0.com/docs/quickstart/backend/go
lang/01-authorization#validate-access-tokens
github.com/auth0/go-jwt-middleware v1.0.0
github.com/form3tech-oss/jwt-go v3.2.2
github.com/go-chi/chi v4.1.2+incompatible
jwt.MapClaims.VerifyAudience()は
[]stringにキャストしようとして失敗する
ので、自前で検証
ドキュメントの実装だと
issuer,audienceの検証は
ValidationKeyGetter内でやっているが、凝
集度的にはここでやるほうが自然だと思う ...
Goの実装
31
//つづき
scope, ok := claims["scope"].(string)
if !ok {
logger.Warn("scopeクレームがありません")
return false
}
verifyScope := func() bool {
for _, s := range strings.Split(scope, " ") {
if s == expScope {
return true
}
}
return false
}
if !verifyScope() {
logger.Warn("Scopeに%sが含まれません", expScope)
return false
}
return true
}
Middleware実装④
- 「3.クレームの検証」の
中身
以下を参考に実装
Auth0 Docs
Go Authorization
Create a middleware to validate Access
Tokens
https://auth0.com/docs/quickstart/backend/go
lang/01-authorization#validate-access-tokens
github.com/auth0/go-jwt-middleware v1.0.0
github.com/form3tech-oss/jwt-go v3.2.2
github.com/go-chi/chi v4.1.2+incompatible
まとめ
- React(TypeScript) + Goでの
管理画面の認可におけるAuth0の導入方法を紹介
- 設定項目さえ把握できれば導入は容易
- フロントエンドの実装は軽微
- サーバーサイドの実装は再利用できることを考えると、
2つ目以降のアプリケーションでは認証・認可の実装はほとんど
不要
32
“
ありがとうございました。
33
“
APPENDIX
34
Auth0の設定
5. Rule
- Role自動付与したい場合に利用
- ユーザーサインアップ時の
イベントをフックして処理を
する
- 社内のユーザーに特定のロール
を自動付与するケースの実装例
を紹介
35
async function addAdminRole(user, context, callback) {
const ManagementClient = require("auth0@2.30.0").ManagementClient;
if (!user.email || !user.email_verified) {
return callback(null, user, context);
}
const shouldAddRole = function (user, context) {
const assignedRoles = (context.authorization || {}).roles || [];
if (assignedRoles.includes("[付与すべき Role名]")) {
console.log(`${user.name} has already had default roles`);
return false;
}
const endsWith = "@[対象ドメイン ]";
if (
user.email &&
user.email.substring(
user.email.length - endsWith.length,
user.email.length
) === endsWith
) {
return true;
}
return false;
};
//次ページへ
メール確認が
済んでいるかチェック
ロールを付与すべきか判定
Auth0の設定
36
//give default roles if the user doesn't already have any roles assigned
if (shouldAddRole(user, context)) {
try {
const management = new ManagementClient({
token: auth0.accessToken,
domain: auth0.domain,
});
await management.assignRolestoUser(
{ id: user.user_id },
{ roles: ["[付与すべき RoleのID"] }
);
console.log(`Default role has been assigned to ${user.name}.`);
} catch (ex) {
console.error("Failed to add default role to user", ex);
}
}
return callback(null, user, context);
}
ロールの付与
5. Rule
- Role自動付与したい場合に利用
- ユーザーサインアップ時の
イベントをフックして処理を
する
- 社内のユーザーに特定のロール
を自動付与するケースの実装例
を紹介
Auth0の設定
5. Rule
- ロールIDはUI上には表示されな
い
- Roleの設定画面のURLの一部に
表示される
37
※2020/01/22時点での設定画面・デフォルト設定をもとにして
います

More Related Content

What's hot

What's hot (20)

乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
 
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
 
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかシリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
 
AWS Black Belt Online Seminar AWS Amplify
AWS Black Belt Online Seminar AWS AmplifyAWS Black Belt Online Seminar AWS Amplify
AWS Black Belt Online Seminar AWS Amplify
 
アプリ開発で知っておきたい認証技術 - OAuth 1.0 + OAuth 2.0 + OpenID Connect -
アプリ開発で知っておきたい認証技術 - OAuth 1.0 + OAuth 2.0 + OpenID Connect -アプリ開発で知っておきたい認証技術 - OAuth 1.0 + OAuth 2.0 + OpenID Connect -
アプリ開発で知っておきたい認証技術 - OAuth 1.0 + OAuth 2.0 + OpenID Connect -
 
継続使用と新規追加したRedmine Plugin
継続使用と新規追加したRedmine Plugin継続使用と新規追加したRedmine Plugin
継続使用と新規追加したRedmine Plugin
 
こんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツールこんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツール
 
KafkaとPulsar
KafkaとPulsarKafkaとPulsar
KafkaとPulsar
 
ログ管理のベストプラクティス
ログ管理のベストプラクティスログ管理のベストプラクティス
ログ管理のベストプラクティス
 
3分でわかるAzureでのService Principal
3分でわかるAzureでのService Principal3分でわかるAzureでのService Principal
3分でわかるAzureでのService Principal
 
NGINXをBFF (Backend for Frontend)として利用した話
NGINXをBFF (Backend for Frontend)として利用した話NGINXをBFF (Backend for Frontend)として利用した話
NGINXをBFF (Backend for Frontend)として利用した話
 
Swaggerでのapi開発よもやま話
Swaggerでのapi開発よもやま話Swaggerでのapi開発よもやま話
Swaggerでのapi開発よもやま話
 
AWS Black Belt Online Seminar 2016 AWS CloudFormation
AWS Black Belt Online Seminar 2016 AWS CloudFormationAWS Black Belt Online Seminar 2016 AWS CloudFormation
AWS Black Belt Online Seminar 2016 AWS CloudFormation
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
deep dive distributed tracing
deep dive distributed tracingdeep dive distributed tracing
deep dive distributed tracing
 
OAuth / OpenID Connectを中心とするAPIセキュリティについて #yuzawaws
OAuth / OpenID Connectを中心とするAPIセキュリティについて #yuzawawsOAuth / OpenID Connectを中心とするAPIセキュリティについて #yuzawaws
OAuth / OpenID Connectを中心とするAPIセキュリティについて #yuzawaws
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
 
負荷分散だけじゃないELBのメリット
負荷分散だけじゃないELBのメリット負荷分散だけじゃないELBのメリット
負荷分散だけじゃないELBのメリット
 

Similar to React(TypeScript) + Go + Auth0 で実現する管理画面

20220729 AAdK15 C&S 永瀬 A360 API 【配布用】.pdf
20220729 AAdK15 C&S 永瀬 A360 API 【配布用】.pdf20220729 AAdK15 C&S 永瀬 A360 API 【配布用】.pdf
20220729 AAdK15 C&S 永瀬 A360 API 【配布用】.pdf
ssuser033561
 
Google App EngineでTwitterアプリを作ろう
Google App EngineでTwitterアプリを作ろうGoogle App EngineでTwitterアプリを作ろう
Google App EngineでTwitterアプリを作ろう
kenji4569
 
Tech talk salesforce mobile sdk
Tech talk   salesforce mobile sdkTech talk   salesforce mobile sdk
Tech talk salesforce mobile sdk
Kazuki Nakajima
 
勉強会force#3 iOSアプリ開発
勉強会force#3 iOSアプリ開発勉強会force#3 iOSアプリ開発
勉強会force#3 iOSアプリ開発
Kazuki Nakajima
 
[CB16] 難解なウェブアプリケーションの脆弱性 by Andrés Riancho
[CB16] 難解なウェブアプリケーションの脆弱性 by Andrés Riancho[CB16] 難解なウェブアプリケーションの脆弱性 by Andrés Riancho
[CB16] 難解なウェブアプリケーションの脆弱性 by Andrés Riancho
CODE BLUE
 

Similar to React(TypeScript) + Go + Auth0 で実現する管理画面 (20)

Authlete: セキュアな金融 API 基盤の実現と Google Cloud の活用 #gc_inside
Authlete: セキュアな金融 API 基盤の実現と Google Cloud の活用 #gc_insideAuthlete: セキュアな金融 API 基盤の実現と Google Cloud の活用 #gc_inside
Authlete: セキュアな金融 API 基盤の実現と Google Cloud の活用 #gc_inside
 
初めてのAuth0ハンズオン
初めてのAuth0ハンズオン初めてのAuth0ハンズオン
初めてのAuth0ハンズオン
 
plusbenlly meetiup how-to-use
plusbenlly meetiup how-to-useplusbenlly meetiup how-to-use
plusbenlly meetiup how-to-use
 
[AWS DevDay] Cognito / Amplify で加速するエンタープライズのアプリケーション開発
[AWS DevDay] Cognito / Amplify で加速するエンタープライズのアプリケーション開発[AWS DevDay] Cognito / Amplify で加速するエンタープライズのアプリケーション開発
[AWS DevDay] Cognito / Amplify で加速するエンタープライズのアプリケーション開発
 
How FIDO Works
How FIDO WorksHow FIDO Works
How FIDO Works
 
20220729 AAdK15 C&S 永瀬 A360 API 【配布用】.pdf
20220729 AAdK15 C&S 永瀬 A360 API 【配布用】.pdf20220729 AAdK15 C&S 永瀬 A360 API 【配布用】.pdf
20220729 AAdK15 C&S 永瀬 A360 API 【配布用】.pdf
 
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るSpring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作る
 
Google App EngineでTwitterアプリを作ろう
Google App EngineでTwitterアプリを作ろうGoogle App EngineでTwitterアプリを作ろう
Google App EngineでTwitterアプリを作ろう
 
「金融API向けOAuth」にみるOAuthプロファイリングの実際 #secjaws #finsecjaws01 #oauth #oidc #api
「金融API向けOAuth」にみるOAuthプロファイリングの実際 #secjaws #finsecjaws01 #oauth #oidc #api「金融API向けOAuth」にみるOAuthプロファイリングの実際 #secjaws #finsecjaws01 #oauth #oidc #api
「金融API向けOAuth」にみるOAuthプロファイリングの実際 #secjaws #finsecjaws01 #oauth #oidc #api
 
Whats new in_a360-19-20_jp
Whats new in_a360-19-20_jpWhats new in_a360-19-20_jp
Whats new in_a360-19-20_jp
 
Tech talk salesforce mobile sdk
Tech talk   salesforce mobile sdkTech talk   salesforce mobile sdk
Tech talk salesforce mobile sdk
 
OAuth2.0によるWeb APIの保護
OAuth2.0によるWeb APIの保護OAuth2.0によるWeb APIの保護
OAuth2.0によるWeb APIの保護
 
Introduction to application architecture on asp.net mvc
Introduction to application architecture on asp.net mvcIntroduction to application architecture on asp.net mvc
Introduction to application architecture on asp.net mvc
 
プロトコルから見るID連携
プロトコルから見るID連携プロトコルから見るID連携
プロトコルから見るID連携
 
Go_SaaS-Auth0-20190920
Go_SaaS-Auth0-20190920Go_SaaS-Auth0-20190920
Go_SaaS-Auth0-20190920
 
勉強会force#3 iOSアプリ開発
勉強会force#3 iOSアプリ開発勉強会force#3 iOSアプリ開発
勉強会force#3 iOSアプリ開発
 
認証機能で学ぶ Laravel 5 アプリケーション
認証機能で学ぶ Laravel 5 アプリケーション認証機能で学ぶ Laravel 5 アプリケーション
認証機能で学ぶ Laravel 5 アプリケーション
 
FAPI (Financial-grade API) and CIBA (Client Initiated Backchannel Authenticat...
FAPI (Financial-grade API) and CIBA (Client Initiated Backchannel Authenticat...FAPI (Financial-grade API) and CIBA (Client Initiated Backchannel Authenticat...
FAPI (Financial-grade API) and CIBA (Client Initiated Backchannel Authenticat...
 
[CB16] 難解なウェブアプリケーションの脆弱性 by Andrés Riancho
[CB16] 難解なウェブアプリケーションの脆弱性 by Andrés Riancho[CB16] 難解なウェブアプリケーションの脆弱性 by Andrés Riancho
[CB16] 難解なウェブアプリケーションの脆弱性 by Andrés Riancho
 
LINEログインの最新アップデートとアプリ連携ウォークスルー
LINEログインの最新アップデートとアプリ連携ウォークスルーLINEログインの最新アップデートとアプリ連携ウォークスルー
LINEログインの最新アップデートとアプリ連携ウォークスルー
 

React(TypeScript) + Go + Auth0 で実現する管理画面