我按照这篇文章here 中很好解释的内容开发了一个与您的条件相同的完整安全层。
顺便说一句,令牌将在 20 分钟后自动过期,因为当您创建它时,您将立即设置它的过期日期;每次您要发出请求时,系统都会检查令牌到期日期和当前日期,如果时间过去则拒绝您的令牌。例如,这是一个带有令牌和刷新令牌设置的典型 oauth 服务器配置:
internal static OAuthAuthorizationServerOptions GetAuthorizationServerOptions(IComponentContext scope)
{
OAuthAuthorizationServerOptions oAuthServerOptions = new OAuthAuthorizationServerOptions
{
AllowInsecureHttp = true,
ApplicationCanDisplayErrors = true,
TokenEndpointPath = new PathString(Constants.PublicAuth.OAUTH_TOKEN_PATH),
AuthorizeEndpointPath = new PathString(Constants.ExternalAuth.AUTH_ENDPOINT),
AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(Constants.PublicAuth.TOKEN_EXPIRATION_IN_MINUTES),
Provider = scope.Resolve<AuthorizationServerProvider>(),
AccessTokenFormat = new CustomJwtFormat(),
RefreshTokenProvider = scope.Resolve<SimpleRefreshTokenProvider>()
};
return oAuthServerOptions;
}
刷新令牌也很有用,但您必须自己管理令牌替换;例如,在我们的应用程序中,我们通过单个服务传递每个 API 调用,如果服务器响应 401 (unauthorized),它将尝试使用刷新令牌请求新令牌,然后再次尝试相同的调用。只有在第二次失败后,您才会被重定向到登录页面。
例如:
function executeCallWithAuth(method, url, payload, params) {
var defer = $q.defer();
debug.logf('{0}: {1}', method.toUpperCase(), url);
$http({ method: method, url: url, data: payload, headers: createHeaders(), params: params }).then(
function(results) { defer.resolve(results); },
function(error) {
if (error.status !== 401) defer.reject(error);
else {
debug.warn(`Call to: ${method}:${url} result in 401, try token refresh...`);
auth.refreshToken().then(
function() {
debug.warn('Token refresh succesfully, retry api call...');
$http({ method: method, url: url, data: payload, headers: createHeaders() }).then(
function(results) { defer.resolve(results); },
function(errors) { defer.reject(errors); });
},
function(tokenError) {
debug.warn('Token refresh rejected, redirect to login.');
$state.go('login');
defer.reject(tokenError);
});
}
});
return defer.promise;
}
和
function createHeaders() {
var headers = {
};
var authData = storage.get('authorizationData');
if (authData) {
headers.Authorization = 'Bearer ' + authData.token;
}
return headers;
}
使用Angular 保护路由的最佳方式是“不创建路由”。基本上,您需要加载用户配置文件,然后才能创建仅到他可以导航到的页面的路由。如果您不为页面创建路由,则不需要保护该页面:Angular 会自动将用户发送到 404。