【LINE WORKS】SSO SAML IdPを簡単に試してみる

# はじめに
LINE WORKS Developersには「LINE WORKSログイン」という、LINE WORKSのユーザーをIDとしてSSOを自サービスへ組み込める開発者機能がある。

https://developers.worksmobile.com/jp/document/10015001?lang=ja

LINE WORKSのテナントをSSOのIdP (Identity Provider) 側として、自身のサービスにログインを組み込む。

# 注意
今回は動作・設定方法の検証を目的とするため、本番利用は想定していません。データの扱いについては十分ご注意ください。

# 構成
![ssoidp.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/dbf56493-89fa-0a17-a35f-62bb26f48092.png)

LINE WORKSのSSO IdPは「SAML」に対応している。
検証として今回SP側は、SAMLのテストができる「SAMLTEST.ID」を利用する。

https://samltest.id/ 

このサイトでは、アカウント登録など無しにSAMLのSP側・IdP側の両方を簡単に検証できる。このSAMLTEST.IDをSP側として、LINE WORKSをIdP側としてSAMLで繋いで、LINE WORKSのIDを使ってログインできる仕組みを構築する。

# 前提
- LINE WORKSテナント作成済み
    - ※ SSOはスタンダードプラン以上で利用可能
- ユーザー作成済み

# 1. LINE WORKS側にSP情報を登録
SAMLTEST.IDからSP情報を取得しておく。
LINE WORKS側はMetadataには対応していないため、必要な情報を以下の画面からそれぞれ取得する。

https://samltest.id/download/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/138d9f4e-1c79-1cc9-7918-4b1e7a49e41f.png)


**entityID** と **AsserionConsumerService URL** の2つが必要となる。

SP情報を取得したら、LINE WORK側に設定する。
設定は、「Developer Console」の「SAML Apps」で行う。

https://developers.worksmobile.com/jp/console/idp/saml/view　

「SAML Apps」の「追加」からSP情報を登録する。以下の必須項目を入力し、「次へ」からAppを登録する。

- **Application Name**: 任意の名前
- **ACS URL**: SAMLTEST.IDから取得した「AsserionConsumerService URL」 
- **SP Issuer(Entity Id)**: SAMLTEST.IDから取得した「entityID」 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/92e291e9-4495-77cc-fb2f-9b5b6c9ca138.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/1dba3004-98b3-fb05-055d-e37b8750fed2.png)

デフォルトで「使用状態」が「無効」となっているため、「変更」で有効化する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/6794e2fc-a4ef-ed23-245b-97dfa3abd759.png)

これで、SP情報の登録は完了。

# 2. SAMLTEST.IDにIdP情報を登録
まず、LINE WORKSのDeveloper Consoleの「SAML Apps」からIdP情報を取得する。Appを1つ以上登録されていると、右上から「LINE WORKS Identity Provider情報」を取得できるようになる。

証明書も必要となるため、「Certificate」からダウンロードしておく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/8fbd900f-bb80-0c2f-f3de-fdf1915a45c2.png)

SAMLTEST.IDへはMetadataでIdPの情報をアップロードする必要があるが、LINE WORKS側はMetadataに対応していないため、以下のサイトを使って生成する。
　
https://www.samltool.com/idp_metadata.php

LINE WORKS側から取得したIdP情報を入れて、生成する。

- **EntityId** : LINE WORKS IdP情報の「Response Issuer」
- **Single Sign On Service Endpoint (HTTP-REDIRECT)** : LINE WORKS IdP情報の「SSO URL」
- **SP X.509 sert** : LINE WORKS IdP情報の「Certificate」でダウンロードしたpemファイルの内容のうち、最初と最後の行の除いた、値部分を入れる。

そのほかは入力不要。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/a9f6e5d3-e80c-a9dd-c4a2-706e227a54f2.png)


「BUILD IDP METADATA」ボタンで生成すると、以下のようなXML形式の値が表示される。これを適当なテキストエディタにコピーしてファイルとして保存しておく。

```xml:IdP Metadata例
<?xml version="1.0"?>
<md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" validUntil="2022-12-31T07:47:37Z" cacheDuration="PT1672904857S" entityID="https://auth.worksmobile.com/saml2/<yourlineworks>">
  <md:IDPSSODescriptor WantAuthnRequestsSigned="false" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
    <md:KeyDescriptor use="signing">
      <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        <ds:X509Data>
          <ds:X509Certificate>xxxxxxxxxx</ds:X509Certificate>
        </ds:X509Data>
      </ds:KeyInfo>
    </md:KeyDescriptor>
    <md:KeyDescriptor use="encryption">
      <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        <ds:X509Data>
          <ds:X509Certificate>xxxxxxxxxx</ds:X509Certificate>
        </ds:X509Data>
      </ds:KeyInfo>
    </md:KeyDescriptor>
    <md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified</md:NameIDFormat>
    <md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://auth.worksmobile.com/saml2/idp/<yourlineworks>"/>
  </md:IDPSSODescriptor>
</md:EntityDescriptor>
```

生成したIdP MetadataのファイルをSAMLTEST.IDのUpload formからアップロードする。

https://samltest.id/upload.php 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/4111f08a-e3ea-0a2a-58c8-179cfba649cd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/6d8be973-0f6d-282e-3a39-5bab5ad2a54e.png)

これで、IdP情報の登録は完了。

# 3. テスト
実際にログインを試してみる。SAMLTEST.IDの「Test Your IdP」から試すことができる。

「Login Initiator」に、IdP側のEntityID (LINE WORKS側から取得したIdP情報の「Response Issuer」)を入力し、「GO!」でログインシーケンスが始まる。

https://samltest.id/start-idp-test/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/c969cb67-3271-304f-795b-598b6be67f9a.png)



設定が正しい場合は、以下のようなLINE WORKSのログイン画面が表示される。

※ 既にログイン済みだった場合やセッションが残っていた場合はこの画面はスキップされる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/2d4a60ac-81e3-c25a-ffde-7affb9cbf084.png)

LINE WORKSのユーザー情報を入力しログインが成功すると、SAMLTEST.IDへ戻り、ログインに関する情報が表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/3a99f0fc-ea3e-2af9-0917-71c4dc1270b6.png)

# まとめ
今回は特に設定方法についての検証として、SAMLTEST.IDを使った方法について紹介した。
この仕組みを取り入れれば、IDをLINE WORKSに集約できるほか、LINE WORKSから自分達のサービスへシームレスに移動も可能となり利便性向上に期待できる。

もう少し実践的な例もまたまとめてみたい。