2013-05-01 26 views
11

Tôi đang cố gắng để xác thực một ứng dụng di động cho nền tảng Android để tùy chỉnh một Node.js api máy chủ. Tôi muốn sử dụng mã thông báo Google OAuth2 cho việc này thay vì cuộn xác thực của riêng tôi, vì các thiết bị Android được cài đặt Google Play làm cho ứng dụng này khả dụng cho nhà phát triển ứng dụng. Tôi đang sử dụng cuộc gọi GoogleAuthUtil.getToken từ thư viện Google Play Services, tài liệu here. Tôi đang cố gắng làm theo lời khuyên được nêu trong số android developers blogpostCách thích hợp để xác thực mã thông báo OAuth được cấp cho google trong máy chủ node.js là gì?

Phương thức getToken này sẽ trả lại trong trường hợp của tôi là chuỗi dài 857 byte. Nếu tôi cố gắng để vượt qua thẻ này để TokenInfo endpoint của Google, nó sẽ trả về:

{ 'lỗi': 'invalid_token', 'ERROR_DESCRIPTION': 'Giá trị không hợp lệ'}

Tôi đang làm gì sai đây? Trong 'phạm vi' của cuộc gọi getToken, Tôi gửi: audience:server:client_id:**i_put_my_clientid_here**. Tôi có một clientid được tạo cho "ứng dụng đã cài đặt". Sử dụng id ứng dụng khách này, lệnh gọi hàm getToken không hoạt động. Khi tôi tạo ra một id khách hàng cho một "tài khoản dịch vụ", cuộc gọi thành công, nhưng tôi nhận được một thẻ 857 byte mà không thành công khi truyền cho các thiết bị đầu cuối TokenInfo như đã mô tả ở trên.

EDIT: Tôi cũng đã tạo id ứng dụng cho "ứng dụng web", vì có vẻ như đây là id ứng dụng khách thích hợp để sử dụng khi gọi getToken. Nhưng hành vi là như nhau, tôi lấy lại một mã thông báo byte 857 không xác thực khi gọi đến điểm cuối của Google.

Làm thế nào tôi có thể đúng cách nhận mã auth hợp lệ sử dụng dịch vụ Google Play trên Android? Khi tôi có đúng mã thông báo, thư viện node.js thích hợp để xác thực bên máy chủ đó là gì? Tôi có thể sử dụng passport-google-oauth không?

Trả lời

3

Nếu bạn chỉ muốn đọc nội dung của dữ liệu được trả về GoogleAuthUtil.getToken thì quá trình này rất đơn giản. Dữ liệu trả về đơn giản chỉ là một JWT. Vì vậy, tất cả những gì bạn phải làm là tách dữ liệu theo ký tự . và sau đó giải mã base64 (url) mỗi phần.

Sẽ phức tạp hơn một chút nếu bạn muốn xác minh tính xác thực của thư. Chỉ cần sử dụng thư viện mật mã yêu thích của bạn để thực hiện xác minh. Thành phần thứ 3 của JWT là chữ ký của dữ liệu và the Google certs are publicly available; đó là tất cả những gì bạn cần để xác minh tin nhắn.

+0

Tôi đã trích xuất ba phần và cần phải xác minh id_token. SHA256 (tiêu đề + "." + Tải trọng) có bằng chữ ký được giải mã không? Hoặc là chữ ký được giải mã chỉ bằng hash của tải trọng? Là nó bằng hoặc trước khi dữ liệu được mã hóa Base64? Chức năng của tôi cho veryfying các mã thông báo với các chứng chỉ google không hoạt động, vì vậy tôi chỉ tự hỏi. Cảm ơn – kingSlayer

+0

chữ ký dành cho sha256 (header + "." + Payload) – George

1

Tôi không quá quen thuộc với các chi tiết về cách Android hoạt động liên quan đến việc chuyển mã thông báo từ thiết bị đến máy chủ. Tuy nhiên, ấn tượng chung của tôi là bạn không trải qua điệu nhảy OAuth dựa trên web điển hình. Thay vào đó, bạn trực tiếp gọi điểm cuối "thông tin người dùng", sẽ trả về thông tin tương ứng với người dùng chứa mã thông báo hoặc từ chối yêu cầu nếu mã thông báo không hợp lệ. Có một số cuộc thảo luận về câu hỏi có liên quan này:

validating Android's authToken on third party server

