SnowflakeのOAuth認証にHULFT Squareを

# はじめに
HULFT SquareからSnowflakeのAPIを呼び出す際に必要なOAuth認証の設定について備忘録です。

# 準備したもの
・Snowflake　セキュリティ統合
・HULFT Square　コネクション

# 手順
## 1.[Snowflake]OAuthのセキュリティ統合を作成
以下ドキュメントを参考にしました。
[参考：カスタムクライアント用のSnowflake OAuth の構成](https://docs.snowflake.com/ja/user-guide/oauth-custom)

```セキュリティ統合.sql
--OAuth統合を作成
CREATE or replace SECURITY INTEGRATION "oauth_sec"
  TYPE = OAUTH
  ENABLED = TRUE
  OAUTH_CLIENT = CUSTOM
  OAUTH_CLIENT_TYPE = 'CONFIDENTIAL'
  OAUTH_REDIRECT_URI = 'https://app.square.hulft.com/connections/oauth2/callback'
  OAUTH_ISSUE_REFRESH_TOKENS = TRUE
  OAUTH_REFRESH_TOKEN_VALIDITY = 86400;
```
| 項目 | 設定内容 | メモ |
|:-:|:-:|:-:|
|name|セキュリティ統合の名前|大文字小文字が区別される。小文字にしたい場合は「"」で囲む|
|TYPE|OAUTH|統合のタイプ|
|ENABLED|TRUE|外部との連携を制御|
|OAUTH_CLIENT|CUSTOM|今回はHULFT Squareを使用するのでカスタム|
|OAUTH_CLIENT_TYPE|CONFIDENTIAL|HULFT Squareは機密クライアント|
|OAUTH_REDIRECT_URI|``'https://app.square.hulft.com/connections/oauth2/callback'``|認証後にリダイレクトされるURI|
|OAUTH_ISSUE_REFRESH_TOKENS|TRUE|アクセストークンの有効期限が切れたときに更新するか|
|OAUTH_REFRESH_TOKEN_VALIDITY|更新トークンの有効期間（秒）|定期的に更新トークンを失効させる|

今回はこちらで作成しました。
他にも特定のロールをブロックする等の設定も可能です。

## 2.[HULFT Square]OAuth認証のコネクションを作成
コネクション＞ **「OAuth 2.0認証」** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/17022e09-2710-730d-0bc7-5e981c1a7879.png)

## 3.[Snowflake]セキュリティ統合の情報を取得
HULFT Squareにセキュリティ統合の情報を渡します。
- クライアントID
- クライアントシークレット
- 認可エンドポイント
- トークンエンドポイント

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/61d8dd8b-1ed4-c08a-5f15-806156a98054.png)

### 3-1.[Snowflake]セキュリティ統合の情報を取得
クライアントシークレット以外は以下SQLクエリを実行し取得します。
- クライアントID
- 認可エンドポイント
- トークンエンドポイント
```DESCRIBE.sql
DESCRIBE INTEGRATION "セキュリティ統合の名前";
```
:::note warn
注意
セキュリティ統合の名前は大文字小文字を区別します。
「"」無しの小文字で作成した場合は大文字になります。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/42ff09a7-4d0a-3f15-5d59-4deddc3f0eea.png)

- クライアントID
**「OAUTH_CLIENT_ID」** の値を入力してください。

- 認可エンドポイント
**「OAUTH_AUTHORIZATION_ENDPOINT」** の値を入力してください。

``<SnowflakeアカウントURL>/oauth/authorize``

- トークンエンドポイント
**「OAUTH_TOKEN_ENDPOINT」** の値を入力してください。

``<SnowflakeアカウントURL>/oauth/token-request``

### 3-2.[Snowflake]セキュリティ統合の情報を取得
クライアントシークレットは以下SQLクエリを実行し取得します。
```SECRETS.sql
SELECT SYSTEM$SHOW_OAUTH_CLIENT_SECRETS( 'セキュリティ統合の名前' )
```
- クライアントシークレット
**「OAUTH_CLIENT_SECRET** の値を入力してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/225475f2-eb4f-e442-ff74-a6232e5079fc.png)


## 4.[HULFT Square]リフレッシュトークンを発行
値を入力し終えたら **「リフレッシュトークンを発行」** を押下します。
Snowflakeのログイン画面に遷移するので、ログイン情報を入力しサインインします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/f5e64208-51f6-7a35-841c-324822d4c92e.png)

ここで注意です。
ユーザ名/パスワードが正しいが「invalid consent request」のエラーになる場合、ロールの確認をして下さい。
検証アカウントではロールを意識することが少なく見落としており詰まりました💦

:::note alert
デフォルトではACCOUNTADMIN、 ORGADMIN、 SECURITYADMIN のロールを認証できません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/d52b42c1-4539-02f2-2b13-d6f0fe78b175.png)

[参考：BLOCKED_ROLES_LIST](https://docs.snowflake.com/ja/sql-reference/sql/create-security-integration-oauth-snowflake)
:::



サインインに成功するとトークンが発行されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/5330a55a-7189-3b47-8521-e9b3ce480d54.png)

プロファイルを選択し完了です。

# 最後に
OAuth認証について勉強する良いきっかけをもらいました！

誰かの参考になれば幸いです。

# 参考
- HULFT Square
    - [認証情報を準備してみよう（Oauth2.0）](https://www.hulft.com/help/ja-jp/HULFTSquare/Content/TOP/Tutorial/tutorial_resources.htm)
    - [HULFT Square のSalesforce コネクター（REST API）接続方法](https://qiita.com/y-tsushima/items/03b2cd6413328500642b#salesforce-%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%BF%E3%83%BCrest-api%E3%81%AE%E5%88%A9%E7%94%A8)

- Snowflake
    - [カスタムクライアント用のSnowflake OAuth の構成](https://docs.snowflake.com/ja/user-guide/oauth-custom)
    - [CREATE SECURITY INTEGRATION （Snowflake OAuth）](https://docs.snowflake.com/ja/sql-reference/sql/create-security-integration-oauth-snowflake#additional-optional-parameters-partner-applications)