2013-05-16 15 views
7

mục tiêu của tôi là xây dựng kết thúc động cơ ứng dụng đơn giản cho ứng dụng Android của tôi. Mục đích của phần cuối này chỉ là để xác minh các cuộc gọi của khách hàng Android và cung cấp mật khẩu sẽ được sử dụng để tiếp tục https comunication với các máy chủ của tôi. Vì vậy, tôi đã bắt đầu ccording bài viết này http://android-developers.blogspot.in/2013/01/verifying-back-end-calls-from-android.html. phía khách hàng trông giống như:Cách xác minh mã thông báo id Android trên phần phụ trợ của App Engine

GoogleAuthUtil.getToken(MainActivityy.this, "[email protected]", "audience:server:client_id:my_Client_ID_for_web_applications.apps.googleusercontent.com"); 

phương pháp này trả về thẻ mà trông như thế này:

eyJhbGciOiJSUzI1NiIsImtpZCI6ImFiMWIyZTllNGU2NGE0MmIzM2U3YjMxMDQwNzUyMzIxYmVlMmJkYmEifQ.eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwiZW1haWwiOiJtYXRvLnBldHJ1bGFrQGdtYWlsLmNvbSIsInZlcmlmaWVkX2VtYWlsIjoidHJ1ZSIsImVtYWlsX3ZlcmlmaWVkIjoidHJ1ZSIsImNpZCI6IjU0ODk4MTY3NzkzMC0xcGxxamF2OWloOGU4MGJ0ZWdpYzg0YmcycjlxN2MwMi5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsImF6cCI6IjU0ODk4MTY3NzkzMC0xcGxxamF2OWloOGU4MGJ0ZWdpYzg0YmcycjlxN2MwMi5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsImF1ZCI6IjU0ODk4MTY3NzkzMC5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsImlkIjoiMTE4MTQ0NjEyNDkzMTM1NzYxOTUwIiwic3ViIjoiMTE4MTQ0NjEyNDkzMTM1NzYxOTUwIiwiaWF0IjoxMzY4NzExODk0LCJleHAiOjEzNjg3MTU3OTR9.oN5ncz6MEAZBW8NXDhc4O-Y82C2mma675lbw9ZZA-1bs8zM9FKQG1K97PfNfxJFImiPMY8UYIjhqDIkHpErjaV0KDJpLv8NkmsdADOFjt5eQkFGWf92fufL7QEIkWqLL1fKxG7f8-OR59O5AOAVchdgtqDt4DhEH7oHfAZqf3wU 

và bây giờ tôi muốn authentificate thẻ này trên backend. Vì vậy, tôi đã tạo một Dự án ứng dụng web mới bằng cách sử dụng plugin Google cho eclpise. Nó tạo ra một số dự án mẫu. Để dự án này tôi thêm lớp Checker từ bài viết mà tôi đã đề cập ở trên. trông như thế này:

import java.io.IOException; 
import java.security.GeneralSecurityException; 
import java.util.Arrays; 
import java.util.List; 
import java.util.logging.Logger; 

import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken; 
import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier; 
import com.google.api.client.http.javanet.NetHttpTransport; 
import com.google.api.client.json.JsonFactory; 
import com.google.api.client.json.gson.GsonFactory; 

