Skickaを使ってGoogleDriveにコマンドラインでアクセスする（認証エラー回避版）

# はじめに

[Skicka](https://github.com/google/skicka)はGoogleDriveにコマンドラインでアクセス可能になるツールです。手元にある合計数百GB程度のファイルをGoogleDriveにアップロードするのに2019年~2021年頃に（確か）使っていました。
ところが久々に（執筆時の2023年1月22日）Skickaを使おうとしたら今までのやり方だと認証エラーになってしまい使えないことが判明...。使える方法を試行錯誤したところようやく連携できたので、その方法を共有いたします。

ほとんどは以下のサイトに書かれている内容をもとにしたものです。

https://kajindowsxp.com/skicka/

※この記事のおかげで本記事も書けており、大変感謝しております m(_ _)m

# やること概要
大きくは「クライアント」と「Google Cloud コンソール」でやる作業の2つになります。

### (1) クライアントでやること

:::note info
動作確認したのはUbuntuのみですが、他のLinuxディストリビューションやWindows,Macでも動くはず
:::

* (1-1) [Go](https://go.dev/doc/install)のインストールとセットアップ
* (1-2) [Skicka](https://github.com/google/skicka)のインストール（Goのパッケージ）
    * 基本はGitHubのREADMEにしたがってインストールすれば問題ないはず
    * Goのバージョンや環境によっては、``go get``が使えずに``go install``を使う必要があるかも
* (1-3) <font color="Red">★</font>Skickaの設定ファイル``~/.skicka.config``にGoogleCloudPlatform(GCP)で作成した認証情報を追加
    * GCPで作成した「OAuth2.0クライアント ID」の認証情報を利用
    * 【注意】こちらは次の手順(2)で認証情報を生成後に行う必要あり

### (2) Google Cloud コンソール(≒GCP)でやること

:::note info
GCPを初めて利用する場合は[こちら](https://cloud.google.com/cloud-console)から開設が必要
:::

* (2-1) プロジェクトを一つ用意
    * 初めて作った場合は「My First Project」という名前のプロジェクトが存在
* (2-2) 選択したプロジェクトで以下3つの設定を行う
    * (2-2-1) <font color="Red">★</font> Google Drive APIの有効化（[リンク](https://console.developers.google.com/apis/api/drive.googleapis.com/overview)）
    * (2-2-2) <font color="Red">★</font>OAuth同意画面の作成（[リンク](https://console.cloud.google.com/apis/credentials/consent)）
    * (2-2-3) <font color="Red">★</font>OAuth2.0クライアントIDの発行（[リンク](https://console.cloud.google.com/apis/credentials/oauthclient)）

上記手順の中で<font color="Red">★</font>がついた内容に関して、以下で説明します。

# 手順詳細

## (2-2-1) Google Drive APIの有効化

[こちら](https://console.cloud.google.com/apis/library/drive.googleapis.com?project=serene-exchange-375508)をクリックすると以下のようなサイトに遷移するので、「有効にする」をクリック
![スクリーンショット 2023-01-22 19.36.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370519/93be0710-a164-6658-cd7c-bb2bfa72f697.png)

## (2-2-2) OAuth同意画面の作成

左上の「三」のアイコンをクリック後、「APIとサービスの」メニューを選択し「OAuth同意画面」をクリック（[こちら](https://console.cloud.google.com/apis/credentials/consent)に直接アクセスしてもOK）
以下のサイトが現れるので、「外部」をチェックして「作成」をクリック
![スクリーンショット 2023-01-22 20.03.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370519/489b9de6-5e5f-8980-af5a-7183b51ea4aa.png)

「①Oauth同意画面」で、「アプリ名」「ユーザーメールアドレス」「デベロッパーの連絡先情報」を記入して「保存して次へ」をクリック
![スクリーンショット 2023-01-22 20.07.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370519/683c2eca-598d-55fe-d346-9c3dff0b9710.png)
次の「②スコープ」は何も編集せずに「保存して次へ」をクリック（画面は非掲載）

「③テストユーザー」で「+ADD USERS」をクリックして、現在のGCPアカウントのメールアドレスを追加後、「保存して次へ」をクリック
![スクリーンショット 2023-01-22 20.12.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370519/29d8e70f-2d4d-51d6-c90c-723429c87ecc.png)
「④概要」で設定項目を確認して「ダッシュボードに戻る」をクリック（画面は非掲載）

以上で設定完了です。

## (2-2-3) OAuth2.0クライアントIDの発行

OAuth2で認証するためのクライアントIDとクライアントシークレットを発行します。

「有効なAPIとサービス」で「認証情報」をクリックし（[こちら](https://console.cloud.google.com/apis/credentials/oauthclient)に直接アクセスしてもOK）、右ウインドウの「+認証情報を作成」をクリック
![スクリーンショット 2023-01-22 22.17.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370519/86fe35e6-f134-c0e5-9905-10a39efef540.png)
出てくるリストから「OAuthクライアントID」を選択してクリック（画面は非掲載）

アプリケーションの種類で「デスクトップアプリ」を選択後、適当な名前を入力して「作成」をクリック

:::note warn
「デスクトップアプリ」以外を選択するとskicka側での認証に失敗するようなので間違えないように注意！
:::
![スクリーンショット 2023-01-22 22.24.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370519/e4c755ce-4ae7-8e1f-3b2b-514ce725902c.png)


「クライアントID」と「クライアントシークレット」が発行されるので、何らかの方法で保存する
![スクリーンショット 2023-01-22 22.26.16のコピー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370519/f4ac3c3c-3bce-f7cb-419e-58a8c57cbd26.jpeg)

## (1-3) Skickaの設定ファイルに認証情報を追加

前の手順(2-2-3)で発行した「クライアントID」と「クライアントシークレット」の認証情報を、クライアントの``~/.skicka.config``に記載します。

:::note info
``.skicka.config``がホームディレクトリに存在しない場合は、``skicka init``を実行すれば生成されます。
:::

具体的には、以下のclientid, clientsecretの左側についている``;``を消して、それぞれにクライアントIDとクライアントシークレットを入力します。
```~/.skicka.config
; Default .skicka.config file. See
; https://github.com/google/skicka/blob/master/README.md for more
; information about setting up skicka.
[google]
    ;Override the default application client id used by skicka.
        clientid=123456789012-xxxxxxxxxxxxxxxxxx.apps.googleusercontent.com
        clientsecret=yyyyyyyyy
    ;An API key may optionally be provided.
    ;apikey=YOUR_API_KEY
...
```

configファイルの設定を行った後、skickaの何らかのコマンドを実行すると、OAuth2認証を行うURLが以下のように表示されます。

:::note info
``-no-browser-auth``オプションは、クライアントにsshなどで別の端末からログインしている場合にWeb認証するために必要となります。
:::
```
$ skicka -no-browser-auth df
Go to the following link in your browser:
https://accounts.google.com/o/oauth2/auth?client_id=123456789012-xxxxxxxxxxxxxxxxxx.apps.googleusercontent.com&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive&state=st1674395246803981550
Enter verification code:
```

表示されたURLにWebブラウザからアクセスすると、上手くいけば以下のような認証画面が出てきます！
（どこかで設定を間違うと残念ながらここでエラーになります...）
![IMG_1392.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370519/1721c132-b1d1-88f6-a010-75fe7481955d.jpeg)

ログインするアカウントを選択してクリック後に警告メッセージ等が出てきますが、気にせずに「続行」をクリック（画面は非掲載）

以下のように発行された認証コードをコピーして、端末の``Enter verification code:``の後に認証コードを貼り付け
![IMG_1394.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370519/0485bdc5-8a0b-4dde-27d7-1e3491bde964.jpeg)

認証に成功すると、例えば以下のようにskickaを利用可能になります！
```
$ skicka df
Capacity    15.00 GiB
Trash           0 B       0.00%
Drive           0 B       0.00%
Gmail      299.42 MiB     1.95%
Photos          0 B       0.00%
Free space  14.71 GiB    98.05%
```