Tạo mã thông báo php

Nếu bạn sử dụng Đăng nhập bằng Google với một ứng dụng hoặc trang web giao tiếp với máy chủ phụ trợ, bạn có thể cần xác định người dùng hiện đang đăng nhập trên máy chủ. Để làm như vậy một cách an toàn, sau khi người dùng đăng nhập thành công, hãy gửi mã thông báo ID của người dùng đến máy chủ của bạn bằng HTTPS. Sau đó, trên máy chủ, hãy xác minh tính toàn vẹn của mã thông báo ID và sử dụng thông tin người dùng có trong mã thông báo để thiết lập phiên hoặc tạo tài khoản mới

Cảnh báo. Không chấp nhận ID người dùng đơn giản, chẳng hạn như những ID bạn có thể nhận được bằng phương pháp
GoogleSignIn.silentSignIn()
    .addOnCompleteListener(
        this,
        new OnCompleteListener<GoogleSignInAccount>() {
          @Override
          public void onComplete(@NonNull Task<GoogleSignInAccount> task) {
            handleSignInResult(task);
          }
        });
4, trên máy chủ phụ trợ của bạn. Ứng dụng khách đã sửa đổi có thể gửi ID người dùng tùy ý đến máy chủ của bạn để mạo danh người dùng, vì vậy, thay vào đó, bạn phải sử dụng mã thông báo ID có thể xác minh để lấy ID người dùng của người dùng đã đăng nhập ở phía máy chủ một cách an toàn

Gửi mã thông báo ID đến máy chủ của bạn

Đầu tiên, khi người dùng đăng nhập, hãy nhận mã thông báo ID của họ

  1. Khi bạn, gọi phương thức và chuyển nó

    // Request only the user's ID token, which can be used to identify the
    // user securely to your backend. This will contain the user's basic
    // profile (name, profile picture URL, etc) so you should not need to
    // make an additional call to personalize your application.
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(getString(R.string.server_client_id))
            .requestEmail()
            .build();
  2. Khi ứng dụng của bạn bắt đầu, hãy kiểm tra xem người dùng đã đăng nhập vào ứng dụng của bạn bằng Google, trên thiết bị này hay thiết bị khác chưa bằng cách gọi số

    GoogleSignIn.silentSignIn()
        .addOnCompleteListener(
            this,
            new OnCompleteListener<GoogleSignInAccount>() {
              @Override
              public void onComplete(@NonNull Task<GoogleSignInAccount> task) {
                handleSignInResult(task);
              }
            });
    6

    GoogleSignIn.silentSignIn()
        .addOnCompleteListener(
            this,
            new OnCompleteListener<GoogleSignInAccount>() {
              @Override
              public void onComplete(@NonNull Task<GoogleSignInAccount> task) {
                handleSignInResult(task);
              }
            });
  3. Nếu người dùng không thể đăng nhập một cách im lặng, hãy hiển thị trải nghiệm đăng xuất thông thường của bạn, cung cấp cho người dùng tùy chọn đăng nhập. Khi người dùng thực hiện , hãy lấy

    GoogleSignIn.silentSignIn()
        .addOnCompleteListener(
            this,
            new OnCompleteListener<GoogleSignInAccount>() {
              @Override
              public void onComplete(@NonNull Task<GoogleSignInAccount> task) {
                handleSignInResult(task);
              }
            });
    7 của người dùng trong kết quả hoạt động của ý định đăng nhập

    // This task is always completed immediately, there is no need to attach an
    // asynchronous listener.
    Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
    handleSignInResult(task);
  4. Sau khi người dùng đăng nhập âm thầm hoặc rõ ràng, hãy lấy mã thông báo ID từ đối tượng

    GoogleSignIn.silentSignIn()
        .addOnCompleteListener(
            this,
            new OnCompleteListener<GoogleSignInAccount>() {
              @Override
              public void onComplete(@NonNull Task<GoogleSignInAccount> task) {
                handleSignInResult(task);
              }
            });
    7

    private void handleSignInResult(@NonNull Task<GoogleSignInAccount> completedTask) {
        try {
            GoogleSignInAccount account = completedTask.getResult(ApiException.class);
            String idToken = account.getIdToken();
    
            // TODO(developer): send ID Token to server and validate
    
            updateUI(account);
        } catch (ApiException e) {
            Log.w(TAG, "handleSignInResult:error", e);
            updateUI(null);
        }
    }
    Nếu bạn không định cấu hình
    GoogleSignIn.silentSignIn()
        .addOnCompleteListener(
            this,
            new OnCompleteListener<GoogleSignInAccount>() {
              @Override
              public void onComplete(@NonNull Task<GoogleSignInAccount> task) {
                handleSignInResult(task);
              }
            });
    9 với
    GoogleSignIn.silentSignIn()
        .addOnCompleteListener(
            this,
            new OnCompleteListener<GoogleSignInAccount>() {
              @Override
              public void onComplete(@NonNull Task<GoogleSignInAccount> task) {
                handleSignInResult(task);
              }
            });
    5, thì
    // This task is always completed immediately, there is no need to attach an
    // asynchronous listener.
    Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
    handleSignInResult(task);
    1 sẽ trả về
    // This task is always completed immediately, there is no need to attach an
    // asynchronous listener.
    Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
    handleSignInResult(task);
    2

