LINE WORKS API トークン取得 (User Account 認証)

# LINE WORKS API 認証フローの実装 (OAuth 2.0)

## はじめに

この記事では、LINE WORKS の API を使用するための認証フローを実装する方法を解説します。OAuth 2.0 の **Authorization Code Flow** を利用して、Access Token を取得します。

Google Colab でスクリプトを共有しているので、以下の URL から簡単に試すことができます！
https://colab.research.google.com/drive/1nLHnrwMJ2eXuNcQRPxvfAdOKyDLTKHMB?usp=sharing

## 前提条件

- LINE WORKS Developer Console でアプリを作成済み
- **Client ID** と **Client Secret** を取得済み
- アプリにリダイレクト URL と必要な Scope を設定済み

### 必要なライブラリ
- Python の `requests` ライブラリを使用します。最初にインストールしておきましょう。

## 手順

以下の手順に沿って進めます。

1. Google Colab の準備とライブラリのインストール
2. 認可リクエスト URL の作成
3. 認証後に取得するリダイレクト URL の入力
4. Access Token の取得

### 1. Google Colab の準備とライブラリのインストール

まずは、`requests` ライブラリをインストールします。Google Colab のセルで以下のコマンドを実行してください。

```bash
!pip install requests
```

### 2. 認可リクエスト URL の作成

次に、認証リクエスト URL を生成します。この URL をブラウザで開くと、LINE WORKS の認証画面が表示されます。

```python
# 必要な変数を Google Colab のパラメータ形式で入力
CLIENT_ID = "YOUR_CLIENT_ID"  # @param {type:"string"}
CLIENT_SECRET = "YOUR_CLIENT_SECRET"  # @param {type:"string"}
REDIRECT_URI = "https://example.com"  # @param {type:"string"}
SCOPE = "bot"  # @param {type:"string"}
STATE = "random_state_string"  # @param {type:"string"}
NONCE = "random_nonce_string"  # @param {type:"string"}

import urllib.parse

# 認可リクエスト URL を作成
auth_url = "https://auth.worksmobile.com/oauth2/v2.0/authorize"
params = {
    "client_id": CLIENT_ID,
    "redirect_uri": REDIRECT_URI,
    "scope": SCOPE,
    "response_type": "code",
    "state": STATE,
    "nonce": NONCE,
}
auth_request_url = f"{auth_url}?{urllib.parse.urlencode(params)}"

# 認可リクエスト URL を表示
print("以下の URL にアクセスして認証を進めてください:")
print(auth_request_url)
```

上記コードを実行すると、認証リクエスト URL が表示されます。この URL をブラウザで開き、LINE WORKS のアカウントでログインを行います。

### 3. 認証後に取得するリダイレクト URL の入力

認証が成功すると、ブラウザは事前に設定したリダイレクト URL に移動し、以下のような形式の URL が表示されます。

```
https://example.com/?code=AUTHORIZATION_CODE&state=random_state_string
```

このリダイレクト URL をコピーして、次のセルに入力します。

```python
REDIRECT_URL = "https://example.com/?code=AUTHORIZATION_CODE&state=random_state_string"  # @param {type:"string"}
```

### 4. Access Token の取得

リダイレクト URL から認証コード (`code`) を抽出し、それを使用して Access Token を取得します。

```python
import requests
import urllib.parse

# リダイレクト URL からクエリパラメータを解析
parsed_url = urllib.parse.urlparse(REDIRECT_URL)
query_params = urllib.parse.parse_qs(parsed_url.query)

# Authorization Code を取得
AUTHORIZATION_CODE = query_params.get("code", [None])[0]
if AUTHORIZATION_CODE is None:
    raise ValueError("リダイレクト URL に 'code' パラメータが含まれていません。")

print(f"抽出された認証コード: {AUTHORIZATION_CODE}")

# トークンリクエスト用のエンドポイント
TOKEN_URL = "https://auth.worksmobile.com/oauth2/v2.0/token"

# リクエストパラメータ
data = {
    "code": AUTHORIZATION_CODE,
    "grant_type": "authorization_code",
    "client_id": CLIENT_ID,
    "client_secret": CLIENT_SECRET,
    "redirect_uri": REDIRECT_URI,
}

# POST リクエストを送信して Access Token を取得
response = requests.post(TOKEN_URL, data=data)

# レスポンスを確認
if response.status_code == 200:
    tokens = response.json()
    print("Access Token:", tokens["access_token"])
    print("Refresh Token:", tokens["refresh_token"])
    print("ID Token:", tokens.get("id_token"))
else:
    print(f"エラー: {response.status_code}, {response.text}")
```

---

### レスポンス例

成功時:
```plaintext
抽出された認証コード: jp1T2FBaVUyd1Z0UFlKNjZvNA==
Access Token: jp1AAAA...
Refresh Token: AAAAUrG...
```

失敗時:
```plaintext
エラー: 400, {"error":"invalid_request","error_description":"Invalid client_id"}
```

## まとめ

これで、Google Colab を使用して LINE WORKS API の認証フローを実装することができました。この手順により、Access Token を取得して LINE WORKS のさまざまな API を利用できます。

LINE WORKS アカウントによるログインを Selenium で自動化する手法の記事も書きました。こちらも参照してみてください。

https://qiita.com/iwaohig/items/91102d2c1a8821e08a56