我想知道在更改密码/注销时不使用db而使JWT无效的最佳实践.
我有以下想法通过点击用户数据库处理上述2个案例.
1.密码更改,我检查存储在用户db中的密码(散列).
2.注销时,我在用户数据库中保存了最后注销时间,因此通过比较令牌创建时间和注销时间,我可以使这种情况无效.
但是这两种情况是以每次用户点击api时命中用户数据库为代价的.任何最佳实践表示赞赏.
更新: 我不认为我们能够在没有命中数据库的情况下使JWT无效.所以我想出了一个解决方案.我已经发布了我的答案,如果您有任何疑虑,欢迎您.
我们想为我们的websockets使用django-channels,但我们也需要进行身份验证.我们有一个运行django-rest-framework的rest api,我们使用令牌来验证用户,但是django-channels似乎没有内置相同的功能.
我正在制作一个Android应用程序,它应该能够从Web服务(不是GAE的一部分)获取数据.用户可以使用OpenId通过浏览器登录Web服务(仅允许使用Google帐户).
AccountManager可以给我authtoken.我可以将此authtoken与用户的谷歌帐户名(电子邮件)一起保存在我的服务器上,然后使用此帐户名将他的openid登录与应用程序注册相关联.
但这并没有解决任何问题,因为我无法根据用户的OpenID信息验证此令牌......或者我呢?我以为我可以使用用户的authtoken"以某种方式"将他的Android帐户链接到网络帐户.
这看起来越来越像是一种错误的处理方式,但我不想在SharedPreferences中保存用户Google的用户名/密码,并使用这些数据进行登录.
有创意吗?谢谢
刷新令牌的想法是,如果访问令牌被泄露,因为它是短暂的,攻击者有一个有限的窗口滥用它.
我明白了,但是如果攻击者访问刷新令牌,他们将能够获得一个新的身份验证令牌,我错了吗?这似乎只是推迟了长期存在的令牌安全漏洞......
关于这一点,你会在同一个答案中找到:
刷新令牌(如果受到攻击)是无用的,因为除了刷新令牌之外,攻击者还需要客户端ID和机密才能获得访问令牌.
那么使用刷新令牌和简单地辞职之间的区别是什么?如果您不希望用户再次重新输入,那么如何存储客户端ID和密码?
正如@FStephenQ指出的那样,刷新令牌只能使用一次:攻击者将能够获得一个新的身份验证令牌,但只能获得一次,而且只能获得一次.但是,一旦你使用了新的刷新令牌,你如何获得新的刷新令牌呢?如果你使用一个新的,那么攻击者也可以刷新他们的令牌......
实际问题是:如何让我的用户登录?在我使用的应用程序上,一旦我登录,我就不必再次登录了:他们是如何进行的?
我有一个 Web 应用程序,其中 Angular (7) 前端与服务器上的 REST API 通信,并使用 OpenId Connect (OIDC) 进行身份验证。我正在使用向我的 HTTP 请求HttpInterceptor
添加Authorization
标头以向服务器提供身份验证令牌。到现在为止还挺好。
但是,除了传统的 JSON 数据,我的后端还负责即时生成文档。在添加身份验证之前,我可以简单地链接到这些文档,如下所示:
<a href="https://my-server.com/my-api/document?id=3">Download</a>
Run Code Online (Sandbox Code Playgroud)
但是,现在我已经添加了身份验证,这不再有效,因为浏览器在获取文档时没有在请求中包含身份验证令牌 - 所以我401-Unathorized
从服务器得到了响应。
因此,我不能再依赖普通的 HTML 链接——我需要创建自己的 HTTP 请求,并显式添加身份验证令牌。但是,我如何确保用户体验与用户单击链接时的体验相同?理想情况下,我希望使用服务器建议的文件名保存文件,而不是通用文件名。
我正在尝试使用以下代码检索Facebook的AuthToken(由Facebook for Android保存).
AccountManager am = AccountManager.get(this);
Account[] accounts = am.getAccountsByType("com.facebook.auth.login");
if (accounts.length > 0) {
for(int j = 0; j < accounts.length; j++) {
Account account = accounts[j];
if(account.type != null && account.type.equals("com.facebook.auth.login")) {
Log.e(RuntimeVars.MY_NAME, "FACEBOOK-TYPE FOUND");
am.getAuthToken(account, "com.facebook.auth.login", null, ConversationList.this,
new AccountManagerCallback<Bundle>() {
public void run(AccountManagerFuture<Bundle> arg0) {
try {
Bundle b = arg0.getResult();
Log.e(RuntimeVars.MY_NAME, "THIS AUTHTOKEN: " + b.getString(AccountManager.KEY_AUTHTOKEN));
}
catch (Exception e) {
Log.e(RuntimeVars.MY_NAME, "EXCEPTION@AUTHTOKEN");
}
}
}, null);
}
}
}
Run Code Online (Sandbox Code Playgroud)
找到登录凭据并将FACEBOOK-TYPE …
嗨,我正在查看flask-login处理会话登录很好,这项工作很适合模板和视图,我有权访问会话.
不过,我一直试图知道是否有办法将user_token发送给授权的电话.我查看了文件,对此非常模糊.它说我应该
我虽然看到了以下内容(请纠正我,如果我错了)
我正在使用Django Rest Framework为我的应用程序构建API,并希望实现DjangoRestFramework-JWT进行令牌认证.这些步骤看起来很简单,但是当我测试端点时,我得到500错误.终端输出是一大堆html说没有提供csrf_token.代码和错误如下.非常感谢您的帮助.
curl -X POST -d "username=admin&password=123abc" http://127.0.0.1:8000/api/token/auth/
Run Code Online (Sandbox Code Playgroud)
CSRF错误
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="robots" content="NONE,NOARCHIVE">
<title>403 Forbidden</title>
</head>
<body>
<div id="summary">
<h1>Forbidden <span>(403)</span></h1>
<p>CSRF verification failed. Request aborted.</p>
<p>You are seeing this message because this site requires a CSRF cookie when submitting forms. This cookie is required for security reasons, to ensure that your browser is not being hijacked by third parties.</p>
<p>If you have configured your browser to disable cookies, please re-enable …
Run Code Online (Sandbox Code Playgroud) 我有两个使用相同帐户类型的应用.我希望当用户第一次打开第二个应用并且存在一个帐户时,会显示以下页面:
但是当我运行这段代码时没有任何反应:
final AccountManagerFuture<Bundle> future = mAccountManager.getAuthToken(account, authTokenType, null, this, null, null);
new Thread(new Runnable() {
@Override
public void run() {
try {
Bundle bnd = future.getResult();
final String authtoken = bnd.getString(AccountManager.KEY_AUTHTOKEN);
showMessage((authtoken != null) ? "SUCCESS!\ntoken: " + authtoken : "FAIL");
Log.d("udinic", "GetToken Bundle is " + bnd);
} catch (Exception e) {
e.printStackTrace();
showMessage(e.getMessage());
}
}
}).start();
Run Code Online (Sandbox Code Playgroud)
当我从具有验证器的应用程序运行它时,上面的代码正常工作.当我在代码下面运行时,系统会生成一个通知,当我点击它时,会出现上面的图片.
final AccountManagerFuture<Bundle> future = mAccountManager
.getAuthToken(account, authTokenType, null, true,
null, handler);
Run Code Online (Sandbox Code Playgroud)
单击允许按钮可AuthToken
正确返回.但是我希望在通话时看到授权许可页面(上图)getAuthToken
,而不是点击通知.我怎样才能做到这一点?
我正在使用 http-proxy-middleware ( https://github.com/chimurai/http-proxy-middleware#http-proxy-eventsmy-proxy/
) 来实现到另一个 REST API (调用它) 的简单代理 (调用它/rest-api
)这要求用户在 HTTP 标头中传递身份验证令牌auth-token
。POST /rest-api/auth
可以使用正文中的凭据从端点获取令牌。
我希望我的代理接受传入请求并检查是否auth-token
在请求标头中设置,如果没有,则在将请求传递到 之前执行POST /rest-api/auth
检索令牌并在标头中设置。auth-token
rest-api/
在我指定的代理配置中
onProxyReq: function (proxyReq, req, res) {
if (!req.header("auth-token")) {
const authRequest = request({
url: 'rest-api/auth',
method: 'POST',
json: {"username": "user", "password": "pass"}
},
function (error, resp, body) {
proxyReq.setHeader("auth-token", body.token)
}
);
}
}
Run Code Online (Sandbox Code Playgroud)
我可以看到body.token
返回正确的令牌。但是,setHeader
调用失败并显示Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to …
auth-token ×10
android ×3
jwt ×2
node.js ×2
angular ×1
api ×1
django ×1
facebook ×1
flask ×1
flask-login ×1
http-headers ×1
javascript ×1
openid ×1
proxy ×1
python ×1
remember-me ×1
request ×1
security ×1
token ×1
webserver ×1