Я попытаюсь дать полный метод, как я сделал ng-token-auth Работа с ZF2. В первую очередь, ng-token-auth отлично работает с модулем ruby.Таким образом, чтобы заставить его работать с ZF2:
Решить проблему CORS с этими строками кода:
//HttpProvider
$httpProvider.defaults.useXDomain = true;
$httpProvider.defaults.headers.common['Access-Control-Request-Method'] = "POST, GET, PUT, DELETE";
$httpProvider.defaults.headers.common['Origin'] = "http://xxxxxxxxxxxxxxx";
$httpProvider.defaults.headers.common['Accept'] = "application/json";
$httpProvider.defaults.headers.common['Content-Type'] = "application/json; text/html";
delete $httpProvider.defaults.headers.common['X-Requested-With'];
решить проблему CORS на ZF2 с использованием ZFCORS как указано в @josilber и @ sven- Lauterbach ответ answer
Формат послан ZF2, чтобы заставить его работать с нг-маркера-AUTH с помощью этих строк кодов
$http.defaults.transformResponse = function(value, headerGetters){
var response_header = headerGetters(),
response_data = JsonHelper.IsJsonString(value) ? JSON.parse(value) : value;
if(response_data){
if(response_data.access_token)
response_header['access_token'] = response_data.access_token;
if(response_data.expires_in){
var now = new Date().getTime();
response_header['expires_in'] = now + (parseInt(response_data.expires_in, 10) * 1000);
}
if(response_data.token_type)
response_header['token_type'] = response_data.token_type;
if(response_data.refresh_token)
response_header['refresh_token'] = response_data.refresh_token;
if(response_data.scope)
response_header['scope'] = response_data.scope;
return response_data;
}
};
Может быть, это не самый лучший способ превратить ответ в AngularJS но решает проблему форматирования ответа OAuth2, который работает с нг-токенов-AUTH
Наконец, чтобы отправить запрос на сервер с помощью токен аутентификации и обновить токен автоматически, необходимо было изменить некоторое поведение ng-token-auth. Я использовал украсит рисунок на AngularJS, чтобы решить эту проблему с этими фрагментами кода:
В app.js
//Change behavior of oauth2 module
$provide.decorator("$auth", function($delegate, ApiAuthService){
return ApiAuthService($delegate);
});
Где ApiAuthService фабрика определяется этим фрагментом кода:
AuthProviderService.factory('ApiAuthService', ['MeService', function(MeService){
return function($delegate){
return {
initialize: function(){ return $delegate.initialize(); },
apiUrl: function(configName){ },
retrieveData: function(key){ return $delegate.retrieveData(key); },
getConfig: function(name){ return $delegate.getConfig(name); },
getExpiry: function(){ return $delegate.getExpiry(); },
setAuthHeaders: function(h){ return $delegate.setAuthHeaders(h); },
/*persistData: function(key, val, configName){ return $delegate.persistData(key, val, configName); },
retrieveData: function(key){ return $delegate.retrieveData(key); },*/
rejectDfd: function(reason){ $delegate.rejectDfd(reason); },
invalidateTokens: function(){ return $delegate.invalidateTokens(); },
submitLogin: function(params, opts){ return $delegate.submitLogin(params, opts); },
validateUser: function(opts){
result = $delegate.validateUser(opts);
return result;
},
deleteData: function(key){
return $delegate.deleteData(key);
}
};
};
}]).config(['$httpProvider', function($httpProvider) {
$httpProvider.interceptors.push([
'$injector', function($injector) {
return {
request: function(req) {
$injector.invoke([
'$http', '$auth', function($http, $auth) {
var key,
_ref,
_results = [];
if (req.url.match($auth.apiUrl())) {
_ref = $auth.retrieveData('auth_headers');
//Inject value into body of request
for (key in _ref) {
//Set Authorization request header.
if(key.match('access_token')){
if(req.headers){
req.headers['Authorization'] = 'Bearer ' + _ref[key];
}else{
req.headers = {'Authorization': 'Bearer ' + _ref[key]};
}
}
if(req.headers[key]){
delete req.headers[key];
}
}
return _results;
}
}
]);
return req;
}
};
}
]);
}]);
Наконец моя конфигурация нг-токенов-AUTH был:
//OAuth2 Module configs
$authProvider.configure([ {
"default": {
apiUrl: API_URL,
tokenValidationPath: '/me',
signOutUrl: '/oauth',
emailRegistrationPath: '/oauth',
accountUpdatePath: '/oauth',
accountDeletePath: '/oauth',
confirmationSuccessUrl: window.location.href,
passwordResetPath: '/oauth',
passwordUpdatePath: '/oauth',
passwordResetSuccessUrl: window.location.href,
emailSignInPath: '/oauth',
forceHardRedirect: true,
storage: 'localStorage',
proxyIf: function() { return false; },
proxyUrl: 'proxy',
authProviderPaths: {
github: '/auth/github',
facebook: '/auth/facebook',
google: '/auth/google'
},
tokenFormat: {
"access_token" : "{{ token }}",
"token_type" : "Bearer",
"refresh_token": "{{ clientId }}",
"expires_in" : "{{ expiry }}",
"scope" : "{{ uid }}"
},
parseExpiry: function(headers) {
var expires_in = parseInt(headers['expires_in'], 10) || null;
return expires_in;
},
handleLoginResponse: function(response) {
//Patch for persistant data as library retreive auth data from header.
return response;
},
handleAccountResponse: function(response) {
return response;
},
handleTokenValidationResponse: function(response) {
return response;
}
}
} ]);
@JerinKAlexander Я надеюсь, что эти шаги помогут вам найти способ решить свой вопрос лучше, чем то, что я сделал.
@JerinKAlexander, вам нужно интегрироваться с сторонними аутентификаторами (Google, FB и т. Д.)? Вам нужен OAuth специально, или вам нужен способ аутентификации пользователей? –
@JerinKAlexander, вы можете использовать ng-token-auth для решения своей цели. После некоторых чтений исходного кода ng-auth-token. У меня есть работа с Apigility. Если вас интересует мой код, я могу дать полный ответ о том, как я это понял. – hermannovich
вы должны обязательно разместить свое решение. –