Sau đó, gửi mã thông báo ID đến máy chủ của bạn bằng yêu cầu HTTPS POST

HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost("https://yourbackend.example.com/tokensignin");

try {
  List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
  nameValuePairs.add(new BasicNameValuePair("idToken", idToken));
  httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

  HttpResponse response = httpClient.execute(httpPost);
  int statusCode = response.getStatusLine().getStatusCode();
  final String responseBody = EntityUtils.toString(response.getEntity());
  Log.i(TAG, "Signed in as: " + responseBody);
} catch (ClientProtocolException e) {
  Log.e(TAG, "Error sending ID token to backend.", e);
} catch (IOException e) {
  Log.e(TAG, "Error sending ID token to backend.", e);
}

Xác minh tính toàn vẹn của mã thông báo ID

Sau khi bạn nhận được mã thông báo ID bằng HTTPS POST, bạn phải xác minh tính toàn vẹn của mã thông báo

Để xác minh rằng mã thông báo hợp lệ, hãy đảm bảo rằng các tiêu chí sau được đáp ứng

  • Mã thông báo ID được Google ký hợp lệ. Sử dụng khóa công khai của Google (có sẵn ở định dạng JWK hoặc PEM) để xác minh chữ ký của mã thông báo. Các phím này được xoay thường xuyên;
  • Giá trị của
    // This task is always completed immediately, there is no need to attach an
    // asynchronous listener.
    Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
    handleSignInResult(task);
    4 trong mã thông báo ID bằng với một trong các ID khách hàng của ứng dụng của bạn. Việc kiểm tra này là cần thiết để ngăn mã thông báo ID được cấp cho một ứng dụng độc hại đang được sử dụng để truy cập dữ liệu về cùng một người dùng trên máy chủ phụ trợ của ứng dụng của bạn
  • Giá trị của
    // This task is always completed immediately, there is no need to attach an
    // asynchronous listener.
    Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
    handleSignInResult(task);
    5 trong mã thông báo ID bằng với
    // This task is always completed immediately, there is no need to attach an
    // asynchronous listener.
    Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
    handleSignInResult(task);
    6 hoặc
    // This task is always completed immediately, there is no need to attach an
    // asynchronous listener.
    Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
    handleSignInResult(task);
    7
  • Thời gian hết hạn (
    // This task is always completed immediately, there is no need to attach an
    // asynchronous listener.
    Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
    handleSignInResult(task);
    8) của mã thông báo ID chưa qua
  • Nếu bạn muốn hạn chế quyền truy cập chỉ đối với các thành viên trong miền G Suite của mình, đồng thời hãy xác minh khiếu nại
    // This task is always completed immediately, there is no need to attach an
    // asynchronous listener.
    Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
    handleSignInResult(task);
    9 bằng cách kiểm tra tên miền được trả về theo phương thức
    private void handleSignInResult(@NonNull Task<GoogleSignInAccount> completedTask) {
        try {
            GoogleSignInAccount account = completedTask.getResult(ApiException.class);
            String idToken = account.getIdToken();
    
            // TODO(developer): send ID Token to server and validate
    
            updateUI(account);
        } catch (ApiException e) {
            Log.w(TAG, "handleSignInResult:error", e);
            updateUI(null);
        }
    }
    6