Autorização OAuth2 no servidor

· Componentes

A partir do sgcWebSockets 4.4.5, o protocolo OAuth2 é suportado nos componentes de servidor.

O OAuth2 permite que aplicações de terceiros recebam acesso limitado a um serviço HTTP, seja em nome de um proprietário de recurso ou permitindo que uma aplicação de terceiros obtenha acesso por conta própria. Graças ao OAuth2, provedores de serviço e aplicações consumidoras podem interagir de forma segura.

TsgcHTTP_OAuth2_Server

Este componente fornece a implementação do protocolo OAuth2 nos componentes de lado servidor.

Os componentes de servidor têm uma propriedade chamada Authorization.OAuth.OAuth2 onde você pode atribuir uma instância de TsgcHTTP_OAuth2_Server. Se a autenticação estiver habilitada e a propriedade OAuth2 estiver vinculada ao componente OAuth2 Server, as requisições WebSocket e HTTP exigirão um Bearer Token para serem processadas; caso contrário, a conexão será encerrada automaticamente.

Exemplo simples

Vamos criar um exemplo simples de servidor OAuth2 usando um TsgcWebSocketHTTPServer.

Primeiro, crie um novo TsgcWebSocketHTTPServer escutando na porta 443 e usando um certificado autoassinado no arquivo 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; 

Em seguida, crie uma nova instância de TsgcHTTP_OAuth2_Server e atribua ao servidor criado anteriormente.

Registre uma nova aplicação com os seguintes valores:

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; 

Em seguida, trate o evento OnOAuth2Authentication do componente OAuth2 Server e implemente seu próprio método para autenticar usuários. Usaremos o par "user/secret" para aceitar um login.

procedure OnAuth2Authentication(Connection: TsgcWSConnection; OAuth2: TsgcHTTPOAuth2Request; aUser, aPassword: string; var Authenticated: Boolean);
begin
  if ((aUser = 'user') and (aPassword = 'secret')) then
    Authenticated := True;
end; 

Por fim, inicie o servidor e use um cliente OAuth2 para fazer login. Por exemplo, você pode usar o TsgcHTTP_OAuth2_Client incluído na biblioteca sgcWebSockets.

Solicite um novo token de acesso: uma nova sessão do navegador será exibida e o usuário deverá permitir a conexão e fazer login.


Se o login for bem-sucedido, um novo token será retornado ao cliente. Todas as requisições subsequentes devem incluir esse bearer token nos cabeçalhos HTTP.