Trong thực tế, các dấu hiệu trở thành một bí mật được chia sẻ giữa hai thiết bị và máy chủ của bạn, vì vậy quan trọng của nó để bảo vệ nó.

Có một vài chiến lược cho Facebook và Twitter đã được phát triển để làm những việc tương tự như sử dụng thẻ từ các thiết bị iOS:

https://github.com/drudge/passport-twitter-token
https://github.com/drudge/passport-facebook-token

Bạn có thể mất một số cảm hứng từ họ và tinh chỉnh nó để nói chuyện đến điểm cuối của Google. Hãy cho tôi biết cách này hóa ra. Tôi rất muốn thấy một chiến lược "hộ chiếu-google-token" tương tự, vì vậy nếu bạn triển khai một chiến dịch, hãy cho tôi biết và tôi sẽ liên kết với nó!

+0

tôi ít nhiều cố gắng để làm theo các dòng chảy được nêu ở đây: http://android-developers.blogspot.com/2013/01/verifying-back-end-calls- từ-android.html. Trên thiết bị Android, bạn đã tự xác thực với tài khoản Google. Triển khai Dịch vụ của Google Play sử dụng thực tế này để bỏ qua một số bước công việc khác. Tôi có thể lấy mã thông báo xác thực từ Google và về lý thuyết, Google cho phép tôi xác minh điều này mà không cần cuộc gọi máy chủ. Tuy nhiên, mã thông báo mà tôi nhận được cho đến nay vẫn được coi là không hợp lệ. Nó cũng có vẻ quá dài (857 byte). –

+0

Nếu phản hồi của Google là JWT và các chứng chỉ mà Google sử dụng để cung cấp các tính năng này có sẵn tại https://www.googleapis.com/oauth2/v1/certs, tôi có thể sử dụng https://github.com/xtuple/passport không -oauth2-jwt-bearer để xác thực các mã thông báo này mà không cần gọi google ở ​​phía máy chủ của tôi? –

+0

Tôi tin rằng oauth2-jwt-bearer được sử dụng cho trường hợp bạn đang triển khai máy chủ OAuth 2.0. Tôi sẽ xem xét những điều sau: https://github.com/mozilla/jwcrypto https://github.com/brianloveswords/node-jwa https://github.com/brianloveswords/node-jws –

4

Hm, đây thực sự là một lời nhận xét chứ không phải là một câu trả lời, nhưng tôi không thể đưa dòng mới trong những:

  1. nó phải là web-side Clent ID mà đi ở vị trí put_my_clientid_here
  2. nếu GoogleAuthUtil.getToken() cung cấp cho bạn một chuỗi withou ném một ngoại lệ, nó thực sự phải hợp lệ. Khi bạn nhấn tokeninfo, bạn có sử dụng ... tokeninfo không? Id_token = < 857-byte-value-here>
  3. nếu bạn là người ruby, hãy lấy đá quý google-id-token và xem liệu nó có thể xác thực 857 của bạn không -byte token.
+0

Có! id_token đã hoạt động. Tôi đã sử dụng access_token trước đây. Tôi có thể tìm thấy một số đọc tốt giải thích sự khác biệt ở đâu? Bây giờ tôi chỉ cần tìm cách thích hợp để xác minh chúng trong một máy chủ Node.js, mà không cần gọi đến điểm cuối của google mọi lúc. Sẽ ping Jared nhiều hơn cho điều đó. Cảm ơn! –

+0

Với đá quý google-id-token, có lẽ tham số 'đối tượng' sẽ nhận được id ứng dụng khách trên web. Nhưng những gì đi vào tham số required_client_id? Tôi đã thử với id "ứng dụng đã cài đặt" của mình nhưng không hoạt động - bất kể id ứng dụng khách đã cài đặt không được sử dụng trong thế hệ id_token bằng cách sử dụng getToken. –

2

Đối với một tuần tôi đã được tìm kiếm vào làm thế nào để xác nhận GoogleAuthUtil mã thông báo nhận được trong ứng dụng Client Android tại máy chủ Node.js sử dụng passport.js

Cuối cùng tôi đi qua hộ chiếu-google-dấu hiệu chiến lược hộ chiếu mà hoàn toàn thực hiện bài tập.

https://www.npmjs.com/package/passport-google-token

Chi tiết khác có trong liên kết ở trên.

+0

Trong khi điều này về lý thuyết có thể trả lời câu hỏi, [nó sẽ là thích hợp hơn] (http: //meta.stackoverflow.com/q/8259) để bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. – Yuriy

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