使用外部 OAuth2 提供商进行授权

· 组件

从 sgcWebSockets 2022.3.0 起,您可以使用外部 OAuth2 提供商对服务器接收的请求进行身份验证。

OAuth2 服务器提供商组件允许将外部 OAuth2 提供商(如 Azure ADGoogleFacebook 等)集成到您的服务器组件(如 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 标识符。

下载 OAuth2 Azure AD Windows 编译演示程序