[Flutter] Github Actionsを使ったpub.devへのパッケージ公開がOAuth2 authorization failed (Bad Request).で失敗する

# はじめに
はじめまして、うめちゃんです。
Flutterで点線の描画を可能にするパッケージdotted_lineを開発・運用しています。

https://pub.dev/packages/dotted_line

https://github.com/umechanhika/dotted_line

このパッケージのpub.devへの公開はGithub Actionsを用いて自動化しているのですが、今回この公開処理が失敗したため原因と解決方法を記録しておきます。

# 発生した事象
Github Actions上でpub.devへのパッケージ公開処理が永遠に終わりませんでした。
アクションをキャンセルしてログを見てみると、下記のように認証を手動で行うような案内が表示されていました。

```
Uploading...
OAuth2 authorization failed (Bad Request).
Pub needs your authorization to upload packages on your behalf.
In a web browser, go to <<<認証URL>>>
Then click "Allow access".

Waiting for your authorization...
```

しかし、Github Actionsのアクション実行中はこのログを見ることはできず、誘導される認証URLもGithub Actionsの実行環境に合わせて生成されるため、キャンセル後にアクセスしても解決しません。

# 原因と解決方法
認証情報の期限切れ・フォーマット違いが原因と思われます。

実は前回の公開時にも同じ事象が発生し、その時は解決方法に辿り着けなかったため、仕方なくGithub Actions経由ではなく手動で`pub publish`コマンドを叩いてpub.devにパッケージを公開しました。

そして今回、解決方法を調べていた中で見つけた下記の記事のこの文章がヒントになりました。

> Make sure that you publish your first version manually from the command line so that your package gets listed and you become the owner of that listing.
After that, find your credentials.json file either in ~/.pub-cache or ~/<your flutter root>/.pub-cache/
>
> 参照: https://medium.com/evenbit/publishing-dart-packages-with-github-actions-5240068a2f7d

この文章の通り、pub.devへの初回公開の際には認証URL経由で認証するために、手動で公開処理を実行する必要があります。
今回も認証情報が切れていたために、初回公開と同じ手順を踏む必要があったのだと思われます。
たまたま前回手動で公開処理を行なっていたため、ローカル環境に存在する認証情報(credential.json)が最新の情報・フォーマットに更新されていました。
Github Actionsに設定していたものと比較すると、認証期限とフォーマットに差分が見られます。
恐らくここが今回認証が通らなかった原因だと思われます。
（下記のリンクはcredential.jsonの差分です。）

https://github.com/umechanhika/dotted_line/commit/8484dfb26c46b7432c4462d4b9425c1e0f2e03c7#diff-551d1fcf87f78cc3bc18a7b332a4dc5d8773a512062df881c5aba28a6f5c48d7

Github Actionsに設定していた認証情報を最新の情報・フォーマットに更新したところ、正常にGithub Actionsからpub.devへの公開をすることができました。

# 2023/06/10追記
久しぶりにpub.devにpublishしようとしたところ、同じ問題に遭遇しました。
ただ、手動で`pub publish`しても`credentials.json`が更新されなかったため、別の問題が発生しているようでした。

どうやら、2023年1月頃に、GithubActionsからpub.devにpublishするための専用ワークフローが整備されたようです。

公式ドキュメントはこちら。

https://dart.dev/tools/pub/automated-publishing

>The workflow authenticates to pub.dev using a temporary GitHub-signed OIDC token, the token is created and configured in the dart-lang/setup-dart step.

こちらの記載を読む限り、恐らくこの専用ワークフロー内で認証を行うようになったため、これまでの方法が使えなくなったのだと推測しています。

## 設定手順
以下に、公式ドキュメントに沿った設定手順を示します。

1. `pub.dev/packages/<package>/admin`にアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136368/aaad991f-c795-e1f1-1ed8-ffe633397e9e.png)

2. `Enable publishing from GitHub Actions`にチェックを入れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136368/4fb03e93-08b2-7eb9-648c-d0fa218d67e9.png)

3. `Repository (<owner>/<repository>)`にリポジトリ名を入力 （`Tag pattern`はデフォルトのまま）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136368/8ec83886-7948-b00c-958a-95799a9af50d.png)

4. `Require GitHub Actions environment`はチェックなし
タグをプッシュできる権限のユーザーが複数いると、タグ生成のたびにワークフローが反応してpublishしてしまうため、権限を制限したい場合に追加で設定する項目らしい。

また、GithubActionsのワークフローも、公式ドキュメントで提供されているものに変更しました。

https://github.com/umechanhika/dotted_line/commit/e23b8e86c3c329365875b5e08300243d30c2f4e6

# 2023/06/13追記
上記の設定で実際にタグ打ちしてGithubActionsを動かしたところ、ワークフローの`Install dependencies`のステップで以下のエラーになりました。

```
Run dart pub get
  
Resolving dependencies...
Because dotted_line depends on flutter_test from sdk which doesn't exist (the Flutter SDK is not available), version solving failed.

Flutter users should run `flutter pub get` instead of `dart pub get`.
Error: Process completed with exit code 69.
```

Flutterに依存するパッケージは、この公式ドキュメントのワークフローそのままでは使えないようです。
ワークフローをそのまま使えない場合の方法が公式ドキュメントに記載されていました。

https://dart.dev/tools/pub/automated-publishing#configuring-a-github-action-workflow-for-publishing-to-pubdev

また、Flutter SDKが存在しないことが問題のようなので、試行錯誤した結果、以下のワークフローを導入することで解決しました。

https://github.com/marketplace/actions/flutter-action

最終的なコードはこちら。
https://github.com/umechanhika/dotted_line/commit/8efe114438cc1de3df55a5ce901900392e43769b