2013-02-14 21 views
8

Tôi đang tạo ứng dụng di động nền tảng chéo (sử dụng công cụ Xamarian, MonoTouch/MonoDroid). Tôi đang cố gắng để làm việc thông qua các quy trình xác thực và đang chạy vào một trở ngại. Tôi đã tìm kiếm tất cả hơn cho một câu trả lời rõ ràng và vẫn chưa tìm thấy nó.Cách "đúng" để thực hiện oAuth từ ứng dụng khách di động

Dưới đây là tổng quan về thiết lập hiện tại của tôi.

Tôi có một trang web được xây dựng trong các nút. Tôi sử dụng passport.js để đăng nhập oAuth trên trang web. Điều này làm việc tuyệt vời, người dùng có thể đăng nhập vào trang web của tôi bằng cách sử dụng Twitter hoặc Facebook.

Bây giờ, tôi muốn mở rộng chức năng đăng nhập tương tự này cho các khách hàng di động của mình.

tôi thấy 2 lựa chọn

  1. Nhúng id ứng dụng và ứng dụng bí mật trong các khách hàng điện thoại di động và làm trực tiếp OAuth cuộc gọi đến FB hoặc Twitter từ ứng dụng di động

  2. Proxy OAuth cuộc gọi thông qua của tôi máy chủ web nodejs hiện tại (giữ các khóa bí mật trên máy chủ)

Tùy chọn 2 dường như là cách ưa thích (vì nó tránh phải "gửi" số an toàn t trong các ứng dụng dành cho thiết bị di động).

Tôi có phương pháp proxy chủ yếu là làm việc.

  1. tôi mở một WebView trong ứng dụng di động của tôi và trỏ nó tại http://mysever/auth/twitter
  2. này chạy qua mã passport.js hiện tại của tôi và chuyển hướng WebView di động trên trang đăng nhập Twitter.
  3. Người dùng sau đó nhập số tín dụng của họ trên trang web twitter trên thiết bị.
  4. Twitter sau đó gọi URL gọi lại oAuth của tôi (đó là máy chủ web nodejs của tôi).
  5. Máy chủ và Twitter của tôi xử lý lại lần thứ tư để lấy thông tin hồ sơ người dùng (Như tôi đã hiểu, đây là chìa khóa để tiếp cận này, máy chủ và twitter của tôi xử lý cái bắt tay, ứng dụng di động không phải làm bất cứ điều gì hoặc vượt qua bất kỳ thẻ trong quá trình này)

đây là vấn đề của tôi:

  1. đây là bước cuối cùng này rằng gốc cây tôi. Khi bắt tay hoàn thành trên máy chủ của tôi, tôi có thông tin người dùng tôi cần trên máy chủ và cần gửi lại cho ứng dụng khách di động

    Tôi không thể tìm ra bất kỳ cách nào trong điều khiển WebView để lấy đối tượng phản hồi và lấy cookie hoặc giá trị tiêu đề (ví dụ) (điều này có vẻ đúng đối với Android và iOS). Tôi không nghĩ đó là nền tảng cụ thể. Tôi nghĩ rằng tôi đang cố gắng làm một cái gì đó mà một widget WebView trong nền tảng di động chỉ không hỗ trợ. Nó làm cho tôi nghĩ rằng tôi đang thiếu một cái gì đó hiển nhiên.

Điều duy nhất tôi đã tìm ra là để máy chủ web "chuyển hướng" trình duyệt của khách hàng di động đến URL giả có thông tin người dùng trong chuỗi truy vấn. Một cái gì đó như myapp: // info? Userid = 1234

Sau đó, trong ứng dụng dành cho thiết bị di động, tôi có thể chiếm đoạt URL tải và lấy url này và nhận dữ liệu tôi cần. Sau đó tôi có thể đánh cắp userinfo này, đóng điều khiển WebView và chuyển sang màn hình gốc trong ứng dụng di động của tôi và người dùng userinfo trong bất kỳ lệnh REST tiếp theo nào đến máy chủ nodejs của tôi như một phương tiện nhận diện người dùng.

Đây là kludgy ồ ạt vì nhiều lý do. Lớn nhất trong số đó là url được gửi qua dây không được mã hóa và có tất cả dữ liệu ở dạng văn bản thuần túy.

Có cách nào tốt hơn để lấy dữ liệu từ máy chủ web quay lại ứng dụng khách di động?

Hoặc tôi có làm sai không?

+0

những cách tiếp cận đã cuối cùng bạn giải quyết trên? Tôi bị mắc kẹt trong cùng một tình huống khó xử với Phương án 2 của bạn là cách tiếp cận lý tưởng. –

+0

Thành thật mà nói, tôi không bao giờ tìm thấy một giải pháp hoạt động tốt. Điều được chấp nhận chung dường như là gửi bí mật trong ứng dụng dành cho thiết bị di động. Mọi người dường như nướng nó vào ứng dụng và không quan tâm nhiều hơn thế. –

+0

Bất cứ ai khác chỉ cảm thấy như OAuth là một mớ hỗn độn đầy đủ của giải thích và triển khai một nửa arsed? – Jammer

Trả lời

3

