7

我有一个 django rest_framework API、Swagger 和一个 Swagger UI。当我没有登录时,我可以看到非常有限的“登录”和“文档”视图。当我登录时,我可以看到很多东西。

我正在尝试使用 swagger-codegen 生成客户端:

java -jar modules/swagger-codegen-cli/target/swagger-codegen-cli.jar \
generate -i http://127.0.0.1:8080/api/docs/ -l python -o myclient

但是,它只生成一个非常有限的客户端,提供“登录”和“文档”功能。

如何让 swagger-codegen 知道如何使用 http 基本身份验证登录,以便生成更完整的客户端?

文档说我应该执行以下操作,但我不知道它期望什么:

    -a <authorization>, --auth <authorization>
        adds authorization headers when fetching the swagger definitions
        remotely. Pass in a URL-encoded string of name:header with a comma
        separating multiple values
4

3 回答 3

16

由于您使用的是 http 基本身份验证,因此命令应该是:

java -jar modules/swagger-codegen-cli/target/swagger-codegen-cli.jar \
generate -i http://127.0.0.1:8080/api/docs/ -l python -o myclient -a "Authorization:Basic QWxhZGRpbjpPcGVuU2VzYW1l"

QWxhZGRpbjpPcGVuU2VzYW1lusername:password的base64编码在哪里。

在这里,您可以查看将解析此选项的代码。

于 2017-02-09T12:55:20.353 回答
0

为所有请求提供凭据:

var creds = new NetworkCredential("username", "password");
var encoded = Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1").GetBytes(creds.UserName + ":" + creds.Password));
            
Configuration.Default.AddDefaultHeader("Authorization", "Basic " + encoded);

//use the API
var searchAPI = new SearchAPI();
var files = searchAPI.GetFiles();

仅向一个 API 调用提供凭据:

var creds = new NetworkCredential("username", "password");
var encoded = Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1").GetBytes(creds.UserName + ":" + creds.Password));

var searchAPI = new SearchAPI();
searchAPI.Configuration.AddDefaultHeader("Authorization", "Basic " + encoded);

//use the API
var files = searchAPI.GetFiles();
于 2021-04-20T10:14:04.630 回答
0

另一种方法是使用自定义身份验证器。

var basicAuthenticator = new BasicAuthenticator(Configuration.Default.ApiClient.RestClient.BaseUrl.ToString(), "username", "password");
Configuration.Default.ApiClient.RestClient.Authenticator = basicAuthenticator;

它使用 BasicAuthenticator 类:

public class BasicAuthenticator : IAuthenticator
{
    private readonly string _baseUrl;
    private readonly string _userName;
    private readonly string _password;
    private readonly CredentialCache _credentialCache;

    public BasicAuthenticator(string baseUrl, string userName, string password)
    {
        _baseUrl = baseUrl;
        _userName = userName;
        _password = password;

        _credentialCache = new CredentialCache
        {
            {new Uri(_baseUrl), "Basic", new NetworkCredential(_userName, _password)}
        };
    }

    public void Authenticate(IRestClient client, IRestRequest request)
    {
        request.Credentials = _credentialCache;

        if (request.Parameters.Any(parameter =>
                        parameter.Name.Equals("Authorization", StringComparison.OrdinalIgnoreCase)))
        {
            return;
        }
        request.AddParameter("Authorization", GetBasicAuthHeaderValue(), ParameterType.HttpHeader);
    }


    private string GetBasicAuthHeaderValue()
    {
        return string.Format("Basic {0}",
                        Convert.ToBase64String(Encoding.ASCII.GetBytes(string.Format("{0}:{1}",
                            _userName, _password))));
    }
}

RestSharp存在一个已知问题,即它不会向第二个请求提供基本身份验证详细信息(在重定向之后)。使用上面的身份验证器可以解决这个问题。

于 2021-04-21T02:12:52.717 回答