OAuth2 服务器授权

· 组件

自 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 令牌。