Cách đơn giản nhất để triển khai oauth cho Xamarin, cả cho iOS và Android, đang sử dụng Xamarin.Auth. Tài liệu khởi động cho khách hàng là here. Tôi nghĩ rằng nó nên duy trì tất cả mọi thứ một cách an toàn và bạn sẽ không phải lo lắng về việc phải sử dụng máy chủ nút của bạn như một proxy.

Bạn sẽ cần phải cung cấp ID ứng dụng của mình như một phần của các cuộc gọi, nhưng tôi không có quá nhiều hoặc bất kỳ vấn đề bảo mật nào cần phải lo lắng.

Tôi biết điều này sẽ chống lại những gì bạn đã triển khai, nhưng có thể điều này có thể giúp đơn giản hóa mọi thứ một chút.

+0

Thú vị, tôi chưa thấy thư viện này. Cảm ơn các liên kết. Có vẻ như điều này về cơ bản là điều tương tự mà RestSharp cung cấp (đó là tùy chọn của tôi một cách hiệu quả 1). Đối với oAuth1 (Twitter) Tôi nghĩ điều này có nghĩa là tôi sẽ phải nhúng bí mật ứng dụng của mình vào gói triển khai thiết bị di động phải không? –

+1

Ah, yep, RestSharp có cùng chức năng OAuth. Đối với OAuth1, không có nhiều tùy chọn tuyệt vời. Hoặc là nhúng hoặc đi tìm proxy, giống như những gì bạn đã bắt đầu. Nếu bạn nhúng, bạn có thể làm xáo trộn các phím hoặc cố gắng lưu trữ chúng ở một vị trí an toàn, nhưng không có gì đảm bảo rằng chúng sẽ không bị đánh cắp. Tôi nghĩ rằng bài đăng này là một tổng quan khá tốt về chủ đề này: http://stackoverflow.com/questions/1934187/oauth-secrets-in-mobile-apps. –

+0

Vâng, tôi đã đọc chủ đề đó. Nhưng có thực sự không phải là một giải pháp được cung cấp. Ngoại trừ việc nói rằng oAuth không phải là giải pháp phù hợp cho các ứng dụng của khách hàng. Tôi đang suy nghĩ nhiều hơn và nhiều hơn nữa mà chỉ punting trên oAuth là một giải pháp tốt hơn cho các ứng dụng di động –

0

Đây là tình huống khó xử tương tự mà tôi đã xử lý. Đây là cách tôi hiện đang đối phó với nó. Trong ứng dụng của tôi, khách hàng có thể đến trực tiếp hoặc thông qua một dịch vụ khác như facebook, đó là dịch vụ chính của tôi và do đó tôi đã tập trung vào.

Facebook có thể chuyển hướng qua POST (ứng dụng dành cho bàn) hoặc GET (thiết bị di động).

Tôi kiểm tra yêu cầu ban đầu để xem liệu có số nhận dạng dịch vụ hay không - đây là ví dụ về facebook GET.

app.get('/', function(req, res) { 
var paraUrl = URL.parse(req.url,true).query; 
//The fb_source is shown - 
//i need to go striaght to the facebook authorization since 
//its coming from 
//from a mobile device. 
if (paraUrl.fb_source){ 
res.redirect('/auth/facebook'); //this is the passport part 
return; 
} 
res.sendfile('index.html'); 
} 

Bài đăng trên facebook hơi khác khi bạn nhận được mã thông báo truy cập mã hóa trong base64url. GET cung cấp cho bạn mã mà bạn có thể trao đổi mã thông báo truy cập nhưng tôi gặp sự cố với mã và chỉ chọn tham gia vào hệ thống hộ chiếu.

Nếu khách hàng đến trực tiếp, tôi kiểm tra phiên hoặc cookie được mã hóa có liên quan đến chiến lược địa phương. Điều này sau đó kiểm tra db cho một mã thông báo truy cập có thể được sử dụng để truy cập vào api facebook ví dụ.

Nếu một khách hàng là không được công nhận họ đang cung cấp tùy chọn để xác thực thông qua facebook, google, vv

Điều quan trọng là chỉ có 2 mẩu thông tin được lưu trữ với khách hàng, các phiên id hộ chiếu và sử dụng ứng dụng của tôi id

kết nối.sid - encypted Cookie

userId - encypted Cookie

tôi sẽ được quan tâm để tìm hiểu làm thế nào người khác đang đối phó với vấn đề

+0

Làm thế nào để bạn nhận được connect.sid và userid quay trở lại ứng dụng di động? Bạn có thể lấy đối tượng phản hồi từ trình duyệt di động bằng cách nào đó không? –

+0

Chúng được đặt bằng cookie được mã hóa để chúng được trả về cho mọi yêu cầu. Connect.sid chỉ tốt cho độ dài của ứng dụng nhưng tôi đặt id người dùng của mình sẽ còn hoạt động trong hai tuần –

+0

Vì vậy, bạn có thể truy cập đối tượng jar Cookie và kéo cookie được mã hóa từ tiện ích trình duyệt (WebView) hoặc bạn có đang ở trong ngữ cảnh trình duyệt trong suốt thời gian của ứng dụng di động không? –

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