public class Checker { 

private final List mClientIDs; 
private final String mAudience; 
private final GoogleIdTokenVerifier mVerifier; 
private final JsonFactory mJFactory; 
private String mProblem = "Verification failed. (Time-out?)"; 

private Logger log ; 

public Checker(String[] clientIDs, String audience) { 
    mClientIDs = Arrays.asList(clientIDs); 
    mAudience = audience; 
    NetHttpTransport transport = new NetHttpTransport(); 
    mJFactory = new GsonFactory(); 
    mVerifier = new GoogleIdTokenVerifier(transport, mJFactory); 
    log = Logger.getLogger(Checker.class.getName()); 
    log.severe("CHECKER CRETAED"); 
} 

public GoogleIdToken.Payload check(String tokenString) { 
    GoogleIdToken.Payload payload = null; 
    log.severe("CHECK START"); 
    try { 
     log.severe("CHECK 1"); 
     GoogleIdToken token = GoogleIdToken.parse(mJFactory, tokenString); 
     log.severe("CHECK 2"); 
     if (mVerifier.verify(token)) { 
      log.severe("CHECK 3"); 
      GoogleIdToken.Payload tempPayload = token.getPayload(); 
      log.severe("CHECK4"); 
      if (!tempPayload.getAudience().equals(mAudience)){ 
       mProblem = "Audience mismatch"; 
       log.severe("Audience mismatch"); 
      } 
      else if (!mClientIDs.contains(tempPayload.getIssuee())){ 
       mProblem = "Client ID mismatch"; 
       log.severe("Client ID mismatch"); 
      } 
      else{ 
       payload = tempPayload; 
       log.severe(payload.getEmail().toString()); 
       log.severe("CHECK 5"); 
      } 
     } 
    } catch (GeneralSecurityException e) { 
     log.severe("Security issue: " + e.getLocalizedMessage()); 
     mProblem = "Security issue: " + e.getLocalizedMessage(); 
    } catch (IOException e) { 
     log.severe("Network problem: " + e.getLocalizedMessage()); 
     mProblem = "Network problem: " + e.getLocalizedMessage(); 
    } 
    log.severe("CHECK END"); 
    return payload; 
} 

public String problem() { 
    return mProblem; 
} 

}

và bây giờ tôi làm điều gì đó như thế này để authentify thẻ được cung cấp bởi khách hàng Android.

String [] clinetidS = new String [] {"xxxxxxxxxxxxx-plqjav9ih8e80btegic84bg2r9q7c02.apps.googleusercontent.com"}; //Client ID for installed applications 
Checker checker = new Checker(clinetidS, "my_project_at_appspot.appspot.com"); 
    checker.check("eyJhbGciOiJSUzI1NiIsImtpZCI6ImFiMWIyZTllNGU2NGE0MmIzM2U3YjMxMDQwNzUyMzIxYmVlMmJkYmEifQ.eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwiZW1haWwiOiJtYXRvLnBldHJ1bGFrQGdtYWlsLmNvbSIsInZlcmlmaWVkX2VtYWlsIjoidHJ1ZSIsImVtYWlsX3ZlcmlmaWVkIjoidHJ1ZSIsImNpZCI6IjU0ODk4MTY3NzkzMC0xcGxxamF2OWloOGU4MGJ0ZWdpYzg0YmcycjlxN2MwMi5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsImF6cCI6IjU0ODk4MTY3NzkzMC0xcGxxamF2OWloOGU4MGJ0ZWdpYzg0YmcycjlxN2MwMi5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsImF1ZCI6IjU0ODk4MTY3NzkzMC5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsImlkIjoiMTE4MTQ0NjEyNDkzMTM1NzYxOTUwIiwic3ViIjoiMTE4MTQ0NjEyNDkzMTM1NzYxOTUwIiwiaWF0IjoxMzY4NzExODk0LCJleHAiOjEzNjg3MTU3OTR9.oN5ncz6MEAZBW8NXDhc4O-Y82C2mma675lbw9ZZA-1bs8zM9FKQG1K97PfNfxJFImiPMY8UYIjhqDIkHpErjaV0KDJpLv8NkmsdADOFjt5eQkFGWf92fufL7QEIkWqLL1fKxG7f8-OR59O5AOAVchdgtqDt4DhEH7oHfAZqf3wU"); 

và bây giờ vấn đề là Checker lớp không bao giờ vượt qua kiểm tra này:

if (mVerifier.verify(token)) 

là có một số cách làm thế nào để kiểm tra thẻ android trực tuyến ?? bất kỳ ý tưởng ?? hoặc nơi có thể là vấn đề ??

Trả lời

7

Bạn luôn có thể kiểm tra các dấu hiệu tương tác bằng cách sử dụng curl nhìn vào

curl https://www.googleapis.com/oauth2/v1/tokeninfo?id_token=<your-id-token-here>

ngoại trừ/vấn đề từ mVerifier.verify là gì?

+0

cảm ơn, khi tôi kiểm tra mã thông báo của mình không hợp lệ, do đó sự cố xảy ra trên trang web của khách hàng. do một số công việc với không gian làm việc, tôi đã ký ứng dụng của mình bằng cách nhấn phím tắt và đó là vấn đề. khi tôi đã ký nó với phím tắt thực sự tất cả mọi thứ làm việc tốt. –

