当前位置: 首页 > 后端技术 > Node.js

Authing10分钟实现单点登录(SSO)

时间:2023-04-03 23:25:13 Node.js

单点登录(SingleSignOn),简称SSO,是比较流行的企业业务集成解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。如果在开始实现单点登录之前不了解用户池、单点登录、认证授权,建议先阅读基本概念。先决条件基本的HTML和CSS知识中级JavaScript技能所需工具您最喜欢的文本编辑器本地运行的Web服务器(例如:npminstallhttp-server-g)注册一个Authing帐户如果您还没有帐户,请单击此处注册此处的Authing帐户。注册后,请进入控制台,创建用户池。创建OIDC应用第三方登录->OIDC应用标签,点击蓝色“创建OIDC应用”按钮。填写你的应用名称,指定本OIDC应用的二级域名(认证地址)和回调地址,其他参数保持默认即可。单击确定。参数说明认证地址,authing.cn的二级域名,用户将通过该URL登录。回调地址。OIDC登录成功后会回调到开发者自己业务的地址。本教程为演示,地址填写为http://localhost:8080。在实际场景中,您需要填写自己的营业地址。在应用列表中点击新建的应用,记录AppID和二级域名以备后用。使用AuthingSSOSDK集成单点登录创建一个空白的HTML文档来编写Authing程序本教程只是为了演示,所以我们没有选择高级框架,这样可以让我们专注于Authing本身。AuthingSSOExample添加三个在正文中添加三个按钮控件的目的是为了演示如何使用SDK来管理单点登录状态。logintrackSessionlogout引入AuthingSSO和初始化SDK以从CDN加载AuthingSSO。填写你的OIDC申请ID和域名进行初始化。为按钮注册点击事件,实现效果:点击登录按钮,浏览器会跳转到OIDC登录页面,并用户完成身份验证。点击trackSession按钮显示当前登录状态。单击注销按钮执行单次注销。让login=document.getElementById("btn-login");让trackSession=document.getElementById("btn-track-session");让logout=document.getElementById("btn-logout");login.onclick=function(){auth.login();};trackSession.onclick=asyncfunction(){letres=awaitauth.trackSession();alert(JSON.stringify(res));};logout.onclick=asyncfunction(){让res=awaitauth.logout();alert(JSON.stringify(res));};完整代码授权SSO示例登录trackSession注销示例代码可以在Github上找到,它是建议在Github上下载并运行代码运行方法在终端运行如下命令$gitclonehttps://github.com/Authing/authing-sso-demo$cdauthing-sso-demo$npminstall-ghttp-server$http-server中访问后浏览器http://localhost:8080。{%hintstyle="warning"%}如果本地8080端口已经被占用,应用可能会运行在后续的8081、8082等端口上。{%endhint%}运行效果一开始我们没有登录,所以点击trackSession按钮得到的登录状态为空。现在我们点击登录按钮,会跳转到OIDC应用的用户认证页面,输入用户名和密码登录。浏览器被重定向到我们之前设置的回调链接,code参数为记录以供以后交换用户信息。点击trackSession按钮获取用户登录状态,包括用户ID、应用ID、应用类型。点击注销按钮,输出单点注销成功。这时候我们再次点击trackSession按钮,可以看到登录状态为空,说明用户已经退出单点。获取用户信息使用OIDC流程中返回的code换取access_token向以下地址发送POST请求:POSThttps://OIDC_APP_DOMAIN.authing.cn/oauth/oidc/tokenbody参数名称含义client_idOIDC应用app_idredirect_uriOIDC回调配置在控制台中url,scope中的值之一,需要请求的权限。如果需要获取邮箱和手机号,需要有手机邮箱。如果需要refresh_token,需要包含offline_access。参考scope表response_typeOIDC模式,可以是code,id_token,id_tokentoken,codeid_token,codetoken,codeid_tokentoken参考OIDC规范提示可以是none,login,consent或者select_account,指定AP与End-User,如果需要refresh_token,必须同意参考OIDC规范state一个随机字符串,用于防止CSRF攻击,ifresponse中的state值和发送请求之前设置的state值不同,说明受到攻击nonce一个随机字符串,用于防范Replay攻击返回示例{"access_token":"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6InIxTGtiQm8zOTI1UmIyWkZGckt5VTNNVmV4OVQyODE3S3gwdmJpNmlfS2MifQ.eyJqdGkiOiJ4R01uczd5cmNFckxiakNRVW9US1MiLCJzdWIiOiI1YzlmNzVjN2NjZjg3YjA1YTkyMWU5YjAiLCJpc3MiOiJodHRwczovL2F1dGhpbmcuY24iLCJpYXQiOjE1NTQ1Mzc4NjksImV4cCI6MTU1NDU0MTQ2OSwic2NvcGUiOiJvcGVuaWQgcHJvZmlsZSBvZmZsaW5lX2FjY2VzcyBwaG9uZSBlbWFpbCIsImF1ZCI6IjVjYTc2NWUzOTMxOTRkNTg5MWRiMTkyNyJ9.wX05OAgYuXeYM7zCxhrkvTO_taqxrCTG_L2ImDmQjMml6E3GXjYA9EFK0NfWquUI2mdSMAqohX-ndffN0fa5cChdcMJEm3XS9tt6-_zzhoOojK-q9MHF7huZg4O1587xhSofxs-KS7BeYxEHKn_10tAkjEIo9QtYUE7zD7JXwGUsvfMMjOqEVW6KuY3ZOmIq_ncKlB4jvbdrduxy1pbky_kvzHWlE9El_N5qveQXyuvNZVMSIEpw8_y5iSxPxKfrVwGY7hBaF40Oph-d2PO7AzKvxEVMamzLvMGBMaRAP_WttBPAUSqTU5uMXwMafryhGdIcQVsDPcGNgMX6E1jzLA","expires_in":3600,"id_token":"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6InIxTGtiQm8zOTI1UmIyWkZGckt5VTNNVmV4OVQyODE3S3gwdmJpNmlfS2MifQ.eyJzdWIiOiI1YzlmNzVjN2NjZjg3YjA1YTkyMWU5YjAiLCJub25jZSI6IjIyMTIxIiwiYXRfaGFzaCI6Ik5kbW9iZVBZOEFFaWQ2T216MzIyOXciLCJzaWQiOiI1ODM2NzllNC1lYWM5LTRjNDEtOGQxMS1jZWFkMmE5OWQzZWIiLCJhdWQiOiI1Y2E3NjVlMzkzMTk0ZDU4OTFkYjE5MjciLCJleHAiOjE1NTQ1NDE0NjksImlhdCI6MTU1NDUzNzg2OSwiaXNzIjoiaHR0cHM6Ly9hdXRoaW5nLmNuIn0.IQi5FRHO756e_eAmdAs3OnFMU7QuP-XtrbwCZC1gJntevYJTltEg1CLkG7eVhdi_g5MJV1c0pNZ_xHmwS0R-E4lAXcc1QveYKptnMroKpBWs5mXwoOiqbrjKEmLMaPgRzCOdLiSdoZuQNw_z-gVhFiMNxI055TyFJdXTNtExt1O3KmwqanPNUi6XyW43bUl29v_kAvKgiOB28f3I0fB4EsiZjxp1uxHQBaDeBMSPaRVWQJcIjAJ9JLgkaDt1j7HZ2a1daWZ4HPzifDuDfi6_Ob1ZL40tWEC7xdxHlCEWJ4pUIsDjvScdQsez9aV_xMwumw3X4tgUIxFOCNVEvr73Fg","refresh_token":"WPsGJbvpBjqXz6IJIr1UHKyrdVF","scope":"openidprofileoffline_accessphoneemail","token_type":"Bearer"}验证access_token和id_token的合法性OIDC默认使用OIDC应用的secret对token进行验证(即创建应用时默认选择HS256算法)如果使用javascript,可以使用jsonwebtoken进行验证:constjwt=require('jsonwebtoken');letdecoded=jwt.verify(token,);如果是其他语言,需要在服务端使用app_secret作为HS256签名参数,计算签名并与JWT中的签名进行比较,伪代码如下:HMACSHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload),"1133fd20c14e4cc29b6ecb71fb8eb952"//app_secret)如果是RS256等非对称加密算法,需要使用公钥验证签名。Authing将使用私钥进行签名,请使用Authing的公钥来验证签名:-----BEGINPUBLICKEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxRijj2seoesv5K0Z+ymRK7DSDPxdsM2sGQD2ZVhLjLsxZWJtXUXh7ERdUU6OT3BqYZZf7CLIhN6yyNtTOgfgpLG9HVJd7ZSKzuy2dS7mo8jD8YRtptAJmNFqw6z8tQp5MNG1ZHqp9isKqJmx/CFYkRdXBmjjj8PMVSP757pkC3jCq7fsi0drSSg4lIxrSsGzL0++Ra9Du71Qe/ODQKU0brxaI1OKILtfcVPTHTaheV+0dw4eYkSDtyaLBG3jqsQbdncNg8PCEWchNzdO6aajUq4wbOzy/Ctp399mz0SGKfuC5S8gqAFABFT3DH3UD21ZztQZwFEV2AlvF+bcGEstcwIDAQAB-----ENDPUBLICKEY-----使用access_token交换用户信息开发者可以在自己的服务中使用access_token交换用户信息。根据范围的不同,这里返回的信息也会有所不同。这些字段符合OIDC规范。字段解释请参考用户信息字段含义。请求链接:GEThttps://users.authing.cn/oauth/oidc/user/userinfo?access_token=返回示例:{"sub":"<用户在Authing中的唯一标识>","nickname":"Authing","name":"ZhangSan","locale":"en-US"}更多字段解释请参考用户信息字段含义。接下来,您可能还需要了解OIDC协议:了解OIDC流程控制台是您管理所有Authing资源的地方,了解Authing控制台的模块包含哪些内容以及您可以在控制台中做什么:控制台概述了解什么是Authing提供各种部署模型来帮助您选择如何部署Authing:DeploymentModelWhatisAuthing?Authing提供专业的身份认证和授权服务。我们为开发人员和企业提供他们需要的身份验证模块来保护他们的应用程序,而无需开发人员成为安全专家。您可以将任意平台应用接入Authing(无论是新开发的应用还是老应用),还可以自定义应用的登录方式(如:邮箱/密码、短信/验证码、扫码登录、ETC。)。您可以根据您使用的技术选择我们的SDK或调用相关的API来访问您的应用程序。当用户发起授权请求时,Authing将帮助您验证他们的身份,并将必要的用户信息返回给您的应用程序。Authing在应用交互中的位置

官网:http://authing.cn小登录:https://wxapp.authing.cn/#/仓库:欢迎star,欢迎prhttps://gitee.com/Authi_nghttps://github.com/authingDemo:https://sample.authing.cnhttps://github.com/Authing/qr...文档:https://docs.authing.cn/授权/