Как написать Самоанализ сервера с балериной - PullRequest
1 голос
/ 05 апреля 2020

В «Учиться на примере» я могу найти руководство по обеспечению безопасности сервиса с помощью OAuth2 [1]. В этом примере используется отдельный сервер самоанализа, как показано ниже.

oauth2:InboundOAuth2Provider oauth2Provider = new ({
    url: "https://localhost:9095/oauth2/token/introspect"
});

Итак, есть ли какое-либо руководство / статья, которой я могу следовать, чтобы реализовать сервер самоанализа, чтобы я мог написать полный сценарий OAuth2 для защиты своей балерины обслуживание с OAuth2?

[1] https://ballerina.io/v1-2/learn/by-example/secured-service-with-oauth2.html

1 Ответ

2 голосов
/ 05 апреля 2020

Вы можете реализовать свой собственный сервер интроспекции OAuth2 в соответствии с инструкциями, приведенными в RF C https://tools.ietf.org/html/rfc7662.

Черновой вариант реализации можно найти ниже. Вы должны извлечь и проверить полученный токен против выданных сервером токенов доступа.

import ballerina/config;
import ballerina/http;

listener http:Listener oauth2Server = new(9095, {
    secureSocket: {
        keyStore: {
            path: config:getAsString("keystore"),
            password: config:getAsString("keystorePassword")
        }
    }
});

service oauth2 on oauth2Server {

    @http:ResourceConfig {
        methods: ["POST"],
        path: "/token/introspect"
    }
    // This introspect the access token against the access token store, 
    // which holds the issued access tokens.
    resource function introspect(http:Caller caller, http:Request req) {
        http:Response res = new;
        var authorizationHeader = trap req.getHeader("Authorization");
        if (authorizationHeader is string) {
            // Validate the received authorization header and 
            // prepare the introspection response. 
            // (Refer: https://tools.ietf.org/html/rfc7662#section-2.2)
            res = ...;
        } else {
            // Invalid client. 
            // (Refer: https://tools.ietf.org/html/rfc6749#section-5.2)
            res.statusCode = 401;
            res.setPayload("invalid_client");
        }
        checkpanic caller->respond(res);
    }
}
...