节点和角度.我有一个MEAN堆栈身份验证应用程序,我在成功登录时设置JWT令牌,如下所示,并将其存储在控制器的会话中.通过服务拦截器将JWT令牌分配给config.headers:
var token = jwt.sign({id: user._id}, secret.secretToken, { expiresIn: tokenManager.TOKEN_EXPIRATION_SEC });
return res.json({token:token});
Run Code Online (Sandbox Code Playgroud)
authservice.js拦截器(省略requestError,response和responseError):
authServices.factory('TokenInterceptor', ['$q', '$window', '$location','AuthenticationService',function ($q, $window, $location, AuthenticationService) {
return {
request: function (config) {
config.headers = config.headers || {};
if ($window.sessionStorage.token) {
config.headers.Authorization = 'Bearer ' + $window.sessionStorage.token;
}
return config;
}
};
}]);
Run Code Online (Sandbox Code Playgroud)
现在我想从令牌中获取登录的用户详细信息,我该怎么做?我尝试如下,不工作.当我从Users.js文件记录错误时,它说"ReferenceError:headers not defined"
authController.js:
$scope.me = function() {
UserService.me(function(res) {
$scope.myDetails = res;
}, function() {
console.log('Failed to fetch details');
$rootScope.error = 'Failed to fetch details';
})
};
Run Code Online (Sandbox Code Playgroud)
authService.js:
authServices.factory('UserService',['$http', function($http) …
Run Code Online (Sandbox Code Playgroud) 用户可以在他/她点击退出按钮时注销,但如果令牌过期,他/她无法注销,因为在我的应用程序中,令牌在服务器端和前端都使用.当用户单击注销按钮时,如果令牌有效,则清除服务器和浏览器中的令牌.当用户没有注销并且他/她的令牌过期但未在浏览器中清除时,有可能.为了解决这种情况,每次用户访问我的应用程序时如何检查令牌过期,如果令牌过期,请从浏览器中清除令牌?
我尝试在每次用户刷新页面或切换到另一页时在后台观看的saga.我不认为这是一种有效的方式.我认为中间件开始发挥作用.
function* loadInitialActions() {
var dateNow = new Date();
console.log(jwtDecode(token).exp < dateNow.getTime() - jwtDecode(token).iat);
const token =
JSON.parse(localStorage.getItem("user")) &&
JSON.parse(localStorage.getItem("user"))["token"];
if (
token &&
jwtDecode(token).exp < dateNow.getTime() - jwtDecode(token).iat
) {
yield put(LOGOUT_SUCCESS);
}
}
function* initialize() {
const watcher = yield fork(loadInitialActions);
yield take([INITIALIZE_ERROR, INITIALIZE_SUCCESS]);
yield cancel(watcher);
}
function* rootSaga() {
console.log("rootSaga");
yield takeLatest(INITIALIZE, initialize);
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是如果令牌从中间件到期,我如何使用令牌过期逻辑和注销用户?
我有一个与 .Net Core 2.2 API 后端接口的 Angular 7 应用程序。这是与 Azure Active Directory 的接口。
在 Angular 7 方面,它正在使用 AAD 正确进行身份验证,并且我在jwt.io上得到了一个有效的 JWT 验证。
在 .Net Core API 方面,我创建了一个简单的测试 API [Authorize]
。
当我从 Angular 调用此方法时,在添加不记名令牌后,我得到(如 Chrome 调试工具、网络选项卡、“标题”中所示):
WWW-Authenticate: Bearer error="invalid_token", error_description="未找到签名密钥"
使用HTTP/1.1 401 Unauthorized。
简单的测试 API 是:
[Route("Secure")]
[Authorize]
public IActionResult Secure() => Ok("Secure works");
Run Code Online (Sandbox Code Playgroud)
Angular 调用代码也很简单:
let params : any = {
responseType: 'text',
headers: new HttpHeaders({
"Authorization": "Bearer " + token,
"Content-Type": "application/json"
})
}
this.http
.get("https://localhost:5001/api/azureauth/secure", …
Run Code Online (Sandbox Code Playgroud) NextAuth.js 的文档说我可以通过输入以下命令生成下一次身份验证的秘密:
openssl 兰德-base64 32
这是文档: https: //next-auth.js.org/configuration/options#nextauth_secret
但是,当我在 VS code 中的终端中输入命令时,出现此错误。
我正在尝试在 Windows 上运行此命令。
我创建了一个应用程序,它只使用服务器在正确的登录凭据上发送的JWT,并授权/api
我的后端Express.js服务器上的任何路由.
另一方面,AngularJS使用此令牌,将其存储在会话存储中,并且每次使用auth拦截器将令牌发送回服务器.
我最近才明白这种做法有多危险.
在这种情况下,我理解来回传递令牌的方法.但是,如果您希望将JWT存储在客户端Javascript无法读取的安全的,仅HTTP的cookie中,那么有人会非常善意地解释发生的方法吗?
例如:凭证成功
我试图在这里获得一个关于它是如何工作的心智模型.如果我的理解是正确的,那么这样做就不再需要auth拦截器,因为在正确的凭证登录时,服务器将在cookie内完成所有的令牌传输.
我正在使用Vue.js和vue-router开发SPA,现在我正在使用JWT处理授权/身份验证.我对后端(API端点)进行了整理,以便它响应登录时发出令牌,并在后续请求中检查必需的头.我现在想要实现客户端(Vue.js)方面.
据我了解,从根本上说,我需要做的是要求对除"/"和"/ login"之外的所有路由进行身份验证.如果存在身份验证,则我在Authorization标头中提交令牌(在成功登录后存储在localStorage中).如果无法在服务器上成功验证,则由于错误响应,用户将被重定向到"/ login".
所以,我有几个问题需要做些什么来实现这个:
除了登录端点之外,我如何最好地为每个请求提交标头?我知道JQuery,我用于AJAX,我可以配置一个全局'ajaxSetup',它将导致每个请求都提交头,但我如何指定异常?单独将标头添加到每个API端点请求是很麻烦的.
同样,如何设置一个身份验证预检查,适用于除上述2('/'和'/ login')之外的所有路由?
鉴于我正在使用显然有效的身份验证(显然是因为它仍然必须在API端点上进行验证)以确定是否显示某些菜单项等,是否可以使其更加精细化并根据令牌有效负载中的"范围"字段确定不同权限级别的不同内容?显然,处理JWT令牌的最简单方法纯粹是确定它是否存在,因此在客户端不需要解析内容.但鉴于JWT确实允许有意义的内容,尝试在客户端和服务器上使用该含义是一个坏主意吗?显然,如果令牌本身是加密的,那么这变得不太实用,所以我的想法是使用未加密的令牌(并确保在有效载荷中没有任何后果暴露).
我正在编写一个Flutter/Dart应用程序,并从一个具有我需要使用的声明的auth服务器返回JWT.我看过各种(4至今)飞镖JWT库 - 但都太旧,并不再与飞镖2等工作,或者他们需要的秘密智威汤逊这是没有意义的,是不正确(解码或者可能,因为我没有访问权限).
那么 - 如何在"现代"的Dart/Flutter应用程序中获得JWT并从中获取声明?
我正在使用Identity Server 3对我的角客户端进行身份验证并生成访问/刷新令牌.
我目前正在为我的Angular客户端设置刷新令牌在48小时后到期.
使用我的Angular应用程序的一些用户需要连续100天签名,而不必重新输入他们的凭据,是否可以仅为特定用户而不是整个客户端设置刷新令牌的到期时间?
我的数据库中有100个用户,我只希望一个特定用户在100天内不需要重新进行身份验证,而其他用户应该每48小时进行一次身份验证.
有点像:
if (user == "Super Man") {
AbsoluteRefreshTokenLifetime = TimeSpan.FromDays(100.0).Seconds,
}
Run Code Online (Sandbox Code Playgroud)
这有可能实现吗?或者我是否仅限于为整个客户端设置刷新令牌过期?
谢谢
我正在设置 Django 以发送 JWT 响应而不是视图。我尝试使用 django-rest-framework-simplejwt。
在这个框架中提供了一个TokenObtainPairView.as_view()
返回一对jwt的函数。我需要使用另一个 Json 响应返回访问令牌,而不是提供的两个令牌。
理想情况下,我想要一个包含与此相同的访问令牌的 JsonResponse:TokenObtainPairView.as_view()
.
我尝试创建自己的视图,如下所示。
更新:在 Settings.py 中提供
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(days=1),
'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
'ROTATE_REFRESH_TOKENS': False,
'BLACKLIST_AFTER_ROTATION': True,
'ALGORITHM': 'HS256',
'SIGNING_KEY': SECRET_KEY,
'VERIFYING_KEY': None,
'AUTH_HEADER_TYPES': ('Bearer',),
'USER_ID_FIELD': 'id',
'USER_ID_CLAIM': 'user_id',
'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),
'TOKEN_TYPE_CLAIM': 'token_type',
'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp',
'SLIDING_TOKEN_LIFETIME': timedelta(days=1),
'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=1),
}
Run Code Online (Sandbox Code Playgroud)
登录网址路径
urlpatterns = [
path('auth/', views.LoginView.as_view()),
]
Run Code Online (Sandbox Code Playgroud)
我创建的登录视图
class LoginView(APIView):
permission_classes = (AllowAny,)
def post(self, request, *args, **kwargs):
username = request.data['username']
password = request.data['password']
user = …
Run Code Online (Sandbox Code Playgroud)