2013-02-18 45 views
12

Tôi đang viết một ứng dụng bằng Symfony2 sẽ giao tiếp với Wordnik REST API.Xác thực Symfony2 qua API REST bên thứ 3

Hiện tại, API Wordnik không cung cấp khả năng OAuth, vì vậy tôi phải chấp nhận tên người dùng và mật khẩu mà sau đó tôi sẽ chuyển sang giao diện API một cách minh bạch.

Tôi muốn tích hợp xác thực API này vào hệ thống bảo mật của Symfony2, nhưng cho đến nay tôi chưa thể xác định được tuyến đường triển khai tốt nhất là gì.

Tôi không nghĩ rằng custom user provider là chính xác, vì mật khẩu không được lưu trữ trong hệ thống của tôi. Tất cả các ví dụ về custom authentication providers dường như liên quan đến việc bảo đảm một phần của ứng dụng một API, thay vì đối với API REST.

Tôi không rõ ràng mức độ nào mà FOSUserBundle cũng giúp giải quyết vấn đề này.

Dòng chảy lý tưởng:

  • dùng cung cấp thông tin.
  • Credentials được truyền cho REST API bên thứ 3
  • Nếu thông tin là chính xác:
    • Một "người sử dụng bên thứ ba" tương ứng Entity được tạo ra bởi ứng dụng của tôi, nếu nó không tồn tại.
    • Người dùng được xác thực bằng cách sử dụng thực thể "người dùng bên thứ ba" này.

cách tốt nhất để thực hiện điều này trong một bối cảnh an ninh Symfony2 là gì?

Cảm ơn!

câu hỏi liên quan:

+0

Tôi đang gặp khó khăn với cùng một vấn đề. Bạn có thể vui lòng chia sẻ mã của bạn về cách bạn triển khai điều này không? – Steffan

+0

@Steffan - Nó diễn ra sau 2 năm kể từ khi mã này được viết, nhưng bạn có thể thấy nhà cung cấp/mã thông báo mà chúng tôi đã viết ở đây: https://github.com/freen/wordrot/tree/584a7b361ba21eb1cf5303949cb6b3d30eecf687/src/WordRot/PlayBundle/ Bảo mật/xác thực .... trên các cam kết tiếp theo, tôi đã loại bỏ phần phụ trợ của PHP để thay thế cho một nút phụ Node thay thế, do đó cam kết là trạng thái cuối cùng của PHP. –

+0

Thx rất nhiều, nhưng tôi tìm thấy một cách dễ dàng hơn để làm điều đó với [hệ thống bảo vệ] (https://knpuniversity.com/screencast/guard/login-form) thx để @DevDonkey từ [this] (http: // stackoverflow .com/questions/34376315/symfony2-xác thực-là-không-thực thi? noredirect = 1 # comment56501487_34376315) post. – Steffan

Trả lời

4

bạn phải thực hiện một nhà cung cấp chứng thực tùy chỉnh như mô tả trong: http://symfony.com/doc/current/cookbook/security/custom_authentication_provider.html

Tôi không thể cho bạn biết cách tốt nhất nhưng chỉ để giúp bạn bắt đầu: Bạn tạo một người nghe, một mã thông báo, một nhà cung cấp và một nhà máy.

Phương thức xác thực của trình lắng nghe nhận thông tin xác thực do người dùng cung cấp và tạo Mã thông báo mới với đầu vào đó. Ở cuối phương thức, bạn sẽ thêm: trả về $ this-> authenticationManager-> authenticate ($ token);

Nhà cung cấp của bạn sẽ sử dụng mã thông báo này trong phương thức xác thực để gửi yêu cầu API.

Đối với người dùng không có sẵn, bạn có hai tùy chọn: - tạo người dùng theo phương thức xác thực sau cuộc gọi API và sau khi bạn kiểm tra xem liệu nó có tồn tại mà tôi tin KHÔNG phải là cách để đi - tạo xác thực của riêng bạn xử lý thất bại mà là giống như https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Security/Http/Authentication/DefaultAuthenticationFailureHandler.php nhưng ở phía trên cùng của phương pháp onAuthenticationFailure bạn thêm if ($ ngoại lệ instanceof UsernameNotFoundException & & (null! == $ Token = $ exception-> getToken()) & & $ Token instanceof YourWordnikToken) { // tạo người dùng đó tại đây }

Đó chỉ là ý tưởng cơ bản về cách thức hoạt động ... Tôi đang ở trên IRC với biệt hiệu hacfi - cho tôi biết nếu bạn cần hướng dẫn thêm

+0

hey hacfi, tôi không nhìn thấy bạn trong kênh tại thời điểm này :) bạn có thể tìm thấy mã của ứng dụng của tôi ở đây: https://github.com/freen/wordrot ... Tôi hiện đang gặp phải lỗi này: 'Lỗi nghiêm trọng: Không thể truy cập cha mẹ :: khi phạm vi lớp hiện tại không có phụ huynh trong /[...]/vendor/symfony/symfony/src/Symfony/Component/Security/Core/Authentication/Provider/UserAuthenticationProvider.php trên dòng 43 ' ... Có vẻ như cấu hình hơi tắt, nếu nó vẫn đang cố gắng sử dụng UserAuthenticationProvider (nên sử dụng WordnikProvider) - Bạn có thấy bất kỳ vấn đề nào với việc triển khai của tôi không? –

+0

Tôi sẽ sao chép bản repo vào tối nay và cố sửa nó! – hacfi

+0

Hey Hacfi, cảm ơn sự giúp đỡ của bạn! Tôi đã hợp nhất trong yêu cầu kéo của bạn, [đã giải quyết lỗi đối số hàm tạo trên nhà cung cấp xác thực] (https://github.com/freen/wordrot/commit/0ec3ae9f33bc66fbcdcad668b47de0ee2120d9fe), nhưng tôi vẫn nhận được lỗi chính xác giống như trước đây. –

Các vấn đề liên quan