Help us understand the problem. What is going on with this article?

SFDCをIdP, LINE WORKSをSPにして SAMLで認証連携させてみた

More than 1 year has passed since last update.

SFDCをIdP, LINE WORKSをSPにして SAMLで認証連携させてみた

クラウドベースの CRM・SFA サービス SFDC(セールスフォース・ドットコム) と、ビジネス版LINEの LINE WORKS が共に SAML のSPもIdPもサポートしているということで、接続実験してみました:grinning::grinning:

SFDC_SAML_LW.png

今回試すのは、SFDCをIdP、LINE WORKSをSPとした認証連携です:bangbang:
では、早速どのように設定したか&動作についてを見ていきましょう。

SFDC側の設定

まずはIdPとして動作させる、SFDC側の設定から行います。
管理者のアカウントでSFDC( https://www.salesforce.com/jp/ )にログインして作業してください。

設定画面を開く

SFDCにログインした後、右上の歯車マークをクリック、「設定」を選択します。

SFDC_設定-1.png

マイドメインを登録する

設定画面が開けたら「会社の設定」>「私のドメイン」の項目を選択します。
下の図は、「私のドメイン」の設定が完了している画面になりますが、設定が完了していない場合、手順が表示されますので説明に従って、ドメイン登録を行ってください。

SFDC_設定-2.png

設定が完了しても、登録完了までは数分ほど時間がかかります。
下記のようなメールが届いたら、登録完了なので気長に待ちましょう:exclamation:

SFDC_設定-4.png

IdPの設定を確認して必要な情報をDLする

マイドメインの登録が完了したら、設定画面の「ID」>「IDプロバイダ」に移動します。IdPの設定情報はここにあるので覚えておきましょう。

SFDC_設定-3.png

LINE WORKS側の設定に必要な情報をDLします。

  • 「証明書のダウンロード」で証明書をDL
  • 「メタデータのダウンロード」でメタデータをDL

接続アプリ(LINE WORKS)を登録する

続いて接続アプリ(LINE WORKS)の登録を行います。
先ほどの「IDプロバイダ」の設定画面に、「サービスプロバイダ」の項目があります。その隣に「接続アプリケーションでサービスプロバイダを作成する」のような文言のリンクが表示されていると思いますので、そちらをクリックします。(下図は作成済みの状態のため「サービスプロバイダが作成されました。」となっています。)

SFDC_設定-5.png

すると、新規接続アプリケーションの設定画面が表示されるため、「基本情報」の必須項目を埋めます。これだけではSAMLの設定が何もされていないので、「Webアプリケーション設定」>「SAMLの有効化」のチェックボックスをONにして、SAMLの設定項目を表示します。

SFDC_設定-6.png

SAMLの設定項目が表示されたら、下記の通り入力してください。

SFDC_設定-7.png

No. 項目 内容 備考
1 開始URL http://mail.worksmobile.com/ メールのトップ画面を登録したが他でもOK
2 SAMLの有効化 チェックON
3 エンティティID worksmobile.com 全てのドメインで共通の値
4 ACS URL https://auth.worksmobile.com/acs/[LINEWORKSで利用しているドメイン名]
5 シングルログアウトを有効化 チェックOFFのまま チェックONにしてもOK
6 件名種別 「統合ID」を選択 他を選択した場合の設定方法については省略
7 名前IDの形式 urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified LINE WORKSの仕様に従う
8 発行者 https://sami.my.salesforce.com マイドメインで既に入力されているのでそのまま
9 IdP証明書 SelfSignedCert_DDmmYYYY_XXXXXX IdPの設定画面でDLしたものを選択する
10 要求署名を確認 チェックOFFのまま LINE WORKSはRequestに署名付さない
11 SAMLレスポンスを暗号化 チェックOFFのまま LINE WORKSは暗号レスポンスを復号しない
  • なお、LINE WORKSのドキュメントには必要な記述は存在しなかったので、LINE WORKSが送信しているAuthnRequestを解析して取得しました:sweat_smile::sweat_smile:

一応、LINE WORKS側のドキュメントは下記です。

SAML 2.0基盤のSSO連携のためのクライアント実装項目
https://developers.worksmobile.com/jp/document/1001003

対象ユーザに接続アプリの利用を許可する

「ユーザ」>「ユーザ」から対象ユーザを選択し「プロファイル」の項目(ここでは「システム管理者」)をクリックします。

SFDC_設定-8.png

「プロファイル」の設定が画面が表示されるので「編集」を押下して、編集できる状態にします。

SFDC_設定-9.png

「接続アプリケーションへのアクセス」の項目に「LINE_WORKS」があるので、チェックボックスをONにして、「保存」します。

SFDC_設定-10.png

対象ユーザの統合IDを登録する

「ユーザ」>「ユーザ」から対象ユーザを選択し、「編集」を押下して編集できる状態にします。

SFDC_設定-8.png

「シングルサインオン設定」の項目に「統合ID」があるので、適当な値を入力します。(LINE WORKS側で、External Keyとして登録する値になります。)

SFDC_設定-11.png

「保存」して、SFDC側の設定は完了:clap::clap::clap:

LINE WORKS側の設定

続いてSPとして動作させる、LINE WORLS側の設定を行います。
DeveloperのアカウントでLINE WORKS Developer Console( https://developers.worksmobile.com/jp/console/ )にログインして行ってください。

SSO設定

Developer Console画面の「SSO」>「SSO Type」で「SAML」を選択し、それぞれ下記の通り設定します。

LW_設定-1.png

No. 項目 内容 備考
1 Web Login URL ※1 表下部参照
2 Layer Popup Login URL 修正/入力なしでOK
3 Application Login URL 修正/入力なしでOK
4 IMAP/CalDAV Login API 修正/入力なしでOK
5 Logout URL ※2 表下部参照
6 Certificate File DLしたSFDCの証明書ファイル※3

※1 DLしたSFDCメタデータ中、Binding属性がurn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect であるSingleSignOnService要素のLocation属性の値。
※2 DLしたSFDCメタデータ中、Binding属性がurn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect であるSingleLogoutService要素のLocation属性の値。
※3 DLした証明書ファイルの拡張子は.crtとなっているので、.pemと書き換えたもの(ファイルの拡張子を変えるだけでOK)

【参考】SFDCのメタデータ
<?xml version=“1.0” encoding=“UTF-8”?>
<md:EntityDescriptor xmlns:md=“urn:oasis:names:tc:SAML:2.0:metadata”
 entityID=“https://sami.my.salesforce.com”
 validUntil=“2028-03-23T08:01:22.771Z”
 xmlns:ds=“http://www.w3.org/2000/09/xmldsig#”> 
  <md:IDPSSODescriptor protocolSupportEnumeration=“urn:oasis:names:tc:SAML:2.0:protocol”>
    <md:KeyDescriptor use=“signing”>
      <ds:KeyInfo>
        <ds:X509Data>
          <ds:X509Certificate>...</ds:X509Certificate>
        </ds:X509Data>
      </ds:KeyInfo>
    </md:KeyDescriptor>
    <md:SingleLogoutService 
     Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
     Location="https://sami.my.salesforce.com/services/auth/idp/saml2/logout"/>
    <md:SingleLogoutService
     Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"
     Location="https://sami.my.salesforce.com/services/auth/idp/saml2/logout"/>
    <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-POST"
     Location="https://sami.my.salesforce.com/idp/endpoint/HttpPost"/>
    <md:SingleSignOnService
     Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"
     Location="https://sami.my.salesforce.com/idp/endpoint/HttpRedirect"/>
  </md:IDPSSODescriptor>
</md:EntityDescriptor>

最後に、「適用」を押下して、設定完了。

External Keyの設定

SSOを行う対象ユーザのExternanl Keyを設定します。
Developer Console画面の「SSO」>「構成員 External Key Mapping」で、対象ユーザのメールアドレス(ログインID)とSFDCで統合IDに登録した値をマッピングしたCSVファイルをアップロードします。

LW_設定-2.png

CSVファイルの内容はこんなかんじで。

ExternalKey.csv
"Mail Address","External Key"
"sami@sami.sample.com.","sami"
"taro@sami.sample.com","taro"

LW_設定-3.png

アップロードが成功したら、External Keyの設定も完了。
LINE WORKS側の設定も完了です。:clap::clap::clap:

動かしてみる

ということで、早速動かしてみたいと思います。
動かしてみるシーケンスは、ざっくりこんなかんじ。

SSOシーケンス.png

ということでまず LINE WORKS にアクセスします。
[LINE WORKS] https://mail.worksmobile.com/

すると早速AuthnRequestが送付されています。

リクエスト内容

GET /idp/endpoint/HttpRedirect?SAMLRequest=fZLLb...9icE3&RelayState=...&worksId=sami@sami.sample.com HTTP/1.1
Host: sami.my.salesforce.com

AuthnRequestの中身はこんな感じでした。

AuthnRequest
<?xml version="1.0" encoding="UTF-8"?>
<saml2p:AuthnRequest xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" 
 AssertionConsumerServiceURL="https://auth.worksmobile.com/acs/sami.sample.com"
 ID="ohhfjgfhmcjmhgobdoogdpggkgpmmjjojgoihmoo"
 IssueInstant="2018-04-12T04:45:44.212Z" 
 ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" 
 ProviderName="worksmobile.com"
 Version="2.0">
  <saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">
      worksmobile.com
  </saml2:Issuer>
  <saml2p:NameIDPolicy Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified"/>
</saml2p:AuthnRequest>

すると、おお:bangbang:
SFDCのログイン画面が表示されました:v::v:

SFDC_ログイン画面.png

「ログイン」ボタンを押下すると、AuthnResponseが返却されます。

レスポンス内容

POST /acs/sami.sample.com HTTP/1.1
Host: auth.worksmobile.com

RelayState=...&SAMLResponse=PD94b...T4%3D

AuthnResponseの中身はこんな感じでした。

AuthnResponse
<?xml version="1.0" encoding="UTF-8"?>
<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" 
 Destination="https://auth.worksmobile.com/acs/sami.sample.com" 
 ID="_b896ada187ab0081098dfa4db9eb9c381523508344601" 
 InResponseTo="ohhfjgfhmcjmhgobdoogdpggkgpmmjjojgoihmoo"
 IssueInstant="2018-04-12T04:45:44.601Z" Version="2.0">
  <saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" 
   Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">
      https://sami.my.salesforce.com
  </saml:Issuer>
  <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    <ds:SignedInfo>
      <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
      <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
      <ds:Reference URI="#_b896ada187ab0081098dfa4db9eb9c381523508344601">
        <ds:Transforms>
          <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
          <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"> 
            <ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="ds saml samlp xs xsi"/>
          </ds:Transform>
        </ds:Transforms>
        <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
        <ds:DigestValue>RTsRR...wKCw=</ds:DigestValue>
      </ds:Reference>
    </ds:SignedInfo>
    <ds:SignatureValue>WSPvM...Xhw==</ds:SignatureValue>
    <ds:KeyInfo>
      <ds:X509Data> 
        <ds:X509Certificate>MIIEr...GS2LU</ds:X509Certificate>
      </ds:X509Data>
    </ds:KeyInfo>
  </ds:Signature>
  <samlp:Status>
    <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/> 
  </samlp:Status>
  <saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" 
   ID="_a127072ac7acf6c73248a2709da105c21523508344602"
   IssueInstant="2018-04-12T04:45:44.602Z" Version="2.0">
    <saml:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">
        https://sami.my.salesforce.com
    </saml:Issuer>
    <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
      <ds:SignedInfo>
        <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
        <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
        <ds:Reference URI="#_a127072ac7acf6c73248a2709da105c21523508344602">
          <ds:Transforms>
            <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
            <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"> 
              <ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="ds saml xs xsi"/>
            </ds:Transform>
          </ds:Transforms>
          <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
          <ds:DigestValue>BnW5P...YqIc=</ds:DigestValue>
        </ds:Reference>
      </ds:SignedInfo>
      <ds:SignatureValue>ANpUn...VDw==</ds:SignatureValue>
      <ds:KeyInfo>
        <ds:X509Data>
          <ds:X509Certificate>MIIEr...GS2LU</ds:X509Certificate>
        </ds:X509Data>
      </ds:KeyInfo>
    </ds:Signature>
    <saml:Subject>
      <saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">sami</saml:NameID>
      <saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
        <saml:SubjectConfirmationData InResponseTo="ohhfjgfhmcjmhgobdoogdpggkgpmmjjojgoihmoo"
         NotOnOrAfter="2018-04-12T04:50:44.602Z"
         Recipient="https://auth.worksmobile.com/acs/red.wmjsales.xyz"/> 
      </saml:SubjectConfirmation>
    </saml:Subject>
    <saml:Conditions NotBefore="2018-04-12T04:45:14.602Z"
     NotOnOrAfter="2018-04-12T04:50:44.602Z">
      <saml:AudienceRestriction>
        <saml:Audience>worksmobile.com</saml:Audience>
      </saml:AudienceRestriction>
    </saml:Conditions>
    <saml:AuthnStatement AuthnInstant="2018-04-12T04:45:44.602Z">
       <saml:AuthnContext> 
         <saml:AuthnContextClassRef>
             urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified
         </saml:AuthnContextClassRef>
      </saml:AuthnContext>
    </saml:AuthnStatement>
    <saml:AttributeStatement>
      <saml:Attribute Name="userId" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified"> 
        <saml:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:type="xs:anyType">005...WZW</saml:AttributeValue>
      </saml:Attribute>
      <saml:Attribute Name="username" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified">
        <saml:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:type="xs:anyType">xxxxxxxx</saml:AttributeValue>
      </saml:Attribute>
      <saml:Attribute Name="email" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified">
        <saml:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:type="xs:anyType">xxxx.xxxx@xxxx.com</saml:AttributeValue> 
      </saml:Attribute>
      <saml:Attribute Name="is_portal_user" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified">
        <saml:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:type="xs:anyType">false</saml:AttributeValue>
      </saml:Attribute>
    </saml:AttributeStatement>
  </saml:Assertion>
</samlp:Response>

SFDCのAuthnResponseって、AuthnStatementだけじゃなくてAttributeStatementも含んでるんですね。

そして最後はきちんとLINE WORKSログイン後の画面が表示されました。

LW_メール画面.png

おしまい:hugging::hugging::hugging::hugging::hugging:

おわりに

設定して、SSOできました、って、すんなり行ったように見えてますが、そうでもなかったです・・・。
とにかく、LINE WORKSが出すエラーメッセージは正しくなくて振り回されるので、SFDC側のログを見て詳細確認したほうが良いですよ。

設定画面の「ID」>「IDプロバイダイベントログ」でSFDC側の詳細ログは見れます:sparkles::sparkles:

でわでわ。気が向いたら逆も試して見ます:wave::wave:

samiii
こんにちは。ぼく、さみー。 ID厨だよ。お仕事常時募集中、気軽に連絡してね。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした