이 기능은 개발 중입니다. Meta는 언제든 이 기능을 변경하거나 삭제할 수 있습니다.
Workplace용 외부 콘텐츠 공유를 사용하면 소스 자료의 개인정보를 보호하는 방식으로 사용자가 Workplace에서 안전하고 손쉽게 정보를 공유할 수 있습니다.
외부 콘텐츠 공유를 지원하면 Workplace에서 콘텐츠의 미리 보기가 바르게 표시되고, 사용자가 폴더를 Workplace 그룹과 링크하며, Workplace의 그룹 구성 도구에 콘텐츠를 제공함으로써 최근에 만든 콘텐츠를 그룹 내에서 바로 손쉽게 공유할 수 있습니다.
사용자는 Workplace에서 특정인만 볼 수 있어야 하는 사내 리소스 링크를 공유하는 경우가 많습니다. 이는 사용자가 일반적으로 신문 기사나 블로그 게시물과 같은 공개 콘텐츠를 공유하는 Facebook과는 대조적입니다.
Workplace가 회사 비공개 콘텐츠에 대한 미리 보기를 생성하려면 일부 메타데이터를 제공해야 합니다. 제공업체는 콘텐츠를 볼 수 있도록 허용되는지 여부에 따라 Workplace에서 현재 보고 있는 사람에 대한 메타데이터를 제공할지 여부를 선택할 수 있습니다.
이 문서에서는 외부 콘텐츠 공유를 활성화하기 위한 구성 요소를 간략히 설명합니다. 주요 구성 요소는 3가지가 있습니다.
이 문서에서는 외부 콘텐츠 공유 지원을 추가하도록 앱을 구성하는 방법도 설명합니다.
외부 콘텐츠 공유 지원을 위해 앱을 설정하려면 다음의 필드 3개를 제공해야 합니다.
example.com
)에는 하위 도메인(예: acme.example.com
)도 포함됩니다.www.example.com/download?id=123
또는 www.example.com/file/456
를 매칭하고자 하지만 www.example.com/blog
는 매칭하고 싶지 않다면 \/(download?|file\/).+
/와 같은 정규식을 사용할 수 있습니다./.*/
)을 사용해도 됩니다.앱은 Link
Webhooks 주제와 preview
를 구독하도록 설정해야 하고 링크 펼치기 권한이 활성화되어 있어야 합니다.
이는 베타 기능이므로 지금은 developers.facebook.com의 개발자 대시보드를 통해 앱을 구성할 수 없습니다.
배정된 Meta 파트너에게 해당 필드의 구성이나 업데이트를 문의하세요.
외부 콘텐츠 공유의 주요 기능은 Workplace에서 콘텐츠를 올바르게 미리 볼 수 있도록 하는 것입니다. 이는 인증된 미리 보기 메타데이터에 대한 지원을 Workplace에서 기대하는 형식으로 제공하는 것을 포함합니다. 예를 들어, 콘텐츠 URL이 공유되면 Workplace에서 해당 메타데이터를 가져와 미리 보기를 생성할 수 있습니다. 이 프로세스를 종종 링크 펼치기라고 부릅니다.
Meta는 오픈 그래프 프로토콜과 Facebook 크롤러를 사용하여 공개 URL을 펼치기 위한 메타데이터를 가져올 수 있지만 Workplace로 보다 일반적으로 공유되는 비공개 URL에는 이 프로세스를 적용할 수 없습니다. 대신, 누군가 Workplace에 비공개 URL을 공유하면 정의한 콜백 URL에 Webhooks가 발행됩니다. 그러면 URL을 공유하는 사람에 대해 URL을 설명하는 메타데이터 페이로드로 응답하여 링크 미리 보기를 렌더링할 수 있게 됩니다.
이 동일한 프로세스는 Workplace에서 공유된 URL을 보는 각 사용자에 대해 반복되므로 사용자별로 미리 보기 가시성을 관리할 수 있습니다.
인증된 미리 보기를 지원하려면 다음에 대해 앱을 구성해야 합니다.
Facebook은 다음과 같은 여러 가지 상황에서 제공업체에 요청을 보냅니다.
위의 모든 상황에서 Webhooks는 다음과 같은 형식에 따라 POST
요청으로 전송됩니다.
{ "object": "link", "entry": [ { "time": int, "changes": [ { "field": "preview", "value": { "community": { "id": string, }, "user": { "id": string, }, "link": string, } } ] } ] }
이 페이로드에는 다음의 필드가 포함됩니다.
필드 이름 | 설명 |
---|---|
| Webhooks 주제. 이 컨텍스트에서는 항상 |
| 요청의 리스트. 항상 정확히 1개입니다. |
| 요청을 보낸 시간. |
| 이 요청의 변경 사항 리스트. 항상 정확히 1개입니다. |
| Webhooks 필드. 항상 |
| 요청의 컨텍스트를 포함하는 실제 개체. |
| 요청을 트리거한 사용자의 커뮤니티. |
| 요청을 트리거한 사용자. |
| Workplace가 렌더링을 시도하는 링크. 앱에서 구성한 도메인 및 정규식과 일치합니다. |
POST /callback HTTP/1.1 Host: third-party.com Accept: application/json Content-Type: application/json User-Agent: Webhooks/1.0 (https://fb.me/webhooks) X-Hub-Signature: sha1=bf3102e52efd0fd4bd26277030aa180d7b5cf587 ... { "object": "link", "entry": [{ "time": 1501515097793, "changes": [{ "field": "preview", "value": { "community": { "id": "138169208138649" }, "user": { "id": "88575656148087" } "link": "https://company.third-party.com/document-about-this" } }] }] }
Webhooks 요청을 수신하면 특정 응답 형식으로 메타데이터 페이로드를 제공해야 합니다.
{ "data": [ { "link": string, ?"canonical_link": string, ?"title": string, ?"description": string, ?"icon": string, ?"download_url": string, "privacy": 'organization' | 'accessible' | 'inaccessible', ?"type": 'document' | 'folder' | 'task' | 'link', ?"additional_data": [ { "title" => string, "format" => 'text' | 'date' | 'datetime' | 'user', "value" => string | number, ?"color" => 'blue' | 'green' | 'yellow' | orange' | 'red', }, ], } ], ?"linked_user": boolean }
이 페이로드에는 다음의 필드를 포함해야 합니다.
필드 이름 | 설명 |
---|---|
| 사용자에게 제공되는 항목의 컬렉션. 앱이 해당 사용자에 대해 이 링크를 펼치지 않기로 선택하는 경우 비워둘 수 있습니다. |
| 타사가 사용자에 대해 인식하는지 여부를 나타내는 부울 필드. |
| 이 항목에 대한 고유 식별 링크. 요청의 링크와 일치해야 합니다. |
| 이 콘텐츠의 표준 URL 표현. 링크와 다른 경우, 관련 공유를 더욱 쉽게 쿼리하기 위해 이 콘텐츠가 표준 콘텐츠와 연결됩니다. |
| 이 항목의 제목. 공개 범위가 액세스 불가로 설정된 항목을 제외하고 반드시 존재해야 합니다. |
| 고급 미리 보기에 렌더링될 항목에 대한 간단한 설명. |
| Workplace가 콘텐츠 아이콘을 표시하는 위치에 대한 이 콘텐츠의 자산. 반드시 URL이어야 하고 공개적으로 액세스할 수 있어야 합니다. 최상의 결과를 얻기 위해서는 이 자산이 16픽셀 정사각형이어야 합니다. |
| Workplace에서 항목의 PDF 버전을 다운로드하여 이미지 게시물로 변환할 수 있는 URL. |
| 개체의 공개 범위를 의미합니다. |
|
|
| 고급 미리 보기에 렌더링될 메타데이터의 컬렉션. |
HTTP/1.1 200 OK Content-Type: application/json X-Hub-Signature: sha1=b5a6f32f084100ae5b355174b9bb8398f5fbe983 ... { "data": [ { "link": "https://taaskly.herokuapp.com/task/4", "title": "Launch Workplace Integration for F8", "privacy": "organization", "type": "task", "additional_data": [ { "title": "Owner", "format": "user", "value": "319922278498384" }, { "title": "Created", "format": "datetime", "value": "2018-02-28T03:35:40.827Z" }, { "title": "Priority", "format": "text", "value": "high", "color": "red" } ] } ], "linked_user": true }
공개 범위 모드는 현재 사용자와 이후 사용자에 대해 사용자 인증이 필요한지 여부를 나타내는 가시성을 결정합니다.
organization
: 사용자에게 표시, 사용자 인증 불필요accessible
: 현재 사용자에게 표시, 다른 사용자의 경우 사용자 ID 매핑이 필요할 수 있음inaccessible
: 사용자에게 표시하지 않음링크 미리 보기에서 자세한 정보를 추가하려면 추가 데이터 항목을 **3개**까지 보낼 수 있습니다. 추가 데이터 항목은 일련의 키-값 요소로 구성됩니다. 하지만 값은 다양한 방식으로 형식을 지정할 수 있습니다.
현재 다음과 같은 네 가지 형식이 지원됩니다.
text
: 값을 있는 그대로 렌더링합니다. 이 값은 반드시 문자열이어야 합니다. 이 형식의 경우 추가 데이터에는 color
속성도 포함될 수 있습니다. 이는 blue
, green
, yellow
, orange
, red
값 중 하나여야 합니다. 값이 있을 경우, 배경으로 색을 포함하여 값을 렌더링합니다.date
: 시간 없이 ISO-8601 날짜 형식으로 값을 파싱하고 시간 표시 없이 이를 렌더링합니다.datetime
: 시간 및 시간대를 포함하여 ISO-8601 날짜 형식으로 값을 파싱하고 사용자 시간대의 시간 표시를 포함하여 렌더링합니다.user
: 사용자 ID로 값을 파싱하고 사용자 이름을 렌더링합니다.문서의 공개 범위 모드가 organization
또는 accessible
로 표시되고 다운로드 URL이 제공되는 경우 Facebook에서 데이터를 다운로드하기 위한 추가 요청을 전송합니다.
GET /download/super-fancy-document HTTP/1.1 Host: provider.com Accept: <some mime types> User-Agent: Webhooks/1.0 (https://fb.me/webhooks) X-Hub-Signature: sha1=bf3102e52efd0fd4bd26277030aa180d7b5cf587
그러면 Workplace에서 이 필드를 사진으로 변환하여 여러 사진이 포함된 게시물을 만듭니다.
앞서 보았듯이 인증된 미리 보기를 제공하려면 일종의 ID 매핑이 필요합니다. ID 매핑은 Workplace 사용자에게 미리 보기 대상인 콘텐츠를 볼 권한이 있는지 여부를 관리하고 Workplace에서 콘텐츠의 액세스 규칙을 준수하도록 보장합니다.
ID 매핑의 가장 간단한 형식은 조직 전체 매핑입니다. 이 경우 Workplace 커뮤니티의 멤버십이면 Workplace 사용자에게 미리 보기를 표시할 수 있습니다. 이 시나리오는 회사 전체 인트라넷이나 모든 개체(또는 적어도 메타데이터)가 회사 전체에 표시되는 서비스에 대한 링크를 미리 볼 때 일반적입니다.
통합이 Workplace 커뮤니티에 설치된 경우, 설치 시 가져온 액세스 토큰을 사용하여 /community
엔드포인트를 통해 커뮤니티 ID를 확인할 수 있습니다. 토큰과 함께 이 커뮤니티 ID를 저장하고 테넌트 또는 서비스 내부의 조직 식별자에 매핑할 수 있습니다. 그러면 Workplace 커뮤니티와 서비스 범위 내의 조직 간에 매핑이 생성됩니다.
그런 다음, 인증된 미리 보기 Webhooks 요청에 응답할 때 Webhooks 페이로드의 커뮤니티 ID가 조직에 연결된 커뮤니티 ID와 일치한지 확인한 후 메타데이터 페이로드를 반환해도 안전한지 결정할 수 있습니다. 페이로드의 공개 범위를 ORGANIZATION으로 표시하면 Facebook이 해당 Webhooks 커뮤니티에서 각 사용자에 대해 추가적인 Webhooks를 전송할 필요가 없습니다.
추가적인 권한 세분화가 필요한 경우 사용자별 매핑을 지원하여 Workplace에서 개별적으로 각각의 보는 사람에 대해 메타데이터를 렌더링할지 여부를 선택할 수 있습니다. Workplace는 인증된 미리 보기에 대해 각 Webhooks 페이로드에서 사용자 ID를 전송합니다. 사용자별 매핑을 지원하려면 시스템의 어떤 사용자 기록이 Webhooks 페이로드에서 전송된 Workplace 사용자 ID에 매핑되는지 알아야 합니다.
특정 Workplace 사용자 ID를 처음 접하는 경우 부울 필드 linked_user
를 false
로 설정하여 응답할 수 있습니다. 그러면 Workplace에서 사용자가 자신의 계정을 연결하도록 유도하는 미리 보기 활성화 버튼이 표시됩니다.
이 버튼을 누르면 Workplace에서 자신이 정의한 계정 연결 엔드포인트 대화 상자가 열립니다. 여기에서 서비스의 사용자 세션을 검증할 수 있습니다. Workplace에서 POST 요청을 통해 이 URL을 열고, 서명된 요청 매개변수를 전달합니다. 여기에는 현재 사용자 ID 및 커뮤니티 ID가 포함되어 있습니다.
POST https://www.example.com/account_linking?redirect_uri=https%3A%2F%2Ffoxfabrics.facebook.com%2Flink_complete HTTP/1.1 Host: foxfabrics.third-party.com Origin: http://www.facebook.com Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 Gecko/20100101 Firefox/57.0 ... signed_request=238fsdfsd.oijdoifjsidf899
페이로드에는 해당 사용자에 대한 정보가 포함된 signed_request 매개변수가 있습니다. 이 요청은 다음과 같이 디코딩할 수 있습니다.
이 페이로드에는 다음의 필드가 포함됩니다.
{ "algorithm": "HMAC-SHA256", "user_id": "88575656148087", "community_id": "138169208138649" }
이때 Workplace 사용자 ID 및 커뮤니티 ID와 더불어 서비스 범위 내의 검증된 사용자 세션을 얻게 됩니다. 그러면 서비스 범위 내의 ID 외에도 해당 사용자의 Workplace ID를 기록할 수 있게 됩니다. 완료 후에는 원래 요청에 대해 쿼리 매개변수 redirect_uri로 제공되었던 URL로 리디렉션됩니다.
GET {$redirect_uri} HTTP/1.1 Host: foxfabrics.facebook.com User-Agent: Mozilla/5.0 Gecko/20100101 Firefox/57.0 Referer: https://www.example.com/account_linking ...
그러면 Workplace가 ID 매핑이 완성되었음을 인식하고, 인증된 미리 보기 메타데이터를 다시 요청하려고 시도합니다. 이번에는 linked_user
를 true
로 설정하여 응답하고 필요한 메타데이터를 제공합니다.
이런 전반적인 왕복 과정은 알 수 없는 사용자가 처음으로 콘텐츠를 미리 보려고 시도할 때마다 한 번만 발생해야 합니다. ID 매핑이 완성되면 그 이후의 미리 보기는 이 왕복 과정을 건너뛸 수 있게 됩니다.
사용자가 Workplace에 공유하는 링크의 인증된 미리 보기를 제공하는 것은 그 자체만으로도 매우 강력한 기능입니다. 하지만 구성 도구 확장 기능을 지원하면 사용자가 앱에서 작업하던 콘텐츠를 Workplace에서 직접 공유하는 것을 훨씬 쉽게 만들 수 있습니다.
통합이 구성 도구 확장 기능을 지원할 경우, 사용자가 활성화된 Workplace 그룹에서 게시물을 작성하기 시작할 때 최근 또는 관련 문서의 리스트를 제공할 수 있고 Workplace는 해당 리스트를 렌더링하여 사용자가 URL을 복사해서 붙여 넣을 필요 없이 공유할 수 있도록 합니다. 그 과정에서 얻은 공유 개체는 인증된 미리 보기 기능의 권한을 따르는 등, 수동으로 공유한 개체와 동일하게 작동합니다.
구성 도구 확장 기능은 ID가 매핑된 사용자를 필요로 하므로 개인화된 문서 리스트를 구성 도구에 반환할 수 있습니다.
구성 도구 확장 기능을 지원하려면 앱에 다음과 같은 구성이 필요합니다.
link
주제 및 collection
필드에 대한 Webhooks 구독.링크된 사용자가 통합의 구성 도구 확장 기능을 호출하면 Workplace가 Webhooks를 보내서 다음의 형식으로 문서 리스트를 가져오도록 합니다.
{ "object": "link", "entry": [ { "time": int, "changes": [ { "field": "collection", "value": { "community": { "id": string, }, "user": { "id": string, }, ?"link": string, } } ] } ] }
이 페이로드에는 다음의 필드가 포함됩니다.
필드 이름 | 설명 |
---|---|
| Webhooks 주제. 이 컨텍스트에서는 항상 |
| 요청의 리스트. 항상 정확히 1개입니다. |
| 요청을 보낸 시간. |
| 이 요청의 변경 사항 리스트. 항상 정확히 1개입니다. |
| Webhooks 필드. 항상 |
| 요청의 컨텍스트를 포함하는 실제 개체. |
| 요청을 트리거한 사용자의 커뮤니티. |
| 요청을 트리거한 사용자. |
| 사용자가 폴더로 드릴다운하는 경우, 하위 요청에 대해 설정되지만 루트 요청에는 표시되지 않습니다. |
예:
POST /callback HTTP/1.1 Host: third-party.com Accept: application/json Content-Type: application/json User-Agent: Webhooks/1.0 (https://fb.me/webhooks) X-Hub-Signature: sha1=bf3102e52efd0fd4bd26277030aa180d7b5cf587 ... { "object": "link", "entry": [{ "time": 1501515097793, "changes": [{ "field": "collection", "value": { "community": { "id": "138169208138649" }, "user": { "id": "88575656148087" } } }] }] }
이 요청을 처리하려면 콜백 URL이 'X-Hub-Signature'을 인증하고 구성 도구에서 다음의 형식으로 표시될 개체 세트를 포함하여 응답해야 합니다.
{ "data": [ { "link": string, "title": string, ?"description": string, ?"icon": string, ?"download_url": string, "privacy": ORGANIZATION | ACCESSIBLE, "type": DOCUMENT | FOLDER | TASK | LINK, ?"additional_data": [ { "title" => string, "format" => 'text' | 'date' | 'datetime' | 'user', "value" => string | number, }, ], } ], ?"linked_user": boolean }
이 페이로드에는 다음의 필드를 포함해야 합니다.
필드 이름 | 설명 |
---|---|
| 사용자에게 제공되는 항목 컬렉션 |
| 타사가 사용자에 대해 인식하는지 여부를 나타내는 부울 필드. |
| 이 항목에 대한 고유한 식별 링크. |
| 이 항목의 제목. 공개 범위가 액세스 불가로 설정된 항목을 제외하고 반드시 존재해야 합니다. |
| 고급 미리 보기에 렌더링될 항목에 대한 간단한 설명. |
| Workplace가 콘텐츠 아이콘을 표시하는 위치에 대한 이 콘텐츠의 자산. 반드시 URL이어야 하고 공개적으로 액세스할 수 있어야 합니다. 최상의 결과를 얻기 위해서는 이 자산이 16픽셀 정사각형이어야 합니다. |
| Workplace에서 항목의 PDF 버전을 다운로드하여 이미지 게시물로 변환할 수 있는 URL. |
| 개체의 공개 범위를 의미합니다. |
|
|
| 고급 미리 보기에 렌더링될 메타데이터의 컬렉션. |
예:
HTTP/1.1 200 OK Content-Type: application/json X-Hub-Signature: sha1=b5a6f32f084100ae5b355174b9bb8398f5fbe983 ... { "data": [ { "link": "https://company.third-party.com/document-A", "title": "Slides for Project A", "description": "Short summary of the slides.", "download_url": "https://company.provider.com/download/document-A", "privacy": "accessible", "type": "document" }, { "link": "https://company.third-party.com/folder-B", "title": "Folder B", "privacy": "public", "type": "folder", } ], "linked_user": true }