从 sgcWebSockets 2022.3.0 起,您可以使用外部 OAuth2 提供商对服务器接收的请求进行身份验证。
OAuth2 服务器提供商组件允许将外部 OAuth2 提供商(如 Azure AD、Google、Facebook 等)集成到您的服务器组件(如 HTTP 服务器)中,用户可使用 Azure AD 凭据登录,若身份验证成功,HTTP 服务器即可授予其对受保护资源的访问权限。
OAuth2 服务器提供商流程
OAuth2 提供商服务器组件允许通过外部 OAuth2 提供商(如 Azure AD、Google 等)进行身份验证,以访问服务器的受保护资源。示例:您可以配置 HTTP 服务器并允许用户使用 Azure 凭据登录,若登录成功,则允许这些用户访问服务器的受保护资源。
身份验证过程在服务器端完成,OAuth2 token 不会与客户端共享。这意味着当用户使用 Azure 登录时,若身份验证成功,Azure 将返回一个 Access Token,该 token 可用于向 Azure 服务器发送请求以获取用户资料、邮件等信息(取决于授权范围)。此 Access Token 不会与客户端(如网页浏览器)共享;服务器将创建一个随机 ID 并在内部与 Access Token 关联,每次客户端(网页浏览器)需要调用 OAuth2 服务器时,使用此公开 ID,服务器再用该 ID 获取 OAuth2 Access Token 来代理 HTTP 请求。
以下是 OAuth2 身份验证工作方式的示例。该示例将使用以下链接中描述的 Azure AD 配置:OAuth2 Provider Azure AD。
启动服务器
服务器在 localhost 的 443 端口开始监听。sgcWebSockets HTTP 服务器与 OAuth2 服务器提供商组件关联,并启用了 Authentication 属性。
服务器启动前,使用以下方法调用注册 Azure OAuth2 提供商。
RegisterProvider(
'azure',
'90945b8d-f6b7-4b97-b2bd-21c3c90b5f3x',
'PN67Q~5m06c-~X_GMyMf9zMntmm5l2dt~3jVq',
'https://login.microsoftonline.com/a0ca2055-5dd1-467f-bf13-291f6fd715c6/oauth2/v2.0/authorize',
'https://login.microsoftonline.com/a0ca2055-5dd1-467f-bf13-291f6fd715c6/oauth2/v2.0/token',
'user.read',
'/login',
'https://localhost/callback'
);
用户登录
用户打开新的网页浏览器并访问 '/login' 端点。
服务器检测到 '/login' 端点用于通过 Azure 提供商登录,因此重定向至
https://login.microsoftonline.com/a0ca2055-5dd1-467f-bf13-291f6fd715c6/oauth2/v2.0/authorize
OAuth2 身份验证流程随即开始。
OAuth2 身份验证
用户被重定向到 OAuth2 服务器身份验证端点,现在必须使用凭据登录并接受 OAuth2 应用程序的条款。
若授权成功,Azure AD 将向以下 URL 发送一个 Code:
https://localhost/callback
验证 OAuth2 Code
现在,服务器已从 Azure 收到 code,将进行服务器到服务器的内部连接以验证该 token 是否正确(防止有人尝试攻击服务器)。
服务器连接至
https://login.microsoftonline.com/a0ca2055-5dd1-467f-bf13-291f6fd715c6/oauth2/v2.0/token
传递接收到的 code 和 clientsecret 等参数,若验证成功,Azure 将返回可用于访问 Azure 受保护资源(如读取资料、邮件等)的 Access Token。
成功获取 Access Token
当服务器成功接收到 AccessToken 时,将触发 OnOAuth2ProviderTokenValid 事件,您可以在此处通过访问参数类 TsgcHTTPOAuth2ProviderToken 配置 AccessToken 的存储方式。
AccesToken:Azure 返回的 OAuth2 Token。
ID:以 cookie 形式存储的公开标识符。
在此事件中,您可以配置身份验证成功后的操作,例如:若要将用户重定向至私有 URL,请使用以下代码:
Response.Redirect.URL := 'https://localhost/private';
向 Azure 发送请求
现在,您可以使用存储为 cookie 的公开 ID 向 Azure 服务器发送请求。
示例:若要读取资料数据,请使用以下方法。
Get('ID', 'https://graph.microsoft.com/v1.0/me');
其中 ID 是公开 ID 标识符。
