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 标识符。