[{"data":1,"prerenderedAt":1865},["ShallowReactive",2],{"docs-navigation:en":3,"\u002Fdocs\u002Fen\u002Fsite-owners\u002Fintegrations\u002Fsingle-sign-on":161,"\u002Fdocs\u002Fen\u002Fsite-owners\u002Fintegrations\u002Fsingle-sign-on:surround":1860},[4],{"title":5,"path":6,"stem":7,"children":8,"page":41},"Docs","\u002Fdocs","docs",[9],{"title":10,"path":11,"stem":12,"children":13,"page":41},"En","\u002Fdocs\u002Fen","docs\u002Fen",[14,106],{"title":15,"icon":16,"path":17,"stem":18,"children":19},"Site owners","i-ph:storefront-duotone","\u002Fdocs\u002Fen\u002Fsite-owners","docs\u002Fen\u002F1.site-owners\u002Findex",[20,23,42,64,86,96],{"title":21,"path":17,"stem":18,"icon":22},"Introduction","i-ph:house-line-duotone",{"title":24,"icon":25,"path":26,"stem":27,"children":28,"page":41},"Getting started","i-ph:rocket-launch-duotone","\u002Fdocs\u002Fen\u002Fsite-owners\u002Fgetting-started","docs\u002Fen\u002F1.site-owners\u002F1.getting-started",[29,33,37],{"title":30,"path":31,"stem":32},"Quick start","\u002Fdocs\u002Fen\u002Fsite-owners\u002Fgetting-started\u002Fquick-start","docs\u002Fen\u002F1.site-owners\u002F1.getting-started\u002F1.quick-start",{"title":34,"path":35,"stem":36},"Installation","\u002Fdocs\u002Fen\u002Fsite-owners\u002Fgetting-started\u002Finstallation","docs\u002Fen\u002F1.site-owners\u002F1.getting-started\u002F2.installation",{"title":38,"path":39,"stem":40},"Appearance and language","\u002Fdocs\u002Fen\u002Fsite-owners\u002Fgetting-started\u002Fappearance","docs\u002Fen\u002F1.site-owners\u002F1.getting-started\u002F3.appearance",false,{"title":43,"icon":44,"path":45,"stem":46,"children":47,"page":41},"Moderation","i-ph:shield-check-duotone","\u002Fdocs\u002Fen\u002Fsite-owners\u002Fmoderation","docs\u002Fen\u002F1.site-owners\u002F2.moderation",[48,52,56,60],{"title":49,"path":50,"stem":51},"How moderation works","\u002Fdocs\u002Fen\u002Fsite-owners\u002Fmoderation\u002Fhow-it-works","docs\u002Fen\u002F1.site-owners\u002F2.moderation\u002F1.how-it-works",{"title":53,"path":54,"stem":55},"Moderating comments","\u002Fdocs\u002Fen\u002Fsite-owners\u002Fmoderation\u002Fmoderating-comments","docs\u002Fen\u002F1.site-owners\u002F2.moderation\u002F2.moderating-comments",{"title":57,"path":58,"stem":59},"Rules and lifecycle","\u002Fdocs\u002Fen\u002Fsite-owners\u002Fmoderation\u002Frules-and-lifecycle","docs\u002Fen\u002F1.site-owners\u002F2.moderation\u002F3.rules-and-lifecycle",{"title":61,"path":62,"stem":63},"Banning commenters","\u002Fdocs\u002Fen\u002Fsite-owners\u002Fmoderation\u002Fbanning-commenters","docs\u002Fen\u002F1.site-owners\u002F2.moderation\u002F4.banning-commenters",{"title":65,"icon":66,"path":67,"stem":68,"children":69,"page":41},"Widgets and team","i-ph:app-window-duotone","\u002Fdocs\u002Fen\u002Fsite-owners\u002Fwidgets","docs\u002Fen\u002F1.site-owners\u002F3.widgets",[70,74,78,82],{"title":71,"path":72,"stem":73},"Managing widgets","\u002Fdocs\u002Fen\u002Fsite-owners\u002Fwidgets\u002Fmanaging-widgets","docs\u002Fen\u002F1.site-owners\u002F3.widgets\u002F1.managing-widgets",{"title":75,"path":76,"stem":77},"Team and roles","\u002Fdocs\u002Fen\u002Fsite-owners\u002Fwidgets\u002Fteam-and-roles","docs\u002Fen\u002F1.site-owners\u002F3.widgets\u002F2.team-and-roles",{"title":79,"path":80,"stem":81},"Reactions and emoji","\u002Fdocs\u002Fen\u002Fsite-owners\u002Fwidgets\u002Freactions-and-emoji","docs\u002Fen\u002F1.site-owners\u002F3.widgets\u002F3.reactions-and-emoji",{"title":83,"path":84,"stem":85},"Badges","\u002Fdocs\u002Fen\u002Fsite-owners\u002Fwidgets\u002Fbadges","docs\u002Fen\u002F1.site-owners\u002F3.widgets\u002F4.badges",{"title":87,"icon":88,"path":89,"stem":90,"children":91,"page":41},"Integrations","i-ph:plugs-connected-duotone","\u002Fdocs\u002Fen\u002Fsite-owners\u002Fintegrations","docs\u002Fen\u002F1.site-owners\u002F4.integrations",[92],{"title":93,"path":94,"stem":95},"Single sign-on","\u002Fdocs\u002Fen\u002Fsite-owners\u002Fintegrations\u002Fsingle-sign-on","docs\u002Fen\u002F1.site-owners\u002F4.integrations\u002F1.single-sign-on",{"title":97,"icon":98,"path":99,"stem":100,"children":101,"page":41},"Billing","i-ph:crown-duotone","\u002Fdocs\u002Fen\u002Fsite-owners\u002Fbilling","docs\u002Fen\u002F1.site-owners\u002F5.billing",[102],{"title":103,"path":104,"stem":105},"Plans and billing","\u002Fdocs\u002Fen\u002Fsite-owners\u002Fbilling\u002Fplans-and-billing","docs\u002Fen\u002F1.site-owners\u002F5.billing\u002F1.plans-and-billing",{"title":107,"icon":108,"path":109,"stem":110,"children":111},"Readers","i-ph:chat-circle-text-duotone","\u002Fdocs\u002Fen\u002Freaders","docs\u002Fen\u002F2.readers\u002Findex",[112,113,125,143],{"title":21,"path":109,"stem":110,"icon":22},{"title":24,"icon":25,"path":114,"stem":115,"children":116,"page":41},"\u002Fdocs\u002Fen\u002Freaders\u002Fgetting-started","docs\u002Fen\u002F2.readers\u002F1.getting-started",[117,121],{"title":118,"path":119,"stem":120},"Signing in","\u002Fdocs\u002Fen\u002Freaders\u002Fgetting-started\u002Fsigning-in","docs\u002Fen\u002F2.readers\u002F1.getting-started\u002F1.signing-in",{"title":122,"path":123,"stem":124},"Your profile","\u002Fdocs\u002Fen\u002Freaders\u002Fgetting-started\u002Fyour-profile","docs\u002Fen\u002F2.readers\u002F1.getting-started\u002F2.your-profile",{"title":126,"icon":127,"path":128,"stem":129,"children":130,"page":41},"Commenting","i-ph:chats-circle-duotone","\u002Fdocs\u002Fen\u002Freaders\u002Fcommenting","docs\u002Fen\u002F2.readers\u002F2.commenting",[131,135,139],{"title":132,"path":133,"stem":134},"Writing comments","\u002Fdocs\u002Fen\u002Freaders\u002Fcommenting\u002Fwriting-comments","docs\u002Fen\u002F2.readers\u002F2.commenting\u002F1.writing-comments",{"title":136,"path":137,"stem":138},"Reading and reacting","\u002Fdocs\u002Fen\u002Freaders\u002Fcommenting\u002Freading-and-reacting","docs\u002Fen\u002F2.readers\u002F2.commenting\u002F2.reading-and-reacting",{"title":140,"path":141,"stem":142},"Why a comment waits or disappears","\u002Fdocs\u002Fen\u002Freaders\u002Fcommenting\u002Fwhen-comments-wait","docs\u002Fen\u002F2.readers\u002F2.commenting\u002F3.when-comments-wait",{"title":144,"icon":145,"path":146,"stem":147,"children":148,"page":41},"Your account","i-ph:user-circle-duotone","\u002Fdocs\u002Fen\u002Freaders\u002Faccount","docs\u002Fen\u002F2.readers\u002F3.account",[149,153,157],{"title":150,"path":151,"stem":152},"Notifications","\u002Fdocs\u002Fen\u002Freaders\u002Faccount\u002Fnotifications","docs\u002Fen\u002F2.readers\u002F3.account\u002F1.notifications",{"title":154,"path":155,"stem":156},"Your comments and likes","\u002Fdocs\u002Fen\u002Freaders\u002Faccount\u002Fyour-activity","docs\u002Fen\u002F2.readers\u002F3.account\u002F2.your-activity",{"title":158,"path":159,"stem":160},"Linked sites","\u002Fdocs\u002Fen\u002Freaders\u002Faccount\u002Flinked-sites","docs\u002Fen\u002F2.readers\u002F3.account\u002F3.linked-sites",{"id":162,"title":93,"body":163,"description":1855,"extension":1856,"meta":1857,"navigation":460,"path":94,"seo":1858,"stem":95,"__hash__":1859},"docs_en\u002Fdocs\u002Fen\u002F1.site-owners\u002F4.integrations\u002F1.single-sign-on.md",{"type":164,"value":165,"toc":1842},"minimark",[166,171,194,198,202,209,272,276,283,402,408,1374,1378,1381,1496,1503,1506,1713,1725,1728,1732,1735,1750,1753,1757,1772,1776,1838],[167,168,170],"h2",{"id":169},"how-it-works","How it works",[172,173,174,183,191],"ol",{},[175,176,177,178,182],"li",{},"While a reader is signed in to your site, your ",[179,180,181],"strong",{},"backend"," signs a short-lived token that says who they are.",[175,184,185,186,190],{},"Your page passes that token to the comment widget in the ",[187,188,189],"code",{},"sso-token"," attribute.",[175,192,193],{},"Crowment checks the signature and signs the reader in to the comments under that identity.",[195,196,197],"p",{},"The token is signed with a secret that only your server and Crowment know, so nobody can sign readers in as someone else. Single sign-on is available on every plan.",[167,199,201],{"id":200},"_1-turn-it-on","1. Turn it on",[195,203,204,205,208],{},"Open ",[179,206,207],{},"Site Console → your widget → Single Sign-On",". Owners and admins can change the settings.",[210,211,213,218,229,233,254,258],"steps",{"level":212},"3",[214,215,217],"h3",{"id":216},"create-the-signing-secret","Create the signing secret",[195,219,220,221,224,225,228],{},"Only the widget owner can do this. The secret is shown ",[179,222,223],{},"once",": store it in your backend's environment, for example as ",[187,226,227],{},"CROWMENT_SSO_SECRET",". Never put it in browser code, an app bundle or a public repository.",[214,230,232],{"id":231},"pick-a-mode","Pick a mode",[234,235,236,242,248],"ul",{},[175,237,238,241],{},[179,239,240],{},"Off",": readers sign in with Crowment only.",[175,243,244,247],{},[179,245,246],{},"Optional",": readers signed in on your site are signed in automatically; Crowment sign-in stays available.",[175,249,250,253],{},[179,251,252],{},"Required",": only your site's accounts can sign in. Comments and sessions that already exist stay.",[214,255,257],{"id":256},"set-your-sign-in-and-sign-out-pages-optional","Set your sign-in and sign-out pages (optional)",[195,259,260,261,264,265,268,269,271],{},"Both must be on your widget's domain. The widget's login button sends readers to your ",[179,262,263],{},"sign-in page"," with a ",[187,266,267],{},"return_to"," parameter holding the page they came from. Check that ",[187,270,267],{}," points to your own site before redirecting to it.",[167,273,275],{"id":274},"_2-sign-a-token-on-your-server","2. Sign a token on your server",[195,277,278,279,282],{},"Sign a JWT with ",[179,280,281],{},"HS256"," and your secret, on every page view where a reader is signed in.",[284,285,286,301],"table",{},[287,288,289],"thead",{},[290,291,292,296,298],"tr",{},[293,294,295],"th",{},"Claim",[293,297,252],{},[293,299,300],{},"Value",[302,303,304,322,334,351,374,386],"tbody",{},[290,305,306,312,315],{},[307,308,309],"td",{},[187,310,311],{},"sub",[307,313,314],{},"yes",[307,316,317,318,321],{},"The reader's user ID on your site, as a ",[179,319,320],{},"string",", at most 128 characters. Use an ID that never changes and is never reused; an email address is a poor choice.",[290,323,324,329,331],{},[307,325,326],{},[187,327,328],{},"name",[307,330,314],{},[307,332,333],{},"The name shown next to their comments, up to 100 characters. HTML is removed.",[290,335,336,341,344],{},[307,337,338],{},[187,339,340],{},"avatar",[307,342,343],{},"no",[307,345,346,347,350],{},"An ",[187,348,349],{},"https:\u002F\u002F"," image URL. Anything else is ignored.",[290,352,353,358,360],{},[307,354,355],{},[187,356,357],{},"badges",[307,359,343],{},[307,361,362,363,366,367,369,370,373],{},"Keys of the badges the reader holds, e.g. ",[187,364,365],{},"[\"vip\"]",", matching the SSO keys set under ",[179,368,83],{},". Leave it out to keep their badges as they are; ",[187,371,372],{},"[]"," removes the badges they got this way. Badges given in the dashboard stay.",[290,375,376,381,383],{},[307,377,378],{},[187,379,380],{},"aud",[307,382,314],{},[307,384,385],{},"Your widget's app key, exactly as in the embed code.",[290,387,388,397,399],{},[307,389,390,393,394],{},[187,391,392],{},"iat",", ",[187,395,396],{},"exp",[307,398,314],{},[307,400,401],{},"Issued-at and expiry, in seconds. The token may live at most one hour. A minute of clock difference is tolerated.",[195,403,346,404,407],{},[187,405,406],{},"email"," claim is not needed and not used: Crowment never matches accounts by email.",[409,410,411,613,854,1124],"code-group",{},[412,413,419],"pre",{"className":414,"code":415,"filename":416,"language":417,"meta":418,"style":418},"language-js shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F npm install jsonwebtoken\nimport jwt from 'jsonwebtoken'\n\nconst ssoToken = jwt.sign(\n  { sub: String(user.id), name: user.displayName, avatar: user.avatarUrl },\n  process.env.CROWMENT_SSO_SECRET,\n  { algorithm: 'HS256', audience: CROWMENT_APP_KEY, expiresIn: '1h' },\n)\n","Node.js","js","",[187,420,421,430,455,462,488,545,563,607],{"__ignoreMap":418},[422,423,426],"span",{"class":424,"line":425},"line",1,[422,427,429],{"class":428},"sHwdD","\u002F\u002F npm install jsonwebtoken\n",[422,431,433,437,441,444,448,452],{"class":424,"line":432},2,[422,434,436],{"class":435},"s7zQu","import",[422,438,440],{"class":439},"sTEyZ"," jwt ",[422,442,443],{"class":435},"from",[422,445,447],{"class":446},"sMK4o"," '",[422,449,451],{"class":450},"sfazB","jsonwebtoken",[422,453,454],{"class":446},"'\n",[422,456,458],{"class":424,"line":457},3,[422,459,461],{"emptyLinePlaceholder":460},true,"\n",[422,463,465,469,472,475,478,481,485],{"class":424,"line":464},4,[422,466,468],{"class":467},"spNyl","const",[422,470,471],{"class":439}," ssoToken ",[422,473,474],{"class":446},"=",[422,476,477],{"class":439}," jwt",[422,479,480],{"class":446},".",[422,482,484],{"class":483},"s2Zo4","sign",[422,486,487],{"class":439},"(\n",[422,489,491,494,498,501,504,507,509,512,515,518,520,523,525,528,530,533,535,537,539,542],{"class":424,"line":490},5,[422,492,493],{"class":446},"  {",[422,495,497],{"class":496},"swJcz"," sub",[422,499,500],{"class":446},":",[422,502,503],{"class":483}," String",[422,505,506],{"class":439},"(user",[422,508,480],{"class":446},[422,510,511],{"class":439},"id)",[422,513,514],{"class":446},",",[422,516,517],{"class":496}," name",[422,519,500],{"class":446},[422,521,522],{"class":439}," user",[422,524,480],{"class":446},[422,526,527],{"class":439},"displayName",[422,529,514],{"class":446},[422,531,532],{"class":496}," avatar",[422,534,500],{"class":446},[422,536,522],{"class":439},[422,538,480],{"class":446},[422,540,541],{"class":439},"avatarUrl ",[422,543,544],{"class":446},"},\n",[422,546,548,551,553,556,558,560],{"class":424,"line":547},6,[422,549,550],{"class":439},"  process",[422,552,480],{"class":446},[422,554,555],{"class":439},"env",[422,557,480],{"class":446},[422,559,227],{"class":439},[422,561,562],{"class":446},",\n",[422,564,566,568,571,573,575,577,580,582,585,587,590,592,595,597,599,602,604],{"class":424,"line":565},7,[422,567,493],{"class":446},[422,569,570],{"class":496}," algorithm",[422,572,500],{"class":446},[422,574,447],{"class":446},[422,576,281],{"class":450},[422,578,579],{"class":446},"'",[422,581,514],{"class":446},[422,583,584],{"class":496}," audience",[422,586,500],{"class":446},[422,588,589],{"class":439}," CROWMENT_APP_KEY",[422,591,514],{"class":446},[422,593,594],{"class":496}," expiresIn",[422,596,500],{"class":446},[422,598,447],{"class":446},[422,600,601],{"class":450},"1h",[422,603,579],{"class":446},[422,605,606],{"class":446}," },\n",[422,608,610],{"class":424,"line":609},8,[422,611,612],{"class":439},")\n",[412,614,619],{"className":615,"code":616,"filename":617,"language":618,"meta":418,"style":418},"language-php shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F composer require firebase\u002Fphp-jwt\nuse Firebase\\JWT\\JWT;\n\n$now = time();\n$ssoToken = JWT::encode([\n    'sub'    => (string) $user->id,\n    'name'   => $user->display_name,\n    'avatar' => $user->avatar_url,\n    'aud'    => CROWMENT_APP_KEY,\n    'iat'    => $now,\n    'exp'    => $now + 3600,\n], getenv('CROWMENT_SSO_SECRET'), 'HS256');\n","PHP","php",[187,620,621,626,648,652,668,690,724,746,768,783,801,824],{"__ignoreMap":418},[422,622,623],{"class":424,"line":425},[422,624,625],{"class":428},"\u002F\u002F composer require firebase\u002Fphp-jwt\n",[422,627,628,632,635,638,641,643,645],{"class":424,"line":432},[422,629,631],{"class":630},"sbssI","use",[422,633,634],{"class":439}," Firebase",[422,636,637],{"class":446},"\\",[422,639,640],{"class":439},"JWT",[422,642,637],{"class":446},[422,644,640],{"class":439},[422,646,647],{"class":446},";\n",[422,649,650],{"class":424,"line":457},[422,651,461],{"emptyLinePlaceholder":460},[422,653,654,657,660,662,665],{"class":424,"line":464},[422,655,656],{"class":446},"$",[422,658,659],{"class":439},"now ",[422,661,474],{"class":446},[422,663,664],{"class":483}," time",[422,666,667],{"class":446},"();\n",[422,669,670,672,675,677,681,684,687],{"class":424,"line":490},[422,671,656],{"class":446},[422,673,674],{"class":439},"ssoToken ",[422,676,474],{"class":446},[422,678,680],{"class":679},"sBMFI"," JWT",[422,682,683],{"class":446},"::",[422,685,686],{"class":483},"encode",[422,688,689],{"class":446},"([\n",[422,691,692,695,697,699,702,705,707,710,713,716,719,722],{"class":424,"line":547},[422,693,694],{"class":446},"    '",[422,696,311],{"class":450},[422,698,579],{"class":446},[422,700,701],{"class":446},"    =>",[422,703,704],{"class":446}," (",[422,706,320],{"class":467},[422,708,709],{"class":446},")",[422,711,712],{"class":446}," $",[422,714,715],{"class":439},"user",[422,717,718],{"class":446},"->",[422,720,721],{"class":439},"id",[422,723,562],{"class":446},[422,725,726,728,730,732,735,737,739,741,744],{"class":424,"line":565},[422,727,694],{"class":446},[422,729,328],{"class":450},[422,731,579],{"class":446},[422,733,734],{"class":446},"   =>",[422,736,712],{"class":446},[422,738,715],{"class":439},[422,740,718],{"class":446},[422,742,743],{"class":439},"display_name",[422,745,562],{"class":446},[422,747,748,750,752,754,757,759,761,763,766],{"class":424,"line":609},[422,749,694],{"class":446},[422,751,340],{"class":450},[422,753,579],{"class":446},[422,755,756],{"class":446}," =>",[422,758,712],{"class":446},[422,760,715],{"class":439},[422,762,718],{"class":446},[422,764,765],{"class":439},"avatar_url",[422,767,562],{"class":446},[422,769,771,773,775,777,779,781],{"class":424,"line":770},9,[422,772,694],{"class":446},[422,774,380],{"class":450},[422,776,579],{"class":446},[422,778,701],{"class":446},[422,780,589],{"class":439},[422,782,562],{"class":446},[422,784,786,788,790,792,794,796,799],{"class":424,"line":785},10,[422,787,694],{"class":446},[422,789,392],{"class":450},[422,791,579],{"class":446},[422,793,701],{"class":446},[422,795,712],{"class":446},[422,797,798],{"class":439},"now",[422,800,562],{"class":446},[422,802,804,806,808,810,812,814,816,819,822],{"class":424,"line":803},11,[422,805,694],{"class":446},[422,807,396],{"class":450},[422,809,579],{"class":446},[422,811,701],{"class":446},[422,813,712],{"class":446},[422,815,659],{"class":439},[422,817,818],{"class":446},"+",[422,820,821],{"class":630}," 3600",[422,823,562],{"class":446},[422,825,827,830,833,836,838,840,842,845,847,849,851],{"class":424,"line":826},12,[422,828,829],{"class":446},"],",[422,831,832],{"class":483}," getenv",[422,834,835],{"class":446},"(",[422,837,579],{"class":446},[422,839,227],{"class":450},[422,841,579],{"class":446},[422,843,844],{"class":446},"),",[422,846,447],{"class":446},[422,848,281],{"class":450},[422,850,579],{"class":446},[422,852,853],{"class":446},");\n",[412,855,860],{"className":856,"code":857,"filename":858,"language":859,"meta":418,"style":418},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# pip install pyjwt\nimport os\nfrom datetime import datetime, timedelta, timezone\nimport jwt\n\nnow = datetime.now(timezone.utc)\nsso_token = jwt.encode(\n    {\n        \"sub\": str(user.id),\n        \"name\": user.display_name,\n        \"avatar\": user.avatar_url,\n        \"aud\": CROWMENT_APP_KEY,\n        \"iat\": now,\n        \"exp\": now + timedelta(hours=1),\n    },\n    os.environ[\"CROWMENT_SSO_SECRET\"],\n    algorithm=\"HS256\",\n)\n","Python","python",[187,861,862,867,874,896,903,907,931,946,951,977,995,1013,1027,1043,1074,1080,1103,1119],{"__ignoreMap":418},[422,863,864],{"class":424,"line":425},[422,865,866],{"class":428},"# pip install pyjwt\n",[422,868,869,871],{"class":424,"line":432},[422,870,436],{"class":435},[422,872,873],{"class":439}," os\n",[422,875,876,878,881,883,886,888,891,893],{"class":424,"line":457},[422,877,443],{"class":435},[422,879,880],{"class":439}," datetime ",[422,882,436],{"class":435},[422,884,885],{"class":439}," datetime",[422,887,514],{"class":446},[422,889,890],{"class":439}," timedelta",[422,892,514],{"class":446},[422,894,895],{"class":439}," timezone\n",[422,897,898,900],{"class":424,"line":464},[422,899,436],{"class":435},[422,901,902],{"class":439}," jwt\n",[422,904,905],{"class":424,"line":490},[422,906,461],{"emptyLinePlaceholder":460},[422,908,909,911,913,915,917,919,921,924,926,929],{"class":424,"line":547},[422,910,659],{"class":439},[422,912,474],{"class":446},[422,914,885],{"class":439},[422,916,480],{"class":446},[422,918,798],{"class":483},[422,920,835],{"class":446},[422,922,923],{"class":483},"timezone",[422,925,480],{"class":446},[422,927,928],{"class":496},"utc",[422,930,612],{"class":446},[422,932,933,936,938,940,942,944],{"class":424,"line":565},[422,934,935],{"class":439},"sso_token ",[422,937,474],{"class":446},[422,939,477],{"class":439},[422,941,480],{"class":446},[422,943,686],{"class":483},[422,945,487],{"class":446},[422,947,948],{"class":424,"line":609},[422,949,950],{"class":446},"    {\n",[422,952,953,956,958,961,963,966,968,970,972,974],{"class":424,"line":770},[422,954,955],{"class":446},"        \"",[422,957,311],{"class":450},[422,959,960],{"class":446},"\"",[422,962,500],{"class":446},[422,964,965],{"class":679}," str",[422,967,835],{"class":446},[422,969,715],{"class":483},[422,971,480],{"class":446},[422,973,721],{"class":496},[422,975,976],{"class":446},"),\n",[422,978,979,981,983,985,987,989,991,993],{"class":424,"line":785},[422,980,955],{"class":446},[422,982,328],{"class":450},[422,984,960],{"class":446},[422,986,500],{"class":446},[422,988,522],{"class":483},[422,990,480],{"class":446},[422,992,743],{"class":496},[422,994,562],{"class":446},[422,996,997,999,1001,1003,1005,1007,1009,1011],{"class":424,"line":803},[422,998,955],{"class":446},[422,1000,340],{"class":450},[422,1002,960],{"class":446},[422,1004,500],{"class":446},[422,1006,522],{"class":483},[422,1008,480],{"class":446},[422,1010,765],{"class":496},[422,1012,562],{"class":446},[422,1014,1015,1017,1019,1021,1023,1025],{"class":424,"line":826},[422,1016,955],{"class":446},[422,1018,380],{"class":450},[422,1020,960],{"class":446},[422,1022,500],{"class":446},[422,1024,589],{"class":483},[422,1026,562],{"class":446},[422,1028,1030,1032,1034,1036,1038,1041],{"class":424,"line":1029},13,[422,1031,955],{"class":446},[422,1033,392],{"class":450},[422,1035,960],{"class":446},[422,1037,500],{"class":446},[422,1039,1040],{"class":483}," now",[422,1042,562],{"class":446},[422,1044,1046,1048,1050,1052,1054,1057,1059,1061,1063,1067,1069,1072],{"class":424,"line":1045},14,[422,1047,955],{"class":446},[422,1049,396],{"class":450},[422,1051,960],{"class":446},[422,1053,500],{"class":446},[422,1055,1056],{"class":483}," now ",[422,1058,818],{"class":446},[422,1060,890],{"class":483},[422,1062,835],{"class":446},[422,1064,1066],{"class":1065},"sHdIc","hours",[422,1068,474],{"class":446},[422,1070,1071],{"class":630},"1",[422,1073,976],{"class":446},[422,1075,1077],{"class":424,"line":1076},15,[422,1078,1079],{"class":446},"    },\n",[422,1081,1083,1086,1088,1091,1094,1096,1098,1100],{"class":424,"line":1082},16,[422,1084,1085],{"class":483},"    os",[422,1087,480],{"class":446},[422,1089,1090],{"class":496},"environ",[422,1092,1093],{"class":446},"[",[422,1095,960],{"class":446},[422,1097,227],{"class":450},[422,1099,960],{"class":446},[422,1101,1102],{"class":446},"],\n",[422,1104,1106,1109,1111,1113,1115,1117],{"class":424,"line":1105},17,[422,1107,1108],{"class":1065},"    algorithm",[422,1110,474],{"class":446},[422,1112,960],{"class":446},[422,1114,281],{"class":450},[422,1116,960],{"class":446},[422,1118,562],{"class":446},[422,1120,1122],{"class":424,"line":1121},18,[422,1123,612],{"class":446},[412,1125,1130],{"className":1126,"code":1127,"filename":1128,"language":1129,"meta":418,"style":418},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F go get github.com\u002Fgolang-jwt\u002Fjwt\u002Fv5\nnow := time.Now()\nssoToken, err := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{\n    \"sub\":    strconv.FormatInt(user.ID, 10),\n    \"name\":   user.DisplayName,\n    \"avatar\": user.AvatarURL,\n    \"aud\":    crowmentAppKey,\n    \"iat\":    now.Unix(),\n    \"exp\":    now.Add(time.Hour).Unix(),\n}).SignedString([]byte(os.Getenv(\"CROWMENT_SSO_SECRET\")))\n","Go","go",[187,1131,1132,1137,1154,1195,1230,1250,1269,1284,1305,1339],{"__ignoreMap":418},[422,1133,1134],{"class":424,"line":425},[422,1135,1136],{"class":428},"\u002F\u002F go get github.com\u002Fgolang-jwt\u002Fjwt\u002Fv5\n",[422,1138,1139,1141,1144,1146,1148,1151],{"class":424,"line":432},[422,1140,659],{"class":439},[422,1142,1143],{"class":446},":=",[422,1145,664],{"class":439},[422,1147,480],{"class":446},[422,1149,1150],{"class":483},"Now",[422,1152,1153],{"class":446},"()\n",[422,1155,1156,1159,1161,1164,1166,1168,1170,1173,1175,1178,1180,1183,1185,1187,1189,1192],{"class":424,"line":457},[422,1157,1158],{"class":439},"ssoToken",[422,1160,514],{"class":446},[422,1162,1163],{"class":439}," err ",[422,1165,1143],{"class":446},[422,1167,477],{"class":439},[422,1169,480],{"class":446},[422,1171,1172],{"class":483},"NewWithClaims",[422,1174,835],{"class":446},[422,1176,1177],{"class":439},"jwt",[422,1179,480],{"class":446},[422,1181,1182],{"class":439},"SigningMethodHS256",[422,1184,514],{"class":446},[422,1186,477],{"class":679},[422,1188,480],{"class":446},[422,1190,1191],{"class":679},"MapClaims",[422,1193,1194],{"class":446},"{\n",[422,1196,1197,1200,1202,1204,1206,1209,1211,1214,1216,1218,1220,1223,1225,1228],{"class":424,"line":464},[422,1198,1199],{"class":446},"    \"",[422,1201,311],{"class":450},[422,1203,960],{"class":446},[422,1205,500],{"class":446},[422,1207,1208],{"class":439},"    strconv",[422,1210,480],{"class":446},[422,1212,1213],{"class":483},"FormatInt",[422,1215,835],{"class":446},[422,1217,715],{"class":439},[422,1219,480],{"class":446},[422,1221,1222],{"class":439},"ID",[422,1224,514],{"class":446},[422,1226,1227],{"class":630}," 10",[422,1229,976],{"class":446},[422,1231,1232,1234,1236,1238,1240,1243,1245,1248],{"class":424,"line":490},[422,1233,1199],{"class":446},[422,1235,328],{"class":450},[422,1237,960],{"class":446},[422,1239,500],{"class":446},[422,1241,1242],{"class":439},"   user",[422,1244,480],{"class":446},[422,1246,1247],{"class":439},"DisplayName",[422,1249,562],{"class":446},[422,1251,1252,1254,1256,1258,1260,1262,1264,1267],{"class":424,"line":547},[422,1253,1199],{"class":446},[422,1255,340],{"class":450},[422,1257,960],{"class":446},[422,1259,500],{"class":446},[422,1261,522],{"class":439},[422,1263,480],{"class":446},[422,1265,1266],{"class":439},"AvatarURL",[422,1268,562],{"class":446},[422,1270,1271,1273,1275,1277,1279,1282],{"class":424,"line":565},[422,1272,1199],{"class":446},[422,1274,380],{"class":450},[422,1276,960],{"class":446},[422,1278,500],{"class":446},[422,1280,1281],{"class":439},"    crowmentAppKey",[422,1283,562],{"class":446},[422,1285,1286,1288,1290,1292,1294,1297,1299,1302],{"class":424,"line":609},[422,1287,1199],{"class":446},[422,1289,392],{"class":450},[422,1291,960],{"class":446},[422,1293,500],{"class":446},[422,1295,1296],{"class":439},"    now",[422,1298,480],{"class":446},[422,1300,1301],{"class":483},"Unix",[422,1303,1304],{"class":446},"(),\n",[422,1306,1307,1309,1311,1313,1315,1317,1319,1322,1324,1327,1329,1332,1335,1337],{"class":424,"line":770},[422,1308,1199],{"class":446},[422,1310,396],{"class":450},[422,1312,960],{"class":446},[422,1314,500],{"class":446},[422,1316,1296],{"class":439},[422,1318,480],{"class":446},[422,1320,1321],{"class":483},"Add",[422,1323,835],{"class":446},[422,1325,1326],{"class":439},"time",[422,1328,480],{"class":446},[422,1330,1331],{"class":439},"Hour",[422,1333,1334],{"class":446},").",[422,1336,1301],{"class":483},[422,1338,1304],{"class":446},[422,1340,1341,1344,1347,1350,1353,1355,1358,1360,1363,1365,1367,1369,1371],{"class":424,"line":785},[422,1342,1343],{"class":446},"}).",[422,1345,1346],{"class":483},"SignedString",[422,1348,1349],{"class":446},"([]",[422,1351,1352],{"class":467},"byte",[422,1354,835],{"class":446},[422,1356,1357],{"class":439},"os",[422,1359,480],{"class":446},[422,1361,1362],{"class":483},"Getenv",[422,1364,835],{"class":446},[422,1366,960],{"class":446},[422,1368,227],{"class":450},[422,1370,960],{"class":446},[422,1372,1373],{"class":446},")))\n",[167,1375,1377],{"id":1376},"_3-pass-it-to-the-widget","3. Pass it to the widget",[195,1379,1380],{},"With server-rendered pages, put the token in the embed code:",[412,1382,1386],{"className":1383,"code":1384,"language":1385,"meta":418,"style":418},"language-html shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cscript defer src=\"https:\u002F\u002Fembeds.crowment.com\u002Fcomments.js\">\u003C\u002Fscript>\n\n\u003C!-- signed in: pass the token your backend signed for this page view -->\n\u003Ccrow-comments app-key=\"YOUR_APP_KEY\" sso-token=\"SIGNED_TOKEN\">\u003C\u002Fcrow-comments>\n\n\u003C!-- signed out: leave sso-token out -->\n\u003Ccrow-comments app-key=\"YOUR_APP_KEY\">\u003C\u002Fcrow-comments>\n","html",[187,1387,1388,1419,1423,1428,1465,1469,1474],{"__ignoreMap":418},[422,1389,1390,1393,1396,1399,1402,1404,1406,1409,1411,1414,1416],{"class":424,"line":425},[422,1391,1392],{"class":446},"\u003C",[422,1394,1395],{"class":496},"script",[422,1397,1398],{"class":467}," defer",[422,1400,1401],{"class":467}," src",[422,1403,474],{"class":446},[422,1405,960],{"class":446},[422,1407,1408],{"class":450},"https:\u002F\u002Fembeds.crowment.com\u002Fcomments.js",[422,1410,960],{"class":446},[422,1412,1413],{"class":446},">\u003C\u002F",[422,1415,1395],{"class":496},[422,1417,1418],{"class":446},">\n",[422,1420,1421],{"class":424,"line":432},[422,1422,461],{"emptyLinePlaceholder":460},[422,1424,1425],{"class":424,"line":457},[422,1426,1427],{"class":428},"\u003C!-- signed in: pass the token your backend signed for this page view -->\n",[422,1429,1430,1432,1435,1438,1440,1442,1445,1447,1450,1452,1454,1457,1459,1461,1463],{"class":424,"line":464},[422,1431,1392],{"class":446},[422,1433,1434],{"class":496},"crow-comments",[422,1436,1437],{"class":467}," app-key",[422,1439,474],{"class":446},[422,1441,960],{"class":446},[422,1443,1444],{"class":450},"YOUR_APP_KEY",[422,1446,960],{"class":446},[422,1448,1449],{"class":467}," sso-token",[422,1451,474],{"class":446},[422,1453,960],{"class":446},[422,1455,1456],{"class":450},"SIGNED_TOKEN",[422,1458,960],{"class":446},[422,1460,1413],{"class":446},[422,1462,1434],{"class":496},[422,1464,1418],{"class":446},[422,1466,1467],{"class":424,"line":490},[422,1468,461],{"emptyLinePlaceholder":460},[422,1470,1471],{"class":424,"line":547},[422,1472,1473],{"class":428},"\u003C!-- signed out: leave sso-token out -->\n",[422,1475,1476,1478,1480,1482,1484,1486,1488,1490,1492,1494],{"class":424,"line":565},[422,1477,1392],{"class":446},[422,1479,1434],{"class":496},[422,1481,1437],{"class":467},[422,1483,474],{"class":446},[422,1485,960],{"class":446},[422,1487,1444],{"class":450},[422,1489,960],{"class":446},[422,1491,1413],{"class":446},[422,1493,1434],{"class":496},[422,1495,1418],{"class":446},[195,1497,1498,1499,1502],{},"Pass a token on ",[179,1500,1501],{},"every"," page where the reader is signed in. A page without one tells the widget the reader signed out, and it signs them out of the comments too. Visiting more pages does not sign them in again each time: the widget keeps its session and only exchanges a new token when the reader changes.",[195,1504,1505],{},"In a single-page app, set and remove the attribute as your login state changes, and listen to the widget's events:",[412,1507,1509],{"className":414,"code":1508,"language":417,"meta":418,"style":418},"const widget = document.querySelector('crow-comments')\n\n\u002F\u002F after your site signs the reader in\nwidget.setAttribute('sso-token', await fetchCrowmentToken())\n\n\u002F\u002F after your site signs the reader out\nwidget.removeAttribute('sso-token')\n\n\u002F\u002F the token expired while the page was open: hand over a fresh one\nwidget.addEventListener('crow:sso-expired', async () => {\n  widget.setAttribute('sso-token', await fetchCrowmentToken())\n})\n\n\u002F\u002F Required mode without a sign-in page: show your own login\nwidget.addEventListener('crow:login-required', () => openLoginDialog())\n",[187,1510,1511,1538,1542,1547,1576,1580,1585,1604,1608,1613,1644,1669,1676,1680,1685],{"__ignoreMap":418},[422,1512,1513,1515,1518,1520,1523,1525,1528,1530,1532,1534,1536],{"class":424,"line":425},[422,1514,468],{"class":467},[422,1516,1517],{"class":439}," widget ",[422,1519,474],{"class":446},[422,1521,1522],{"class":439}," document",[422,1524,480],{"class":446},[422,1526,1527],{"class":483},"querySelector",[422,1529,835],{"class":439},[422,1531,579],{"class":446},[422,1533,1434],{"class":450},[422,1535,579],{"class":446},[422,1537,612],{"class":439},[422,1539,1540],{"class":424,"line":432},[422,1541,461],{"emptyLinePlaceholder":460},[422,1543,1544],{"class":424,"line":457},[422,1545,1546],{"class":428},"\u002F\u002F after your site signs the reader in\n",[422,1548,1549,1552,1554,1557,1559,1561,1563,1565,1567,1570,1573],{"class":424,"line":464},[422,1550,1551],{"class":439},"widget",[422,1553,480],{"class":446},[422,1555,1556],{"class":483},"setAttribute",[422,1558,835],{"class":439},[422,1560,579],{"class":446},[422,1562,189],{"class":450},[422,1564,579],{"class":446},[422,1566,514],{"class":446},[422,1568,1569],{"class":435}," await",[422,1571,1572],{"class":483}," fetchCrowmentToken",[422,1574,1575],{"class":439},"())\n",[422,1577,1578],{"class":424,"line":490},[422,1579,461],{"emptyLinePlaceholder":460},[422,1581,1582],{"class":424,"line":547},[422,1583,1584],{"class":428},"\u002F\u002F after your site signs the reader out\n",[422,1586,1587,1589,1591,1594,1596,1598,1600,1602],{"class":424,"line":565},[422,1588,1551],{"class":439},[422,1590,480],{"class":446},[422,1592,1593],{"class":483},"removeAttribute",[422,1595,835],{"class":439},[422,1597,579],{"class":446},[422,1599,189],{"class":450},[422,1601,579],{"class":446},[422,1603,612],{"class":439},[422,1605,1606],{"class":424,"line":609},[422,1607,461],{"emptyLinePlaceholder":460},[422,1609,1610],{"class":424,"line":770},[422,1611,1612],{"class":428},"\u002F\u002F the token expired while the page was open: hand over a fresh one\n",[422,1614,1615,1617,1619,1622,1624,1626,1629,1631,1633,1636,1639,1641],{"class":424,"line":785},[422,1616,1551],{"class":439},[422,1618,480],{"class":446},[422,1620,1621],{"class":483},"addEventListener",[422,1623,835],{"class":439},[422,1625,579],{"class":446},[422,1627,1628],{"class":450},"crow:sso-expired",[422,1630,579],{"class":446},[422,1632,514],{"class":446},[422,1634,1635],{"class":467}," async",[422,1637,1638],{"class":446}," ()",[422,1640,756],{"class":467},[422,1642,1643],{"class":446}," {\n",[422,1645,1646,1649,1651,1653,1655,1657,1659,1661,1663,1665,1667],{"class":424,"line":803},[422,1647,1648],{"class":439},"  widget",[422,1650,480],{"class":446},[422,1652,1556],{"class":483},[422,1654,835],{"class":496},[422,1656,579],{"class":446},[422,1658,189],{"class":450},[422,1660,579],{"class":446},[422,1662,514],{"class":446},[422,1664,1569],{"class":435},[422,1666,1572],{"class":483},[422,1668,1575],{"class":496},[422,1670,1671,1674],{"class":424,"line":826},[422,1672,1673],{"class":446},"}",[422,1675,612],{"class":439},[422,1677,1678],{"class":424,"line":1029},[422,1679,461],{"emptyLinePlaceholder":460},[422,1681,1682],{"class":424,"line":1045},[422,1683,1684],{"class":428},"\u002F\u002F Required mode without a sign-in page: show your own login\n",[422,1686,1687,1689,1691,1693,1695,1697,1700,1702,1704,1706,1708,1711],{"class":424,"line":1076},[422,1688,1551],{"class":439},[422,1690,480],{"class":446},[422,1692,1621],{"class":483},[422,1694,835],{"class":439},[422,1696,579],{"class":446},[422,1698,1699],{"class":450},"crow:login-required",[422,1701,579],{"class":446},[422,1703,514],{"class":446},[422,1705,1638],{"class":446},[422,1707,756],{"class":467},[422,1709,1710],{"class":483}," openLoginDialog",[422,1712,1575],{"class":439},[234,1714,1715,1720],{},[175,1716,1717,1719],{},[187,1718,1628],{},": the widget needed to sign the reader in, but the token had expired. Set a fresh one.",[175,1721,1722,1724],{},[187,1723,1699],{},": Required mode, no sign-in page set, and the reader pressed the login button.",[195,1726,1727],{},"Readers who signed in through your site sign out on your site. Without a sign-out page the widget hides its own sign-out button, since leaving the token out on the next page signs them out anyway.",[167,1729,1731],{"id":1730},"_4-account-linking","4. Account linking",[195,1733,1734],{},"A reader who already has a Crowment account can link it from the comment section, with the link icon next to their avatar. They sign in to Crowment in a popup and confirm on a Crowment page. From then on your site signs them in as their Crowment account, and the comments they wrote with their site account move to it.",[195,1736,1737,1738,1741,1742,1745,1746,1749],{},"Linking lets your site sign that reader in as their Crowment account ",[179,1739,1740],{},"on your own pages","; the confirmation page tells them so. They can unlink at any time under ",[179,1743,1744],{},"Profile → Linked sites"," in the User Console; their comments stay with them. You can switch linking off with ",[179,1747,1748],{},"Account linking"," in the SSO settings.",[195,1751,1752],{},"Names and avatars from your token update the reader's comment profile on every sign-in. Linked Crowment accounts keep their own name and avatar.",[167,1754,1756],{"id":1755},"security","Security",[234,1758,1759,1762,1769],{},[175,1760,1761],{},"Keep the secret on your server. Anyone who has it can sign readers in as anybody on your site.",[175,1763,1764,1765,1768],{},"If it leaks, choose ",[179,1766,1767],{},"Replace secret",". Tokens signed with the old secret stop working at once, so deploy the new one right away. Readers already signed in to the comments stay signed in.",[175,1770,1771],{},"Sign tokens only for the reader of the current request, and keep them short-lived.",[167,1773,1775],{"id":1774},"troubleshooting","Troubleshooting",[284,1777,1778,1788],{},[287,1779,1780],{},[290,1781,1782,1785],{},[293,1783,1784],{},"Symptom",[293,1786,1787],{},"Likely cause",[302,1789,1790,1809,1822,1830],{},[290,1791,1792,1797],{},[307,1793,1794],{},[187,1795,1796],{},"invalid_sso_token",[307,1798,1799,1800,1802,1803,1805,1806,1808],{},"Wrong or replaced secret, ",[187,1801,380],{}," is not the app key, an algorithm other than HS256, ",[187,1804,311],{}," sent as a number, an empty ",[187,1807,328],{},", or a lifetime over one hour.",[290,1810,1811,1816],{},[307,1812,1813],{},[187,1814,1815],{},"sso_token_expired",[307,1817,1818,1819,1821],{},"The token's ",[187,1820,396],{}," has passed, or your server clock is off. Sign a new token per page view.",[290,1823,1824,1827],{},[307,1825,1826],{},"SSO is not enabled for this app",[307,1828,1829],{},"The mode is Off, or no secret was created.",[290,1831,1832,1835],{},[307,1833,1834],{},"Request origin does not match",[307,1836,1837],{},"The page is not on your widget's domain or one of its subdomains.",[1839,1840,1841],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":418,"searchDepth":432,"depth":457,"links":1843},[1844,1845,1850,1851,1852,1853,1854],{"id":169,"depth":432,"text":170},{"id":200,"depth":432,"text":201,"children":1846},[1847,1848,1849],{"id":216,"depth":457,"text":217},{"id":231,"depth":457,"text":232},{"id":256,"depth":457,"text":257},{"id":274,"depth":432,"text":275},{"id":1376,"depth":432,"text":1377},{"id":1730,"depth":432,"text":1731},{"id":1755,"depth":432,"text":1756},{"id":1774,"depth":432,"text":1775},"Readers signed in on your site are signed in to the comments too. No second account, no second login.","md",{},{"title":93,"description":1855},"7EKWEyiCOISPbudOGMWteHQQBOtDveVp5nxn_i_zHFk",[1861,1863],{"title":83,"path":84,"stem":85,"description":1862,"children":-1},"Show your translators, supporters and VIPs next to their names, set by hand or through single sign-on.",{"title":103,"path":104,"stem":105,"description":1864,"children":-1},"What plans limit, how to upgrade, downgrade or cancel, and what happens when a payment fails or you go over a limit.",1792581793919]