+0

@MatkoVonJazvecPetrulak, tôi cũng nhận ngoại lệ GeneralSecurityException trên phương thức tokenVerifier.verify (token). là cùng một vấn đề của debug keystore? –

+1

@ Bipin Vayalu yes đó là vấn đề với debug keystore ... dù sao cũng không cố gắng đăng nhập địa chỉ email trên appengine backend của bạn ..tôi đã làm điều đó để thử nghiệm, quên để loại bỏ rằng từ mã của tôi và sau vài tháng google bị chặn tài khoản nhà phát triển của tôi (khoảng 200 000 tải) ...... Thats "google-phong cách" công lý –

3

Đó là câu hỏi cũ hơn và tôi đoán bạn đã tìm thấy câu trả lời. Nhưng chỉ trong trường hợp: Nhấp vào đây link và cuộn xuống. Về cơ bản nó sẽ cho bạn biết để tải về và bao gồm this library và viết đoạn mã này:

import java.io.IOException; 
import java.security.GeneralSecurityException; 
import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken; 
import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier; 
import com.google.api.client.http.javanet.NetHttpTransport; 
import com.google.api.client.json.JsonFactory; 
import com.google.api.client.json.gson.GsonFactory; 

public class Checker { 

private final List mClientIDs; 
private final String mAudience; 
private final GoogleIdTokenVerifier mVerifier; 
private final JsonFactory mJFactory; 
private String mProblem = "Verification failed. (Time-out?)"; 

public Checker(String[] clientIDs, String audience) { 
    mClientIDs = Arrays.asList(clientIDs); 
    mAudience = audience; 
    NetHttpTransport transport = new NetHttpTransport(); 
    mJFactory = new GsonFactory(); 
    mVerifier = new GoogleIdTokenVerifier(transport, mJFactory); 
} 

public GoogleIdToken.Payload check(String tokenString) { 
    GoogleIdToken.Payload payload = null; 
    try { 
     GoogleIdToken token = GoogleIdToken.parse(mJFactory, tokenString); 
     if (mVerifier.verify(token)) { 
      GoogleIdToken.Payload tempPayload = token.getPayload(); 
      if (!tempPayload.getAudience().equals(mAudience)) 
       mProblem = "Audience mismatch"; 
      else if (!mClientIDs.contains(tempPayload.getIssuee())) 
       mProblem = "Client ID mismatch"; 
      else 
       payload = tempPayload; 
     } 
    } catch (GeneralSecurityException e) { 
     mProblem = "Security issue: " + e.getLocalizedMessage(); 
    } catch (IOException e) { 
     mProblem = "Network problem: " + e.getLocalizedMessage(); 
    } 
    return payload; 
} 

public String problem() { 
    return mProblem; 
} 
} 
+0

Tôi không thích kéo vào đó phụ thuộc chỉ dành cho GsonFactory. Bất kỳ cách nào khác? – Patrick

+2

@Patrick Thời gian dài trước đây bạn hỏi, nhưng trong trường hợp bất kỳ ai cũng thắc mắc, nếu bạn đang sử dụng Jackson, (tôi nghĩ nó đi kèm với lib này) bạn có thể sử dụng 'JacksonFactory.getDefaultInstance(); ' –

+0

phụ thuộc là gì lọ req. nó mang lại cho tôi lỗi rằng "Nó được tham chiếu gián tiếp từ các tập tin yêu cầu .class" –

0

của cô là một mảnh hữu ích của mã để kiểm tra xác thực của một mã thông báo từ google. Tôi đang sử dụng Java EE để nó có thể hơi khác nhau nếu bạn đang sử dụng Java bình thường:

public JsonObject authenticateFromToken(String token) { 
     JsonObject jsonst = null; 
     JsonReader p = null; 
     try { 
      p = Json.createReader(new URL("https://www.googleapis.com/oauth2/v1/tokeninfo?access_token="+token).openStream()); 
      jsonst = (JsonObject) p.read(); 
     } catch (FileNotFoundException e2) { 
      e2.printStackTrace(); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return jsonst; 
    } 

Sau khi bạn có JsonObject, bạn có thể nhận được thông tin từ nó như ví dụ:

jsonObject.getString("user_id"); 

hoặc

jsonObject.getString("email"); 

vv ...