2015-01-14 12 views
5

Tôi có giao diện người dùng được phát triển trong AngularJS với ui-router. Để tiêu thụ API REST từ chương trình phụ trợ, tôi cần nhận mã thông báo truy cập OAuth2 (trợ cấp ngầm định).AngularJS ui-router xung đột với OAuth2 access_token

Vấn đề của tôi nằm ở bước cuối cùng của vũ OAuth, khi tôi nhận được access token trở lại từ máy chủ xác thực trong url

mydomain.com/home/#access_token=hdzjkdnba89fenbjkéz38U0D903ç&... 

mydomain.com/home là chuyển hướng URI, rõ ràng.

Chỉ cần một phần nhỏ của giây sau khi chuyển hướng, AngularJS thay đổi URL trong một cái gì đó giống như

mydomain.com/#/my-default-view 

và hậu quả là các thẻ truy cập sẽ bị xóa khỏi URL.

Một số điều cần bây giờ là:

  • tôi không được phép để xác định một URI chuyển hướng chứa một hash ('#') cho khách hàng OAuth2 tôi. Do đó, chẳng hạn như mydomain.com/#/auth-complete/ sẽ không phải là OK.
  • Tôi sử dụng $routeProvider.otherwise('/').
  • Tôi đã cố gắng đặt $locationProvider.html5Mode(true); để xóa '#' ở giữa nhưng vấn đề là như nhau (URL và mã thông báo truy cập bị xóa ngay lập tức sau khi chuyển hướng).
  • Khi mã thông báo truy cập vẫn có thể truy cập trong phản hồi HTTP ngay cả sau khi URL được sửa đổi bởi Angular, tôi có thể sử dụng máy đánh chặn $http nhưng âm thanh hơi quá nhiều cho công việc chung này phải không?

Bạn có lời khuyên nào không?

+0

Có thể bạn có thể không có trạng thái phù hợp cho URL xác thực. Vì bạn có $ routeProvider.otherwise ('/'), các mẫu url chưa được so khớp sẽ được chuyển tiếp đến thư mục gốc của trang web. – erandac

+0

Nhưng làm cách nào để khớp với một url chứa mã thông báo tùy ý? Có thể sử dụng một cái gì đó như regex để nói "nếu url chứa 'access_token', chỉ cần không làm bất cứ điều gì"? – Buddyshot

+0

Có bạn có thể có kết hợp regex. Kiểm tra tài liệu ở đây https://github.com/angular-ui/ui-router/wiki/URL-Routing – erandac

Trả lời

0

tôi không sử dụng ui-router nữa nhưng đối với những người vẫn cần phải khắc phục, bạn chỉ cần phải nắm bắt những dấu hiệu trong một regex. Từ the documentation, bạn có thể làm điều gì đó như

.state('oauth.token', { 
     url: "/o/#{authToken:[0-9a-zA-Z]+}", 
     ... 
}) 

và nhận mã thông báo truy cập của bạn trong authToken.

+1

bạn có thể xây dựng trên câu trả lời của mình không? – JCC

+0

Bạn có nghĩa là Mã thông báo truy cập? đúng? – Satyadev

5

một này làm việc cho tôi với Google là nhà cung cấp OAuth2 cho các ứng dụng Client-side:

$urlRouterProvider.otherwise('/'); 

$stateProvider.state('access_token', { 
    url: '/access_token={accessToken}&token_type={tokenType}&expires_in={expiresIn}', 
    template: '', 
    controller: function($stateParams) { 
     var token = $stateParams.accessToken; 
     // do something usefull with token 
    } 
})