2016-04-17 31 views
15

Tôi đã nhận thành công mã thông báo đăng nhập google từ ứng dụng Android trên máy chủ web của tôi được viết bằng Go đang chạy trên GAE. Tôi không muốn sử dụngPakage để xác minh mã thông báo đăng nhập Google trong Go đang chạy trên GAE

https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=XYZ123 

vì vấn đề này có vấn đề về độ trễ và lỗi mạng tiềm ẩn được cảnh báo trên trang hướng dẫn tích hợp đăng nhập google. Vì vậy, tôi đang tìm cách để sử dụng Thư viện Ứng dụng Google API cho Go và tôi thấy điều này

https://github.com/google/google-api-go-client/blob/master/GettingStarted.md 

tôi thấy rằng nó là phức tạp hơn Thư viện ứng dụng khách API Java và Python Google mà tôi sẽ cần phải chỉ cần gọi GoogleIdTokenVerifier phương thức hoặc hàm verify_id_token để lấy thông tin của người dùng google đã đăng nhập trên ứng dụng Android. Tôi không chắc tôi sẽ đi đúng hướng. Vui lòng hướng dẫn tôi cách xác minh mã thông báo đăng nhập google nhận được từ ứng dụng Android.

+0

Google API nào bạn muốn sử dụng? –

+0

Tôi muốn sử dụng api đăng nhập của Google. Tôi chỉ muốn xác minh mã thông báo được gửi từ ứng dụng Android. Người dùng đăng nhập từ ứng dụng và ứng dụng gửi mã thông báo đến máy chủ phụ trợ của tôi. – Ook

+0

Bạn đã viết: "Tôi chỉ muốn xác minh mã thông báo được gửi từ ứng dụng Android". Câu đó không có ý nghĩa quá nhiều. Bạn muốn làm auth ở phía máy chủ đi hay bạn muốn làm điều đó trên Android? Vui lòng làm rõ. – Laurent

Trả lời

9

Tôi gần đây đã gặp sự cố này và tìm thấy hai giải pháp.

Nhưng trước đó bạn cần phải hiểu thư viện python (hoặc thư viện khách hàng được đề xuất khác) làm gì.

  1. Nó nhấn https://www.googleapis.com/oauth2/v2/certs để nhận mảng các khóa công khai rsa.
  2. Mã thông báo giải mã.
  3. Sử dụng trường "kid" (khóa id) từ mã thông báo được giải mã để tạo khóa pem cho khóa công khai RSA khớp.
  4. Xác minh chữ ký của mã thông báo (sau dấu chấm thứ 2 trong mã thông báo jwt) bằng cách sử dụng khóa pem.

Bây giờ hai giải pháp:

  1. Sử dụng thư viện oauth chính thức "google.golang.org/api/oauth2/v2"

    func getTokenInfo(idToken string) (*oauth2.Tokeninfo, error) { 
    oauth2Service, err := oauth2.New(&http.Client{}) 
    if err != nil { 
        return nil, err 
    } 
    tokenInfoCall := oauth2Service.Tokeninfo() 
    tokenInfoCall.IdToken(idToken) 
    return tokenInfoCall.Do() 
    } 
    

    Từ Tokeninfo bạn có thể xác minh rằng khán giả (tokenInfo .Audience) và cấp cho (tokenInfo.IssuedTo) hợp lệ. Và các thông số khác mà bạn muốn kiểm tra. Nhưng thư viện chính thức của golang không tuân theo quy trình mà tôi đã đề cập trước đó. Nó truy cập www.googleapis.com/oauth2/v2/tokeninfo để tạo tokeninfo (không phải www.googleapis.com/oauth2/v3/tokeninfo. V2 không cung cấp một số trường như "tên" nhưng mọi trường bao gồm email mà bạn cần xác minh mã thông báo.).

  2. Sử dụng thư viện GoogleIdTokenVerifier là cổng thư viện của python.

Bạn có thể làm gì để cải thiện hiệu quả của quy trình là lưu vào bộ nhớ cache và pem. Trừ khi một mã thông báo với "đứa trẻ" mới xuất hiện, đừng nhấn url.

Làm điểm chuẩn và kiểm tra xem cách tiếp cận nào nhanh hơn. Điều đó về độ trễ có thể sai khi bạn đang sử dụng mạng để lấy chứng chỉ.

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