使用带有用户名和密码的swagger-codegen基本身份验证

时间:2017-02-08 17:18:35

标签: django swagger swagger-codegen

我有一个django rest_framework API,Swagger和一个Swagger UI。 当我没有登录时,我可以看到一个非常有限的视图" login"和" docs"。 当我登录时,我可以看到很多东西。

我正在尝试使用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

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

如何让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

3 个答案:

答案 0 :(得分:12)

由于您使用的是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"

QWxhZGRpbjpPcGVuU2VzYW1l是您在base64中编码的username:password

Here您可以查看将解析此选项的代码。

答案 1 :(得分: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();

答案 2 :(得分: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 有一个 known issue,它不会向第二个请求(重定向后)提供基本身份验证详细信息。使用上面的身份验证器可以解决这个问题。