OAuth2 提供商 | 身份验证

OAuth2 Provider 服务器组件允许您使用外部 OAuth2 提供商(如 Azure AD 或 Google)进行认证,以访问服务器的受保护资源。示例:您可以配置 HTTP 服务器以允许用户使用 Azure 凭据登录;如果登录成功,这些用户将被允许访问服务器的受保护资源。

 

认证过程在服务器端完成,OAuth2 令牌不与客户端共享,这意味着当用户使用 Azure 等方式登录时,如果认证成功,Azure 会返回一个访问令牌,允许您向 Azure 服务器发送请求以获取用户配置文件、邮件等信息(取决于范围)。此访问令牌不会与客户端(例如 Web 浏览器)共享;服务器不会将访问令牌返回给客户端,而是创建一个随机 ID,该 ID 在内部与访问令牌关联,因此每当客户端(Web 浏览器)想要调用 OAuth2 服务器时,使用此公开 ID,服务器则使用该 ID 获取 OAuth2 访问令牌来代理 HTTP 请求。

 

以下是 OAuth2 身份验证工作原理的示例。该示例将使用以下链接中描述的 Azure AD 配置:OAuth2 提供商 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'
);

 

 

用户登录

 

用户打开新的 Web 浏览器并访问 '/login' 端点。

服务器检测到使用 '/login' 端点通过 Azure 提供商登录,因此将重定向到

 

https://login.microsoftonline.com/a0ca2055-5dd1-467f-bf13-291f6fd715c6/oauth2/v2.0/authorize

 

OAuth2 身份验证流程开始。

 

OAuth2 身份验证

 

用户被重定向至 OAuth2 服务器身份验证端点,此时必须使用凭证登录并接受 OAuth2 应用程序的条款。

 

如果授权成功,Azure AD 将代码发送到 URL

 

https://localhost/callback

 

验证 OAuth2 代码

 

现在,服务器收到了来自 Azure 的代码,它将在内部(从服务器到服务器)连接 Azure 以验证该令牌是否正确(并防止有人尝试入侵服务器)。

 

服务器连接到

 

https://login.microsoftonline.com/a0ca2055-5dd1-467f-bf13-291f6fd715c6/oauth2/v2.0/token

 

传入接收到的 code 和 clientsecret 等参数,验证成功后,Azure 将返回访问令牌,该令牌可用于访问 Azure 受保护资源,例如读取个人资料、电子邮件等。

 

成功的访问令牌

 

当服务器成功收到 AccessToken 时,将调用 OnOAuth2ProviderTokenValid 事件,您可以在此配置 AccessToken 的存储方式(如需存储),通过参数类 TsgcHTTPOAuth2ProviderToken 进行访问。

 

AccesToken:Azure 返回的 OAuth2 令牌

ID: 作为 cookie 存储的公共标识符。

 

在此事件中,您可以配置身份验证成功后的操作,例如:如果您想将用户重定向到私有 URL,请使用以下方式。

 

Response.Redirect.URL := 'https://localhost/private';

 

向 Azure 发送请求

 

现在,您可以使用存储为 Cookie 的公共 ID 向 Azure 服务器发送请求。

示例:若要读取配置文件数据,请使用以下方法。

 

Get('ID', 'https://graph.microsoft.com/v1.0/me');

 

其中 ID 是公共 ID 标识符。