diff --git a/.github/workflows/backend-lint.yml b/.github/workflows/backend-lint.yml new file mode 100644 index 0000000..4de9ec3 --- /dev/null +++ b/.github/workflows/backend-lint.yml @@ -0,0 +1,47 @@ +name: Backend Lint + +on: + push: + branches: + - main + pull_request: + paths: + - 'member-portal-backend/**' + +permissions: + statuses: write + contents: read + pull-requests: write + + +jobs: + golangci: + name: lint + runs-on: ubuntu-latest + steps: + - name: Set commit status as pending + uses: myrotvorets/set-commit-status-action@master + with: + token: ${{ secrets.GITHUB_TOKEN }} + status: pending + context: Check pull request (Backend) + + - uses: actions/checkout@v4 + + - uses: actions/setup-go@v5 + with: + go-version: stable + + - name: golangci-lint + uses: golangci/golangci-lint-action@v6 + with: + working-directory: member-portal-backend + version: v1.60 + + - name: Set final commit status + uses: myrotvorets/set-commit-status-action@master + if: always() + with: + token: ${{ secrets.GITHUB_TOKEN }} + status: ${{ job.status }} + context: Check pull request (Backend) \ No newline at end of file diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cfe8f9a..b8a9ad5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -36,7 +36,7 @@ jobs: platforms: linux/amd64 push: true tags: | - ghcr.io/kstm-su/member-portal/${{ matrix.tag }}:latest - ghcr.io/kstm-su/member-portal/${{ matrix.tag }}:${{ env.GITHUB_SHA_SHORT }} + ghcr.io/${{GITHUB_REPOSITORY_OWNER}}/member-portal/${{ matrix.tag }}:latest + ghcr.io/${{GITHUB_REPOSITORY_OWNER}}/member-portal/${{ matrix.tag }}:${{ env.GITHUB_SHA_SHORT }} cache-from: type=gha,scope=member-portal-${{ matrix.tag }} cache-to: type=gha,mode=max,scope=member-portal-${{ matrix.tag }} diff --git a/.github/workflows/docs-deploy.yml b/.github/workflows/docs-deploy.yml index d61a59d..24476c5 100644 --- a/.github/workflows/docs-deploy.yml +++ b/.github/workflows/docs-deploy.yml @@ -15,21 +15,12 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: - python-version: "3.12" - - name: install pipenv - run: | - python -m pip install --upgrade pip - python -m pip install pipenv - - - name: lock package version - run: pipenv lock - - - name: install packages - run: pipenv sync --dev + python-version: 3.12 + - run: | + pip install mkdocs-material - name: copy swagger run: | - rm -r docs/docs/swagger 2> /dev/null - cp -r -f swagger docs/docs/swagger + cp -r -f ./swagger ./docs/docs/swagger - - run: pipenv shell mkdocs gh-deploy --force --config-file ./docs/mkdocs.yml \ No newline at end of file + - run: mkdocs gh-deploy --config-file ./docs/mkdocs.yml \ No newline at end of file diff --git a/.github/workflows/lint.yml b/.github/workflows/front-lint.yml similarity index 51% rename from .github/workflows/lint.yml rename to .github/workflows/front-lint.yml index c51fbd8..56fd40b 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/front-lint.yml @@ -1,4 +1,4 @@ -name: Check pull request +name: Frontend Lint on: workflow_dispatch: @@ -15,11 +15,17 @@ defaults: run: working-directory: member-portal-frontend - jobs: eslint: runs-on: ubuntu-latest steps: + - name: Set commit status as pending + uses: myrotvorets/set-commit-status-action@master + with: + token: ${{ secrets.GITHUB_TOKEN }} + status: pending + context: Check pull request (Frontend) + - uses: actions/checkout@v4 - uses: actions/setup-node@v4 @@ -33,6 +39,14 @@ jobs: - uses: reviewdog/action-eslint@v1 with: github_token: ${{ secrets.GITHUB_TOKEN }} - reporter: github-pr-review # Change reporter. + reporter: github-pr-review workdir: member-portal-frontend - fail_on_error: 'true' \ No newline at end of file + fail_on_error: 'true' + + - name: Set final commit status + uses: myrotvorets/set-commit-status-action@master + if: always() + with: + token: ${{ secrets.GITHUB_TOKEN }} + status: ${{ job.status }} + context: Check pull request (Frontend) \ No newline at end of file diff --git a/.gitignore b/.gitignore index 6879dab..40347e7 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,7 @@ docs/docs/swagger docs/site -.idea \ No newline at end of file +.idea + +member-portal-backend/app/** +member-portal-backend/app-local/** \ No newline at end of file diff --git a/README.md b/README.md index 5d66657..bb8b605 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # member-portal kstmメンバーであることを確認し、また事務処理を簡潔化するためのポータルサイト +[Wiki](https://kstm-su.github.io/member-portal/) + ## Frontend ### Docker起動方法 1. Dockerfileのあるディレクトリに移動 @@ -10,7 +12,7 @@ kstmメンバーであることを確認し、また事務処理を簡潔化す ※ ローカルで起動する場合は、`npm run dev` を実行 -## Backend +## Backend ### Docker起動方法 1. Dockerfileのあるディレクトリに移動 @@ -29,4 +31,7 @@ kstmメンバーであることを確認し、また事務処理を簡潔化す ### Mockサーバーの立て方 1. `swagger/README.md` の "Getting started" の手順を行う 2. "Mock API" の手順を `documentation.yml` と同じディレクトリにて行う -3. `http://localhost:4010`にモックサーバーが立つ \ No newline at end of file +3. `http://localhost:4010`にモックサーバーが立つ + + + diff --git a/docs/Pipfile b/docs/Pipfile deleted file mode 100644 index 8a121dd..0000000 --- a/docs/Pipfile +++ /dev/null @@ -1,14 +0,0 @@ -[[source]] -url = "https://pypi.org/simple" -verify_ssl = true -name = "pypi" - -[packages] -mkdocs-material = "*" - -[dev-packages] - -[scripts] -serve = "mkdocs serve" -build = "mkdocs build" -deploy = "mkdocs gh-deploy" diff --git a/docs/docs/backend/config.md b/docs/docs/backend/config.md new file mode 100644 index 0000000..920ce84 --- /dev/null +++ b/docs/docs/backend/config.md @@ -0,0 +1,38 @@ +# コンフィグの設定について + +```yaml +database: + type: sqlite + sqlite: + path: /app/data/db.sqlite3 +file: + base: /app/data +jwt: + issuer: localhost + key: + private_key: private.pem + public_key: public.pem + key_id: key + realm: localhost +password: + algorithm: argon2 + pepper: #自動で生成されるため、設定不要 +server: + host: localhost + port: 8080 +``` + +## database +postgresqlを利用する場合、以下のように設定を変更してください。 + +```yaml +database: + type: postgres + postgres: + host: db + port: 5432 + user: + password: +``` + + diff --git a/docs/docs/backend/feature.md b/docs/docs/backend/feature.md new file mode 100644 index 0000000..deec212 --- /dev/null +++ b/docs/docs/backend/feature.md @@ -0,0 +1,21 @@ +# 実装機能 + +- [x] OAuth2認可 + - [x] 認可コード取得 + - [x] アクセストークン取得 + - [x] リフレッシュトークン取得 + - [ ] トークン削除 + - [ ] トークン情報取得 + - [ ] トークン有効性確認 + - [ ] クライアント作成 +- [ ] OpenID Connect認証 + - [x] クライアント情報取得 + - [ ] ユーザー情報取得 + - [ ] ユーザー情報更新 +- [ ] ユーザー情報取得API + - [x] プロフィール取得(OIDC クライアント情報取得と同一) + - [ ] ユーザー情報更新 + - [ ] 新規ユーザー登録 + - [ ] ユーザーリスト取得 + - [ ] お知らせ取得 + - [ ] お知らせ更新 \ No newline at end of file diff --git a/docs/docs/backend/index.md b/docs/docs/backend/index.md new file mode 100644 index 0000000..aaaa290 --- /dev/null +++ b/docs/docs/backend/index.md @@ -0,0 +1,27 @@ +# バックエンドについて + +## バックエンドの概要 + +バックエンドはGo言語で実装されています。 +OAuth2およびOpenID Connectを使用して認可・認証を行い、ユーザー情報を渡すAPIを提供します。 + +## 起動方法 + +### Dockerでの起動方法 +#### Localでビルドする場合 + +1. Dockerfileのあるディレクトリに移動 +2. `docker build -t .` を実行(image_nameは自由に設定) +3. `docker run -p 3001:8080 -d ` を実行 +4. `http://localhost:3001` にアクセス + +#### GitHub container registryからpullする場合 +1. `docker pull ghcr.io/kstm-su/member-portal/backend:latest` を実行 +2. `docker run -p 3001:8080 -d ghcr.io/kstm-su/member-portal/backend:latest` を実行 +3. `http://localhost:3001` にアクセス + +### Goでローカルで起動する場合 +1. `cd member-portal-backend` でディレクトリに移動 +2. `go run main.go` を実行 +3. `http://localhost:8080` にアクセス + diff --git a/docs/docs/backend/technology-stack.md b/docs/docs/backend/technology-stack.md new file mode 100644 index 0000000..4800331 --- /dev/null +++ b/docs/docs/backend/technology-stack.md @@ -0,0 +1,41 @@ +# 技術スタック + +## 採用ライブラリ + +Web framework: [echo](https://echo.labstack.com/)
+採用理由: openapi-generatorを利用することを想定し、親和性の高いechoを採用。 + +ORM: [gorm](https://gorm.io/)
+採用理由: GitHubのスター数が多く、開発者が多いため。 + +Command line tool: [cobra](https://cobra.dev/)
+採用理由: サブコマンドの実装が容易であるため また、k8sでも採用されているため、 + +Config: [viper](https://github.com/spf13/viper)
+採用理由: cli toolとして採用した、cobraとの親和性が高いため、 + +## 依存ソフトウェア + +Language: [Go](https://golang.org/)
+採用理由: 本プロジェクトの言語として採用。 + +Linter & Formatter: [golangci-lint](https://golangci-lint.run/)
+採用理由: GitHubのスター数が多く、開発者が多いため。また、複数のlinterを統合しているため。 + +Database: [PostgreSQL](https://www.postgresql.org/) [Optional]
+採用理由: 慣習的に利用されるため。 また、ORMのgormが対応しているため。 (ConfigでSQLite3を利用することも可能) + +Secret Manager(検討中): [Hashicorp Vault](https://www.vaultproject.io/) 
+採用理由: シークレット管理のため
+利用場面: パスワードハッシュ化時のpepperの管理および、OAuth2クライアントのシークレット管理の際に利用のため。
+その他の候補: [Cyber Ark conjur](https://www.conjur.org/), [Infisical](https://infisical.com/) + +Object storage: [MinIO](https://min.io/) [Optional]
+採用理由: S3互換のため。 + + + + + + + diff --git a/docs/docs/common/about-this.md b/docs/docs/common/about-this.md new file mode 100644 index 0000000..2847465 --- /dev/null +++ b/docs/docs/common/about-this.md @@ -0,0 +1,43 @@ +# 当ドキュメントについて + +このドキュメントは、[MkDocs-material](https://squidfunk.github.io/mkdocs-material/)を使用して作成されました。 + +## 目的 + +今後の開発の参入障壁を低くするために、どのような技術スタックを利用し、何を目的としているかを示すため。 + +## 編集するには +`docs/docs`にドキュメントの本体が配置されているため、そちらを編集してください。
+また、新たにファイルを追加する場合は、`mkdocs.yml`にある`nav`に追加してください。 + +## 表示方法 + +### ローカルでの表示 + +以下のコマンドを実行することで、ローカルでの表示が可能です。 + +#### 事前準備 + +```bash +pip install mkdocs-material +``` + +#### Linux + +```bash +cd docs +./start.sh +``` + +#### Windows + +`docs/docs`に`swagger`をコピーしたのち、以下のコマンドを実行してください。 + +```bash +cd docs +mkdocs serve +``` + +### GitHub Pagesでの表示 + +GitHub Pagesでの表示は、[こちら](https://kstm-su.github.io/member-portal/)からご覧いただけます。 \ No newline at end of file diff --git a/docs/docs/common/api-docs.md b/docs/docs/common/api-docs.md new file mode 100644 index 0000000..df97d28 --- /dev/null +++ b/docs/docs/common/api-docs.md @@ -0,0 +1,24 @@ +# APIドキュメントについて + +## 目的 +OpenAPIを利用してAPIドキュメントを作成することで、フロントエンドとバックエンドの実装を隠蔽し、APIの定義をインターフェースとして利用することにより、開発効率を向上させる。 + +## 仕様 +- OpenAPI 3.0.0 +- ファイル形式: YAML +- ファイル名: documentation.yaml +- ファイルの配置場所: /swagger + +## ファイル構成 +`/components`: OpenAPIのコンポーネントを定義する
+`/paths`: APIのエンドポイントを定義する
+`documentation.yaml`: OpenAPIの定義を記述するファイル + +## APIドキュメントの確認方法 +### Github Pagesで確認する方法 +masterブランチのAPIドキュメントについては[こちら](/member-portal/redoc/index.html)で確認できます。 + +### ローカルで確認する方法 +1. `cd swagger`で`swagger`ディレクトリに移動します +2. `npx @redocly/cli preview-docs documentation.yml`を実行します +3. `http://localhost:8080/`にアクセス \ No newline at end of file diff --git a/docs/docs/frontend/index.md b/docs/docs/frontend/index.md new file mode 100644 index 0000000..028f4a3 --- /dev/null +++ b/docs/docs/frontend/index.md @@ -0,0 +1,27 @@ +# フロントエンドについて + +## フロントエンドの概要 + +Next.jsを使用し、backendと連携して動作するフロントエンドです。 +メンバーの管理および、メンバーの情報を表示するためのページを提供します。 + +## 起動方法 + +### Dockerでの起動方法 +#### Localでビルドする場合 + +1. Dockerfileのあるディレクトリに移動 +2. `docker build -t .` を実行(image_nameは自由に設定) +3. `docker run -p 3000:3000 -d ` を実行 +4. `http://localhost:3000` にアクセス + +#### GitHub container registryからpullする場合 +1. `docker pull ghcr.io/kstm-su/member-portal/frontend:latest` を実行 +2. `docker run -p 3000:3000 -d ghcr.io/kstm-su/member-portal/frontend:latest` を実行 +3. `http://localhost:3000` にアクセス + +### Nodeでローカルで起動する場合 +1. `cd member-portal-frontend` でディレクトリに移動 +2. `npm run dev` を実行 +3. `http://localhost:3000` にアクセス + diff --git a/docs/docs/frontend/technology-stack.md b/docs/docs/frontend/technology-stack.md new file mode 100644 index 0000000..ff5fb36 --- /dev/null +++ b/docs/docs/frontend/technology-stack.md @@ -0,0 +1,25 @@ +# 技術スタック + +## 採用ライブラリ + +Web framework: [Next.js](https://nextjs.org/)
+採用理由: Reactのフレームワークとして幅広く利用されているため。 + +UI framework: [shadcn](https://ui.shadcn.com/)
+採用理由: Headless UIであるradix-uiを利用しており、styleについてtailwindcssを利用しているため。 + +## 依存ソフトウェア + +Language: [Typescript](https://www.typescriptlang.org/)
+採用理由: 本プロジェクトの言語として採用。 + +Runtime: [Node.js](https://nodejs.org/)
+採用理由: Next.jsの開発環境として採用されているため。 + +Linter : [eslint](https://eslint.org/)
+採用理由: コードの品質を保つため。また、Next.jsのデフォルトの設定として採用されているため。 + + + + + diff --git a/docs/docs/index.md b/docs/docs/index.md index e8325b3..9f4e8e1 100644 --- a/docs/docs/index.md +++ b/docs/docs/index.md @@ -1,46 +1,30 @@ +title: Home + # Member portalとは kstmメンバーであることを確認し、また事務処理を簡潔化するためのポータルサイトです。 -## Common -### Redoc(OpenAPI)にアクセスするには -[Redoc](redoc) - -## Frontend -### Dockerでの起動方法 -#### Localでビルドする場合 -1. Dockerfileのあるディレクトリに移動 -2. `docker build -t .` を実行(image_nameは自由に設定) -3. `docker run -p 3000:3000 -d ` を実行 -4. `http://localhost:3000` にアクセス - -#### GitHub container registryからpullする場合 -1. `docker pull ghcr.io/kstm-su/member-portal/frontend:latest` を実行 -2. `docker run -p 3000:3000 -d ghcr.io/kstm-su/member-portal/frontend:latest` を実行 -3. `http://localhost:3000` にアクセス - -### Nodeでローカルで起動する場合 -1. `cd member-portal-frontend` でディレクトリに移動 -2. `npm install` を実行 -3. `npm run dev` を実行 -4. `http://localhost:3000` にアクセス - - -## Backend - -### Dockerでの起動方法 -#### Localでビルドする場合 - -1. Dockerfileのあるディレクトリに移動 -2. `docker build -t .` を実行(image_nameは自由に設定) -3. `docker run -p 3001:8080 -d ` を実行 -4. `http://localhost:3001` にアクセス - -#### GitHub container registryからpullする場合 -1. `docker pull ghcr.io/kstm-su/member-portal/backend:latest` を実行 -2. `docker run -p 3001:8080 -d ghcr.io/kstm-su/member-portal/backend:latest` を実行 -3. `http://localhost:3001` にアクセス - -### Goでローカルで起動する場合 -1. `cd member-portal-backend` でディレクトリに移動 -2. `go run main.go` を実行 -3. `http://localhost:8080` にアクセス +## APIエンドポイントについて + +### APIドキュメント確認方法 + + + +### Mockサーバーの立て方 +#### Mockサーバーとは + +APIのエンドポイントを実際に立てずに、APIのレスポンスをモックで返すサーバーのことです。 + +#### 立て方 +1. `swagger/README.md` の "Getting started" の手順を行う +2. "Mock API" の手順を `documentation.yml` と同じディレクトリにて行う +3. `http://localhost:4010`にモックサーバーが立つ + +## 依存ソフトウェア + +API Docmentation: [redocly cli](https://redocly.com/docs/cli)
+採用理由 : openapi形式のドキュメントを生成および表示するため。
+利用場面: apiのドキュメント生成および表示 + +Container runtime: [Docker](https://www.docker.com/)
+採用理由: 事実上のデファクトスタンダードであるため。 + diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 4f040cb..8f7874b 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -27,7 +27,23 @@ markdown_extensions: anchor_linenums: true - pymdownx.inlinehilite - pymdownx.superfences - + - pymdownx.tasklist: + custom_checkbox: true +nav: + - Home: + - 初めに: index.md + - Backend: + - セットアップ: backend/index.md + - 実装機能: backend/feature.md + - コンフィグ: backend/config.md + - 技術スタック: backend/technology-stack.md + - Frontend: + - セットアップ: frontend/index.md + - 技術スタック: frontend/technology-stack.md + - Common: + - APIドキュメント: common/api-docs.md + - 当ドキュメントについて: common/about-this.md + - Redocly: redoc/index.html plugins: - search: lang: ja diff --git a/docs/start.sh b/docs/start.sh index c8d3dc9..10817ce 100644 --- a/docs/start.sh +++ b/docs/start.sh @@ -1,3 +1,3 @@ -rm -r docs/swagger 2> /dev/null -cp -r -f ../swagger docs/swagger -pipenv shell mkdocs serve +rm -r ./docs/swagger 2> /dev/null +cp -r -f ../swagger ./docs/swagger +mkdocs serve diff --git a/member-portal-backend/Dockerfile b/member-portal-backend/Dockerfile index bc92ebe..9f3bca2 100644 --- a/member-portal-backend/Dockerfile +++ b/member-portal-backend/Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM golang:1.22.4 as build +FROM --platform=$BUILDPLATFORM golang:1.22.4 AS build RUN mkdir /storage WORKDIR /go/src/github.com/kstm-su/Member-Portal/backend/ @@ -26,7 +26,6 @@ WORKDIR /app EXPOSE 8080 COPY --from=build /storage/ /app/storage/ -VOLUME /app/storage COPY --from=build /go/src/github.com/kstm-su/Member-Portal/backend/public /app/public diff --git a/member-portal-backend/clients/example_client.json b/member-portal-backend/clients/example_client.json deleted file mode 100644 index 4553a4e..0000000 --- a/member-portal-backend/clients/example_client.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "clientId": "example_client", - "clientName": "Example Client", - "redirectUri": "http://localhost:3000/callback", - "applicationName": "Example Application" -} diff --git a/member-portal-backend/cmd/root.go b/member-portal-backend/cmd/root.go index 3ab3f94..3d03b69 100644 --- a/member-portal-backend/cmd/root.go +++ b/member-portal-backend/cmd/root.go @@ -21,7 +21,7 @@ func init() { // コマンドフラグの設定 flags := rootCmd.PersistentFlags() // 設定ファイルのパスを指定するフラグ --config, -c - flags.StringVarP(&configFile, "config", "c", "/app/config.yaml", "config file path (default is /app/config.yaml)") + flags.StringVarP(&configFile, "config", "c", "/app/data/config.yaml", "config file path (default is /app/data/config.yaml)") } func Execute() error { diff --git a/member-portal-backend/config/config.go b/member-portal-backend/config/config.go index effafa7..2da676f 100644 --- a/member-portal-backend/config/config.go +++ b/member-portal-backend/config/config.go @@ -54,11 +54,11 @@ func init() { viper.SetDefault("server.port", 8080) viper.SetDefault("server.host", "localhost") - viper.SetDefault("file.base", "/app") + viper.SetDefault("file.base", "/app/data") viper.SetDefault("database.type", "sqlite") - viper.SetDefault("database.sqlite.path", "/app/db.sqlite3") + viper.SetDefault("database.sqlite.path", "/app/data/db.sqlite3") viper.SetDefault("jwt.key.private_key", "private.pem") viper.SetDefault("jwt.key.public_key", "public.pem") diff --git a/member-portal-backend/crypto/crypto.go b/member-portal-backend/crypto/crypto.go index 2ecec46..525e84d 100644 --- a/member-portal-backend/crypto/crypto.go +++ b/member-portal-backend/crypto/crypto.go @@ -73,6 +73,9 @@ func VerifyPassword(hash string, password string, config config.Config) bool { var threads uint8 _, err = fmt.Sscanf(parts[3], "m=%d,t=%d,p=%d", &memory, &iterator, &threads) + if err != nil { + panic(err.Error()) + } // ハッシュ値の長さを取得 keyLen := len(decodedHash) @@ -83,11 +86,7 @@ func VerifyPassword(hash string, password string, config config.Config) bool { genHash := argon2.IDKey([]byte(withPepper), salt, uint32(iterator), memory, threads, uint32(keyLen)) // 生成したハッシュ値とデータベースに保存されているハッシュ値を比較 - if bytes.Equal(decodedHash, genHash) { - return true - } - - return false + return bytes.Equal(decodedHash, genHash) } func GenerateRandomString(n int) string { diff --git a/member-portal-backend/crypto/key.go b/member-portal-backend/crypto/key.go index c500d1c..76af445 100644 --- a/member-portal-backend/crypto/key.go +++ b/member-portal-backend/crypto/key.go @@ -33,6 +33,9 @@ func Init(config config.Config) { slog.Info("キーペアより証明書を取得します") keys := GetKeys(config) err = generateCertificate(keys.PrivateKey, keys.PublicKey) + if err != nil { + panic("証明書の取得に失敗しました") + } slog.Info("証明書の取得が完了しました") slog.Info("jwks.jsonを生成します") @@ -148,7 +151,7 @@ func generateCertificate(privateKey *rsa.PrivateKey, publicKey *rsa.PublicKey) e defer func(certFile *os.File) { err := certFile.Close() if err != nil { - + panic("証明書の書き込みに失敗しました") } }(certFile) @@ -172,12 +175,12 @@ func generateJWKs(config config.Config) { //そうでない場合 file, err := os.Create(jwksFile) if err != nil { - slog.Warn("jwks.jsonの生成に失敗しました: %v", err) + slog.Warn("jwks.jsonの生成に失敗しました") } defer func(file *os.File) { err := file.Close() if err != nil { - + panic("jwks.jsonの書き込みに失敗しました") } }(file) @@ -185,7 +188,7 @@ func generateJWKs(config config.Config) { key, err := jwk.PublicKeyOf(privateKey) if err != nil { - slog.Warn("jwksのpublickey生成に失敗しました: %v", err) + slog.Warn("jwksのpublickey生成に失敗しました") } uniqueId := uuid.New() @@ -205,6 +208,10 @@ func generateJWKs(config config.Config) { // Save the JWK set to a file _, err = file.Write(encoded) + if err != nil { + slog.Warn("jwks.jsonの生成に失敗しました") + return + } } func GetKeys(config config.Config) Key { diff --git a/member-portal-backend/crypto/key_test.go b/member-portal-backend/crypto/key_test.go index 6c6c3a2..55c40bc 100644 --- a/member-portal-backend/crypto/key_test.go +++ b/member-portal-backend/crypto/key_test.go @@ -9,7 +9,7 @@ import ( func TestGenKey(t *testing.T) { var cfg = config.Config{} cfg.File.Base = "/tmp" - err := GenKey(2048, cfg) + err := genKey(cfg) if err != nil { t.Errorf("GenKey failed, expected nil, got %v", err) } diff --git a/member-portal-backend/db.sqlite3 b/member-portal-backend/db.sqlite3 deleted file mode 100644 index ff2a6b8..0000000 Binary files a/member-portal-backend/db.sqlite3 and /dev/null differ diff --git a/member-portal-backend/go.mod b/member-portal-backend/go.mod index 17e7138..ff208f5 100644 --- a/member-portal-backend/go.mod +++ b/member-portal-backend/go.mod @@ -4,16 +4,16 @@ go 1.22.3 require ( github.com/golang-jwt/jwt v3.2.2+incompatible - github.com/google/uuid v1.4.0 + github.com/google/uuid v1.6.0 github.com/labstack/echo-jwt/v4 v4.2.0 github.com/labstack/echo/v4 v4.12.0 github.com/lestrrat-go/jwx/v2 v2.1.1 github.com/spf13/cobra v1.8.1 github.com/spf13/viper v1.19.0 - golang.org/x/crypto v0.26.0 + golang.org/x/crypto v0.28.0 gorm.io/driver/postgres v1.5.9 gorm.io/driver/sqlite v1.5.6 - gorm.io/gorm v1.25.11 + gorm.io/gorm v1.25.12 ) require ( @@ -21,6 +21,7 @@ require ( github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/goccy/go-json v0.10.3 // indirect github.com/golang-jwt/jwt/v5 v5.0.0 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect @@ -41,6 +42,7 @@ require ( github.com/mattn/go-sqlite3 v1.14.22 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/segmentio/asm v1.2.0 // indirect @@ -54,10 +56,10 @@ require ( go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.9.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect - golang.org/x/net v0.24.0 // indirect + golang.org/x/net v0.25.0 // indirect golang.org/x/sync v0.8.0 // indirect - golang.org/x/sys v0.23.0 // indirect - golang.org/x/text v0.17.0 // indirect + golang.org/x/sys v0.26.0 // indirect + golang.org/x/text v0.19.0 // indirect golang.org/x/time v0.5.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/member-portal-backend/go.sum b/member-portal-backend/go.sum index 0ea3641..68cb228 100644 --- a/member-portal-backend/go.sum +++ b/member-portal-backend/go.sum @@ -15,10 +15,10 @@ github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keL github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v5 v5.0.0 h1:1n1XNM9hk7O9mnQoNBGolZvzebBQ7p93ULHRc28XJUE= github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= @@ -73,8 +73,8 @@ github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= @@ -116,20 +116,20 @@ go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= -golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= -golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= +golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= +golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= -golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= -golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM= -golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= -golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= +golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= +golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -144,5 +144,5 @@ gorm.io/driver/postgres v1.5.9 h1:DkegyItji119OlcaLjqN11kHoUgZ/j13E0jkJZgD6A8= gorm.io/driver/postgres v1.5.9/go.mod h1:DX3GReXH+3FPWGrrgffdvCk3DQ1dwDPdmbenSkweRGI= gorm.io/driver/sqlite v1.5.6 h1:fO/X46qn5NUEEOZtnjJRWRzZMe8nqJiQ9E+0hi+hKQE= gorm.io/driver/sqlite v1.5.6/go.mod h1:U+J8craQU6Fzkcvu8oLeAQmi50TkwPEhHDEjQZXDah4= -gorm.io/gorm v1.25.11 h1:/Wfyg1B/je1hnDx3sMkX+gAlxrlZpn6X0BXRlwXlvHg= -gorm.io/gorm v1.25.11/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ= +gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8= +gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ= diff --git a/member-portal-backend/main.go b/member-portal-backend/main.go index 29d292f..02ee587 100644 --- a/member-portal-backend/main.go +++ b/member-portal-backend/main.go @@ -2,6 +2,7 @@ package main import ( "github.com/kstm-su/Member-Portal/backend/cmd" + "log/slog" ) func main() { @@ -9,7 +10,7 @@ func main() { // flow: コマンド -> コンフィグ -> ルーター err := cmd.Execute() if err != nil { - err.Error() + slog.Warn(err.Error()) return } } diff --git a/member-portal-backend/public/assets/kstm.svg b/member-portal-backend/public/assets/kstm.svg new file mode 100644 index 0000000..fb0ccec --- /dev/null +++ b/member-portal-backend/public/assets/kstm.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/member-portal-backend/public/view/authorize.html b/member-portal-backend/public/view/authorize.html index dbc0cf6..708816a 100644 --- a/member-portal-backend/public/view/authorize.html +++ b/member-portal-backend/public/view/authorize.html @@ -20,7 +20,7 @@

> logo diff --git a/member-portal-backend/router/root.go b/member-portal-backend/router/root.go index d47846f..5214cab 100644 --- a/member-portal-backend/router/root.go +++ b/member-portal-backend/router/root.go @@ -43,6 +43,10 @@ func Execute(c *config.Config) { //e.GET("/.well-known/openid-configuration", OpenIDConfigurationHandler) e.GET("/.well-known/jwks.json", JWKsHandler) + e.GET("/assets/*", func(c echo.Context) error { + return c.File("public/assets/" + c.Param("*")) + }) + //サーバーの起動 var port = c.Server.Port e.Logger.Fatal(e.Start(":" + strconv.Itoa(port))) diff --git a/swagger/README.md b/swagger/README.md deleted file mode 100644 index e82f1f1..0000000 --- a/swagger/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# OpenAPI documentation - -## Getting started - -```bash -npm install -g @stoplight/prism-cli -``` - -## Generate API documentation - -```bash -npx @redocly/cli preview-docs documentation.yml -``` - -## Mock API - -```bash -prism mock documentation.yml -``` \ No newline at end of file diff --git a/swagger/documentation.yml b/swagger/documentation.yml index 3c235b9..d298dac 100644 --- a/swagger/documentation.yml +++ b/swagger/documentation.yml @@ -26,8 +26,6 @@ components: scopes: openid: Grants read access for OpenID Connect profile: Grants read access for my profile - write: Grants write access for all - read: Grants read access for all paths: /oauth2/userinfo: