自 sgcWebSockets 4.4.5 起,服务器组件支持 OAuth2 协议。
OAuth2 允许第三方应用代表资源所有者,或以自身名义获得对 HTTP 服务的有限访问权限。借助 OAuth2,服务提供商和消费者应用可以安全地相互交互。
TsgcHTTP_OAuth2_Server
该组件在服务器端组件中提供 OAuth2 协议实现。
服务器组件有一个名为 Authorization.OAuth.OAuth2 的属性,可以将 TsgcHTTP_OAuth2_Server 实例分配给它。启用 Authentication 并将 OAuth2 属性关联到 OAuth2 服务器组件后,所有 WebSocket 和 HTTP 请求都需要携带 Bearer 令牌,否则连接将被自动关闭。
示例
下面通过一个简单的 OAuth2 服务器示例来说明,使用 TsgcWebSocketHTTPServer。
首先,创建一个新的 TsgcWebSocketHTTPServer,监听 443 端口,并使用 sgc.pem 文件中的自签名证书。
oServer := TsgcWebSocketHTTPServer.Create(nil); oServer.Port := 80; oServer.SSLOptions.Port := 443; oServer.SSLOptions.CertFile := 'sgc.pem'; oServer.SSLOptions.KeyFile := 'sgc.pem'; oServer.SSLOptions.RootCertFile := 'sgc.pem'; oServer.SSL := True;
然后创建一个新的 TsgcHTTP_OAuth2_Server 实例,并分配给上面创建的服务器。
注册一个新应用,参数如下:
Name: MyApp
RedirectURI: http://127.0.0.1:8080
ClientId: client-id
ClientSecret: client-secret
OAuth2 := TsgcHTTP_OAuth2_Server.Create(nil);
OAuth2.Apps.AddApp('MyApp', 'http://127.0.0.1:8080', 'client-id', 'client-secret');
oServer.Authentication.Enabled := True;
oServer.Authentication.OAuth.OAuth2 := OAuth2;
然后处理 OAuth2 服务器组件的 OnOAuth2Authentication 事件,并实现您自己的用户登录验证逻辑。此处使用 "user/secret" 组合作为有效登录凭证。
procedure OnAuth2Authentication(Connection: TsgcWSConnection; OAuth2: TsgcHTTPOAuth2Request; aUser, aPassword: string; var Authenticated: Boolean);
begin
if ((aUser = 'user') and (aPassword = 'secret')) then
Authenticated := True;
end;
最后启动服务器,并使用 OAuth2 客户端进行登录。例如,您可以使用 sgcWebSockets 库中附带的 TsgcHTTP_OAuth2_Client。

请求新的访问令牌时,将打开一个新的 Web 浏览器会话,用户需要授权连接并登录。

登录成功后,新令牌将返回给客户端。此后所有请求都必须在 HTTP 请求头中携带该 Bearer 令牌。

