Tôi sẽ cố gắng cung cấp phương pháp hoàn chỉnh về cách tôi đã thực hiện ng-token-auth hoạt động với ZF2. Chủ yếu, ng-token-auth hoạt động tốt với mô-đun ruby.Vì vậy, để làm cho nó làm việc với ZF2:
Giải quyết vấn đề CORS với những dòng mã:
//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'];
Giải quyết vấn đề CORS trên ZF2 sử dụng ZFCORS như chỉ trong @josilber và @ sven- lauterbach phản ứng answer
Format gửi bởi ZF2 để làm cho nó làm việc với ng-token-auth sử dụng các dòng mã
$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;
}
};
Có thể đây không phải là cách tốt nhất để chuyển đổi phản ứng trong AngularJS nhưng nó giải quyết vấn đề của định dạng OAuth2 phản ứng mà làm việc với ng-token-auth
Cuối cùng, để gửi yêu cầu đến máy chủ sử dụng auth thẻ và tự động làm mới mã thông báo, cần phải thay đổi một số hành vi của ng-token-auth. Tôi đã sử dụng mô hình trang trí trên AngularJS để giải quyết vấn đề này với các đoạn mã:
Trong app.js
//Change behavior of oauth2 module
$provide.decorator("$auth", function($delegate, ApiAuthService){
return ApiAuthService($delegate);
});
đâu ApiAuthService là một nhà máy được xác định bởi đoạn mã này:
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;
}
};
}
]);
}]);
Cuối cùng cấu hình của tôi về ng-token-auth là:
//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 Tôi hy vọng các bước này sẽ giúp bạn tìm cách giải quyết câu hỏi của mình theo cách tốt hơn so với những gì tôi đã làm.
@JerinKAlexander, bạn có cần tích hợp với trình xác thực của bên thứ ba (Google, FB, v.v ...) không? Bạn có yêu cầu OAuth cụ thể không hoặc bạn có cần một cách để xác thực người dùng không? –
@JerinKAlexander, Bạn có thể sử dụng ng-token-auth để giải quyết đạt được mục tiêu của mình. Sau khi đọc một số mã nguồn của ng-auth-token. Tôi đã làm cho nó hoạt động với sự khải thị. Nếu bạn quan tâm đến mã của tôi, tôi có thể đưa ra một câu trả lời hoàn chỉnh về cách tôi đã nhận ra nó. – hermannovich
bạn chắc chắn nên đăng giải pháp của mình –