我想在我的 Django 项目中启用基本访问身份验证,如下所示:
我通过 Google 找到了这篇文章,并根据第一个答案更改了我的 settings.py:
MIDDLEWARE_CLASSES = (
...
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.RemoteUserMiddleware',
...
)
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.RemoteUserBackend',
)
Run Code Online (Sandbox Code Playgroud)
但身份验证窗口没有出现。该项目仍处于调试模式,我通过python ./manage.py runserver.
使用基本身份验证时,对以下长度是否有任何限制:
常用的客户端或客户端框架是否有任何实际限制?
我有一个在 mono/.NET 上跨平台运行的自托管 REST 应用程序。一个问题是 HttpListener 管理并阻止 WWW-Authenticate 标头的手动设置。如果您将自己限制为内置的 Basic、NTLM 等身份验证,或者不需要身份验证,那么这很好,但如果您想接受任何其他类型的令牌,则这是一个问题。
我使用带有 REST 风格界面的 JWT 令牌,并使用 Basic[1] auth 进行初始身份验证。在应用程序的另一部分,我正在做类似的事情,但使用自定义令牌和/或基本身份验证作为 API 另一部分的后备。
问题:
如何让 HttpListener 发送“WWW-Authenticate: Basic”质询标头,同时允许非基本授权令牌通过?
我尝试在监听器中设置基本和匿名:
_listener.AuthenticationSchemes =
AuthenticationSchemes.Basic | AuthenticationSchemes.Anonymous;
Run Code Online (Sandbox Code Playgroud)
这会导致在任何情况下都不会返回 WWW-Authenticate 标头。我相信这应该允许基本或未经身份验证的连接,并且当我将状态代码设置为 401 (HttpStatusCode.Unauthorized) 时,还应该设置 WWW-Authenticate 质询。但事实并非如此(无论是在 mono 还是 .NET 上)。
如果我只设置 AuthenticationSchemes.Basic,HttpListener 会拒绝所有没有 Basic 样式令牌的连接,这没有任何用处。
明显但蹩脚的解决方法:
目前,我只是违反了 HTTP 规范并在没有 WWW-Authenticate 标头的情况下返回 401。这可行,但会降低与第三方工具的兼容性。
我考虑过使用完全不同的 HttpListener 实现,尽管大多数似乎要么处于原型阶段,要么是它们自己的大型库的一部分。我曾考虑过编写自己的 HttpListener,但此时将整个应用程序移植到 Java 开始显得很有吸引力。我希望找到比完整平台移植或编写自己的库更少工作的建议。
有想法吗?
[1] - 这里需要基本身份验证,以便向后兼容低级脚本和一些其他系统。请假设我了解安全隐患并且正在使用 SSL 等。
在 Python 脚本中,我使用带有 HTTP 基本身份验证和自定义 CA 证书的“请求”库来信任,如下所示:
import requests
response = requests.get(base_url, auth=(username, password), verify=ssl_ca_file)
Run Code Online (Sandbox Code Playgroud)
我需要提出的所有请求都必须使用这些参数。是否有一种“Python”方法可以将这些设置为所有请求的默认值?
我在 Centos 7 上运行 Apache 2.4。现在我需要mod_auth_form模块,因为找不到指令AuthFormLogoutLocation 。现在它既没有安装,也无法在yum search mod_auth列表中找到它:
$ locate modules/mod_auth
/usr/lib64/httpd/modules/mod_auth_basic.so
/usr/lib64/httpd/modules/mod_auth_digest.so
/usr/lib64/httpd/modules/mod_authn_anon.so
/usr/lib64/httpd/modules/mod_authn_core.so
/usr/lib64/httpd/modules/mod_authn_dbd.so
/usr/lib64/httpd/modules/mod_authn_dbm.so
/usr/lib64/httpd/modules/mod_authn_file.so
/usr/lib64/httpd/modules/mod_authn_socache.so
/usr/lib64/httpd/modules/mod_authnz_ldap.so
/usr/lib64/httpd/modules/mod_authz_core.so
/usr/lib64/httpd/modules/mod_authz_dbd.so
/usr/lib64/httpd/modules/mod_authz_dbm.so
/usr/lib64/httpd/modules/mod_authz_groupfile.so
/usr/lib64/httpd/modules/mod_authz_host.so
/usr/lib64/httpd/modules/mod_authz_owner.so
/usr/lib64/httpd/modules/mod_authz_user.so
$ yum search mod_auth
...
===== N/S matched: mod_auth ======
ipsilon-authgssapi.noarch : mod_auth_gssapi based login plugin
mod_auth_gssapi.x86_64 : A GSSAPI Authentication module for Apache
mod_auth_kerb.x86_64 : Kerberos authentication module for HTTP
mod_auth_mellon.x86_64 : A SAML 2.0 authentication module for the Apache Httpd Server
mod_auth_ntlm_winbind.x86_64 : NTLM …Run Code Online (Sandbox Code Playgroud) 您好,我需要在测试阶段保护我的应用程序。
我读过这篇关于从基本身份验证中排除一个网址的文章
但我想排除 2 个网址:
/API/*
/oauth/v2/令牌
因此,除了这两个公开的 url 之外,整个应用程序都将受到保护。否则我无法访问我的 api 路由。
我现在的 .htaccess 是:
# Protect the app with password
AuthUserFile /home/master/public_html/web/.htpasswd
AuthName "Protected"
AuthType Basic
Require valid-user
Run Code Online (Sandbox Code Playgroud)
所以我猜我应该需要某种排序或正则表达式:
SetEnvIf Request_URI ^/api/ noauth=1
Run Code Online (Sandbox Code Playgroud)
我怎样才能有像 OR 条件?
我部署了一个完整的 API,可以使用 Swagger UI 访问。它使用基于 HTTPS 的基本身份验证,您可以轻松地点击授权按钮并输入凭据,一切都非常好用,试试吧!特征。
但是,我想使用共享的用户名和密码制作 API 的公共沙盒版本,该版本始终经过身份验证;也就是说,任何人都不应该打开授权对话框来输入凭据。
我尝试根据另一个 Stack Overflow 问题的答案输入授权,方法是将以下代码放入scriptHTML 页面的元素中:
window.swaggerUi.load();
swaggerUi.api.clientAuthorizations.add("key",
new SwaggerClient.ApiKeyAuthorization(
"Authorization", "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", "header"));
Run Code Online (Sandbox Code Playgroud)
但是,当我点击Try it out!按钮时,未使用授权。
在所有端点上全局设置 auth 标头的正确方法是什么,这样用户就不必手动输入凭据?
(我知道这可能听起来像一个奇怪的问题,但就像我提到的,它是一个公共用户名/密码。)
我正在尝试访问需要基本身份验证凭据的 Adyen 测试 API。https://docs.adyen.com/developers/ecommerce-integration
但是在尝试使用 XMLHttpRequest POST 请求访问 API 时,我收到了401 Unauthorized响应。
Javascript代码
var url = "https://pal-test.adyen.com/pal/servlet/Payment/v25/authorise";
var username = "ws@Company.CompanyName";
var password = "J}5fJ6+?e6&lh/Zb0>r5y2W5t";
var base64Credentials = btoa(username+":"+password);
var xhttp = new XMLHttpRequest();
xhttp.open("POST", url, true);
xhttp.setRequestHeader("content-type", "application/json");
xhttp.setRequestHeader("Authorization", "Basic " + base64Credentials);
var requestParams = XXXXXXXX;
xhttp.send(requestParams);
Run Code Online (Sandbox Code Playgroud)
结果
我在为我用 Node.js 编写的 AWS lambda 函数设置基本身份验证时遇到问题。
问题:
AWS lambda 函数是附加服务的代理。这个函数只转发整个请求并给用户整个响应。这就是为什么我需要强制使用Authentication标头,我希望有传递凭据的提示窗口:https : //developer.mozilla.org/en-US/docs/Web/HTTP/Authentication
除了我的 lambda 函数的代理部分之外,我还专注于身份验证问题,并编写了以下代码:
export const proxy = async (event) => {
const authorizationHeader = event.headers.Authorization;
if (typeof authorizationHeader === undefined) {
throw new Error("Unauthorized");
}
...
};
Run Code Online (Sandbox Code Playgroud)
service:
name: proxy-auth-test
plugins:
- serverless-webpack
provider:
name: aws
runtime: nodejs8.10
memorySize: 128
timeout: 10
functions:
proxy-async:
handler: handler.proxy
events:
- http:
method: get
path: api/proxy
resources:
Resources:
GatewayResponse:
Type: 'AWS::ApiGateway::GatewayResponse'
Properties:
ResponseParameters:
gatewayresponse.header.WWW-Authenticate: "'Basic'"
ResponseType: UNAUTHORIZED
RestApiId: …Run Code Online (Sandbox Code Playgroud) 我在 Google Apps Script 中创建了函数,当我在 Google Apps Script 中运行它时效果很好。输出数据返回到 Google 表格。
function testFunction11() {
var rng = SpreadsheetApp.getActiveRange();
var encodedAuthInformation = Utilities.base64Encode("username:key");
var headers = {"Authorization" : "Basic " + encodedAuthInformation};
var params = {
'method': 'GET',
'muteHttpExceptions': true,
'headers': headers
};
var res = UrlFetchApp.fetch("https://api.apiservice.com/api/v1/xxx?fields=somefields", params);
Logger.log(res.getContentText());
rng.setValue(res);
}
Run Code Online (Sandbox Code Playgroud)
单元格中的输出:
[
{
"id": xxx,
"createdDate": "2019-02-01T04:54:00Z",
"reference": "XXX"
},
etc
Run Code Online (Sandbox Code Playgroud)
然后我将脚本分配给按钮“testFunction11”。当我点击按钮时,它返回
{
"message": "An error has occurred."
}
Run Code Online (Sandbox Code Playgroud)
它看起来像来自 API 服务器的响应。
我唯一的假设是 google sheet 的按钮添加了一些 headers,User-Agent 或 content-type 来请求,这在 …
get basic-authentication urlfetch google-apps-script x-forwarded-for
apache ×2
python ×2
.htaccess ×1
.htpasswd ×1
adyen ×1
aws-lambda ×1
c# ×1
cors ×1
django ×1
get ×1
http-headers ×1
httplistener ×1
javascript ×1
jwt ×1
node.js ×1
self-hosting ×1
serverless ×1
swagger-2.0 ×1
swagger-ui ×1
urlfetch ×1