Bảo vệ tài khoản người dùng bằng Bảo vệ nhiều tài khoản

Nếu ứng dụng của bạn cho phép người dùng đăng nhập vào tài khoản của họ bằng Google, bạn có thể cải thiện tính bảo mật của tài khoản của những người dùng được chia sẻ này bằng cách lắng nghe và phản hồi các thông báo về sự kiện bảo mật do dịch vụ Bảo vệ nhiều tài khoản cung cấp.

Những thông báo này cảnh báo cho bạn về những thay đổi lớn đối với Tài khoản Google của người dùng, những thay đổi này thường cũng có thể có tác động bảo mật cho tài khoản của họ với ứng dụng của bạn. Ví dụ: nếu Tài khoản Google của người dùng bị xâm nhập, điều đó có thể dẫn đến việc xâm nhập tài khoản của người dùng với ứng dụng của bạn thông qua khôi phục tài khoản email hoặc sử dụng đăng nhập một lần.

Để giúp bạn giảm thiểu nguy cơ tiềm ẩn của các sự kiện như vậy, Google sẽ gửi các đối tượng dịch vụ của bạn được gọi là mã sự kiện bảo mật. Những mã thông báo này tiết lộ rất ít thông tin — chỉ là loại sự kiện bảo mật và thời điểm nó xảy ra, cũng như số nhận dạng của người dùng bị ảnh hưởng — nhưng bạn có thể sử dụng chúng để thực hiện hành động thích hợp. Ví dụ: nếu Tài khoản Google của người dùng bị xâm phạm, bạn có thể tạm thời vô hiệu hóa tính năng Đăng nhập bằng Google cho người dùng đó và ngăn không cho gửi email khôi phục tài khoản đến địa chỉ Gmail của người dùng.

Bảo vệ nhiều tài khoản dựa trên tiêu chuẩn RISC , được phát triển tại OpenID Foundation.

Tổng quat

Để sử dụng Bảo vệ nhiều tài khoản với ứng dụng hoặc dịch vụ của mình, bạn phải hoàn thành các tác vụ sau:

  1. Thiết lập dự án của bạn trong API Console.

  2. Tạo điểm cuối của người nhận sự kiện, mà Google sẽ gửi mã thông báo sự kiện bảo mật tới đó. Điểm cuối này chịu trách nhiệm xác thực các mã thông báo mà nó nhận được và sau đó phản hồi các sự kiện bảo mật theo bất kỳ cách nào bạn chọn.

  3. Đăng ký điểm cuối của bạn với Google để bắt đầu nhận mã thông báo sự kiện bảo mật.

Điều kiện tiên quyết

Bạn chỉ nhận được mã sự kiện bảo mật cho những người dùng Google đã cấp cho dịch vụ của bạn quyền truy cập vào thông tin hồ sơ hoặc địa chỉ email của họ. Bạn nhận được quyền này bằng cách yêu cầu phạm vi profile hoặc email . SDK đăng nhập của Google yêu cầu các phạm vi này theo mặc định, nhưng nếu bạn không sử dụng cài đặt mặc định hoặc nếu bạn truy cập trực tiếp vào điểm cuối OpenID Connect của Google, hãy đảm bảo rằng bạn đang yêu cầu ít nhất một trong các phạm vi này.

Thiết lập một dự án trong API Console

Trước khi có thể bắt đầu nhận mã sự kiện bảo mật, bạn phải tạo tài khoản dịch vụ và bật API RISC trong dự án API Console của mình. Bạn phải sử dụng cùng một dự án API Console mà bạn sử dụng để truy cập các dịch vụ của Google, chẳng hạn như Đăng nhập bằng Google, trong ứng dụng của bạn.

Để tạo tài khoản dịch vụ:

  1. Mở API Console Credentials page . Khi được nhắc, hãy chọn dự án API Console mà bạn sử dụng để truy cập các dịch vụ của Google trong ứng dụng của mình.

  2. Nhấp vào Tạo thông tin xác thực> Khóa tài khoản dịch vụ .

  3. Tạo tài khoản dịch vụ mới với vai trò Biên tập viên.

    Chọn loại khóa JSON và sau đó nhấp vào Tạo . Khi khóa được tạo, bạn sẽ tải xuống tệp JSON chứa thông tin đăng nhập tài khoản dịch vụ của bạn. Giữ tệp này ở nơi an toàn, nhưng cũng có thể truy cập vào điểm cuối của bộ thu sự kiện của bạn.

Trong khi bạn đang ở trang Thông tin đăng nhập của dự án, hãy lưu ý đến các ID khách hàng mà bạn sử dụng để Đăng nhập bằng Google. Thông thường, bạn có một ID khách hàng cho mỗi nền tảng mà bạn hỗ trợ. Bạn sẽ cần các ID ứng dụng này để xác thực mã thông báo sự kiện bảo mật, như được mô tả trong phần tiếp theo.

Để bật API RISC:

  1. Mở trang API RISC trong API Console. Đảm bảo rằng dự án bạn sử dụng để truy cập các dịch vụ của Google vẫn được chọn.

  2. Đọc Điều khoản RISC và đảm bảo bạn hiểu các yêu cầu.

    Nếu bạn đang bật API cho một dự án do một tổ chức sở hữu, hãy đảm bảo rằng bạn được ủy quyền để ràng buộc tổ chức của mình với các Điều khoản RISC.

  3. Nhấp vào Bật chỉ nếu bạn đồng ý với Điều khoản RISC.

Tạo điểm cuối của người nhận sự kiện

Để nhận thông báo sự kiện bảo mật từ Google, bạn tạo một điểm cuối HTTPS xử lý các yêu cầu HTTPS POST. Sau khi bạn đăng ký điểm cuối này (xem bên dưới), Google sẽ bắt đầu đăng các chuỗi được ký bằng mật mã được gọi là mã sự kiện bảo mật cho điểm cuối. Mã thông báo sự kiện bảo mật là các JWT đã ký có chứa thông tin về một sự kiện liên quan đến bảo mật.

Đối với mỗi mã thông báo sự kiện bảo mật bạn nhận được tại điểm cuối của mình, trước tiên hãy xác thực và giải mã mã thông báo, sau đó xử lý sự kiện bảo mật phù hợp với dịch vụ của bạn. Các phần sau đây mô tả các nhiệm vụ này:

1. Giải mã và xác thực mã sự kiện bảo mật

Vì mã thông báo sự kiện bảo mật là một loại JWT cụ thể, bạn có thể sử dụng bất kỳ thư viện JWT nào, chẳng hạn như thư viện được liệt kê trên jwt.io , để giải mã và xác thực chúng. Cho dù bạn sử dụng thư viện nào, mã xác thực mã thông báo của bạn phải thực hiện những việc sau:

  1. Lấy số nhận dạng nhà phát hành Bảo vệ nhiều tài khoản ( issuer ) và ký URI chứng chỉ khóa ( jwks_uri ) từ tài liệu cấu hình RISC của Google, bạn có thể tìm thấy tài liệu này tại https://accounts.google.com/.well-known/risc-configuration .
  2. Sử dụng thư viện JWT mà bạn chọn, lấy ID khóa ký từ tiêu đề của mã thông báo sự kiện bảo mật.
  3. Từ tài liệu chứng chỉ khóa ký của Google, hãy lấy khóa công khai với ID khóa mà bạn đã nhận ở bước trước. Nếu tài liệu không chứa khóa có ID mà bạn đang tìm kiếm, có thể mã thông báo sự kiện bảo mật không hợp lệ và điểm cuối của bạn sẽ trả về lỗi HTTP 400.
  4. Sử dụng thư viện JWT mà bạn chọn, xác minh những điều sau:
    • Mã thông báo sự kiện bảo mật được ký bằng khóa công khai mà bạn đã nhận được ở bước trước.
    • Các aud tuyên bố của thẻ là một trong những khách hàng ID của ứng dụng.
    • Yêu cầu iss của mã thông báo khớp với giá trị nhận dạng của nhà phát hành mà bạn nhận được từ tài liệu khám phá RISC. Lưu ý rằng bạn không cần xác minh ngày hết hạn ( exp ) của mã thông báo vì mã thông báo sự kiện bảo mật đại diện cho các sự kiện lịch sử và do đó, không hết hạn.

Ví dụ:

Java

Sử dụng java- jwtjwks-rsa-java :

public DecodedJWT validateSecurityEventToken(String token) {
    DecodedJWT jwt = null;
    try {
        // In a real implementation, get these values from
        // https://accounts.google.com/.well-known/risc-configuration
        String issuer = "accounts.google.com";
        String jwksUri = "https://www.googleapis.com/oauth2/v3/certs";

        // Get the ID of the key used to sign the token.
        DecodedJWT unverifiedJwt = JWT.decode(token);
        String keyId = unverifiedJwt.getKeyId();

        // Get the public key from Google.
        JwkProvider googleCerts = new UrlJwkProvider(new URL(jwksUri), null, null);
        PublicKey publicKey = googleCerts.get(keyId).getPublicKey();

        // Verify and decode the token.
        Algorithm rsa = Algorithm.RSA256((RSAPublicKey) publicKey, null);
        JWTVerifier verifier = JWT.require(rsa)
                .withIssuer(issuer)
                // Get your apps' client IDs from the API console:
                // https://console.developers.google.com/apis/credentials?project=_
                .withAudience("123456789-abcedfgh.apps.googleusercontent.com",
                              "123456789-ijklmnop.apps.googleusercontent.com",
                              "123456789-qrstuvwx.apps.googleusercontent.com")
                .acceptLeeway(Long.MAX_VALUE)  // Don't check for expiration.
                .build();
        jwt = verifier.verify(token);
    } catch (JwkException e) {
        // Key not found. Return HTTP 400.
    } catch (InvalidClaimException e) {

    } catch (JWTDecodeException exception) {
        // Malformed token. Return HTTP 400.
    } catch (MalformedURLException e) {
        // Invalid JWKS URI.
    }
    return jwt;
}

Python

import json
import jwt       # pip install pyjwt
import requests  # pip install requests

def validate_security_token(token, client_ids):
    # Get Google's RISC configuration.
    risc_config_uri = 'https://accounts.google.com/.well-known/risc-configuration'
    risc_config = requests.get(risc_config_uri).json()

    # Get the public key used to sign the token.
    google_certs = requests.get(risc_config['jwks_uri']).json()
    jwt_header = jwt.get_unverified_header(token)
    key_id = jwt_header['kid']
    public_key = None
    for key in google_certs['keys']:
        if key['kid'] == key_id:
            public_key = jwt.algorithms.RSAAlgorithm.from_jwk(json.dumps(key))
    if not public_key:
        raise Exception('Public key certificate not found.')
        # In this situation, return HTTP 400

    # Decode the token, validating its signature, audience, and issuer.
    try:
        token_data = jwt.decode(token, public_key, algorithms='RS256',
                                options={'verify_exp': False},
                                audience=client_ids, issuer=risc_config['issuer'])
    except:
        raise
        # Validation failed. Return HTTP 400.
    return token_data

# Get your apps' client IDs from the API console:
# https://console.developers.google.com/apis/credentials?project=_
client_ids = ['123456789-abcedfgh.apps.googleusercontent.com',
              '123456789-ijklmnop.apps.googleusercontent.com',
              '123456789-qrstuvwx.apps.googleusercontent.com']
token_data = validate_security_token(token, client_ids)

Nếu mã thông báo hợp lệ và đã được giải mã thành công, hãy trả về trạng thái HTTP 202. Sau đó, xử lý sự kiện bảo mật được chỉ ra bởi mã thông báo.

2. Xử lý các sự kiện bảo mật

Khi được giải mã, mã sự kiện bảo mật trông giống như ví dụ sau:

{
  "iss": "https://accounts.google.com/",
  "aud": "123456789-abcedfgh.apps.googleusercontent.com",
  "iat": 1508184845,
  "jti": "756E69717565206964656E746966696572",
  "events": {
    "https://schemas.openid.net/secevent/risc/event-type/account-disabled": {
      "subject": {
        "subject_type": "iss-sub",
        "iss": "https://accounts.google.com/",
        "sub": "7375626A656374"
      },
      "reason": "hijacking"
    }
  }
}

Các issaud tuyên bố cho thấy người phát hành token (Google) và của mã thông báo dự định nhận (dịch vụ của bạn). Bạn đã xác minh những xác nhận quyền sở hữu này ở bước trước.

jti cầu jti là một chuỗi xác định một sự kiện bảo mật duy nhất và là duy nhất cho luồng. Bạn có thể sử dụng mã định danh này để theo dõi những sự kiện bảo mật nào bạn đã nhận được.

Yêu cầu events chứa thông tin về sự kiện bảo mật mà mã thông báo đại diện. Xác nhận quyền sở hữu này là ánh xạ từ số nhận dạng loại sự kiện đến xác nhận quyền sở hữu subject , chỉ định người dùng về sự kiện này và đến bất kỳ chi tiết bổ sung nào về sự kiện có thể có.

Yêu cầu subject xác định một người dùng cụ thể bằng ID tài khoản Google ( sub ) duy nhất của người dùng. ID này giống với số nhận dạng có trong mã thông báo ID do Google Sign-in tạo ra . Khi subject_type yêu cầu bồi thường là id_token_claims , nó cũng có thể bao gồm một email lĩnh vực với địa chỉ email của người dùng.

Sử dụng thông tin trong yêu cầu events để thực hiện hành động thích hợp cho loại sự kiện trên tài khoản của người dùng được chỉ định.

Các loại sự kiện được hỗ trợ

Bảo vệ nhiều tài khoản hỗ trợ các loại sự kiện bảo mật sau:

Loại sự kiện Thuộc tính Làm thế nào để đáp ứng
https://schemas.openid.net/secevent/risc/event-type/sessions-revoked Bắt buộc : Bảo mật lại tài khoản của người dùng bằng cách kết thúc các phiên hiện đang mở của họ.
https://schemas.openid.net/secevent/oauth/event-type/tokens-revoked

Bắt buộc : Nếu mã thông báo dành cho Đăng nhập bằng Google, hãy chấm dứt các phiên hiện đang mở của họ. Ngoài ra, bạn có thể muốn đề xuất người dùng thiết lập phương thức đăng nhập thay thế.

Được đề xuất : Nếu mã thông báo dành cho quyền truy cập vào các API khác của Google, hãy xóa bất kỳ mã thông báo OAuth nào của người dùng mà bạn đã lưu trữ.

https://schemas.openid.net/secevent/risc/event-type/account-disabled reason=hijacking ,
reason=bulk-account

Bắt buộc : Nếu lý do tài khoản bị vô hiệu hóa là do hijacking , hãy bảo mật lại tài khoản của người dùng bằng cách kết thúc các phiên hiện đang mở của họ.

Đề xuất : Nếu lý do tài khoản bị vô hiệu là bulk-account , hãy phân tích hoạt động của người dùng trên dịch vụ của bạn và xác định các hành động tiếp theo thích hợp.

Đề xuất : Nếu không có lý do nào được cung cấp, hãy tắt Đăng nhập bằng Google cho người dùng và tắt khôi phục tài khoản bằng địa chỉ email được liên kết với Tài khoản Google của người dùng (thường, nhưng không nhất thiết là tài khoản Gmail). Cung cấp cho người dùng một phương thức đăng nhập thay thế.

https://schemas.openid.net/secevent/risc/event-type/account-enabled Đề xuất : Bật lại Đăng nhập Google cho người dùng và bật lại khôi phục tài khoản bằng địa chỉ email Tài khoản Google của người dùng.
https://schemas.openid.net/secevent/risc/event-type/account-purged Được đề xuất : Xóa tài khoản của người dùng hoặc cung cấp cho họ một phương thức đăng nhập thay thế.
https://schemas.openid.net/secevent/risc/event-type/account-credential-change-required Đề xuất : Để ý hoạt động đáng ngờ trên dịch vụ của bạn và thực hiện hành động thích hợp.
https://schemas.openid.net/secevent/risc/event-type/verification state = state Đề xuất : Ghi nhật ký rằng đã nhận được mã thông báo thử nghiệm.

Sự kiện trùng lặp và bị bỏ lỡ

Bảo vệ nhiều tài khoản sẽ cố gắng phân phối lại các sự kiện mà nó cho rằng chưa được phân phối. Do đó, đôi khi bạn có thể nhận được cùng một sự kiện nhiều lần. Nếu điều này có thể gây ra các hành động lặp lại gây bất tiện cho người dùng của bạn, hãy xem xét sử dụng xác nhận quyền sở hữu jti (là mã định danh duy nhất cho một sự kiện) để loại bỏ các sự kiện. Có các công cụ bên ngoài như Google Cloud Dataflow có thể giúp bạn thực hiện quy trình loại bỏ dữ liệu trùng lặp.

Lưu ý rằng các sự kiện được phân phối với số lần thử lại có giới hạn, vì vậy nếu bộ thu của bạn không hoạt động trong một khoảng thời gian dài, bạn có thể bỏ lỡ vĩnh viễn một số sự kiện.

Đăng ký người nhận của bạn

Để bắt đầu nhận các sự kiện bảo mật, hãy đăng ký điểm cuối người nhận của bạn bằng API RISC. Các lệnh gọi tới API RISC phải được đi kèm với mã thông báo ủy quyền.

Bạn sẽ chỉ nhận được các sự kiện bảo mật cho người dùng ứng dụng của mình, vì vậy, bạn cần phải định cấu hình màn hình chấp thuận OAuth trong dự án GCP của mình làm điều kiện tiên quyết cho các bước được mô tả bên dưới.

1. Tạo mã thông báo ủy quyền

Để tạo mã thông báo ủy quyền cho RISC API, hãy tạo JWT với các xác nhận quyền sở hữu sau:

{
  "iss": SERVICE_ACCOUNT_EMAIL,
  "sub": SERVICE_ACCOUNT_EMAIL,
  "aud": "https://risc.googleapis.com/google.identity.risc.v1beta.RiscManagementService",
  "iat": CURRENT_TIME,
  "exp": CURRENT_TIME + 3600
}

Đăng ký JWT bằng khóa riêng tư của tài khoản dịch vụ của bạn, bạn có thể tìm thấy khóa này trong tệp JSON mà bạn đã tải xuống khi tạo khóa tài khoản dịch vụ.

Ví dụ:

Java

Sử dụng java-jwtthư viện auth của Google :

public static String makeBearerToken() {
    String token = null;
    try {
        // Get signing key and client email address.
        FileInputStream is = new FileInputStream("your-service-account-credentials.json");
        ServiceAccountCredentials credentials =
               (ServiceAccountCredentials) GoogleCredentials.fromStream(is);
        PrivateKey privateKey = credentials.getPrivateKey();
        String keyId = credentials.getPrivateKeyId();
        String clientEmail = credentials.getClientEmail();

        // Token must expire in exactly one hour.
        Date issuedAt = new Date();
        Date expiresAt = new Date(issuedAt.getTime() + 3600000);

        // Create signed token.
        Algorithm rsaKey = Algorithm.RSA256(null, (RSAPrivateKey) privateKey);
        token = JWT.create()
                .withIssuer(clientEmail)
                .withSubject(clientEmail)
                .withAudience("https://risc.googleapis.com/google.identity.risc.v1beta.RiscManagementService")
                .withIssuedAt(issuedAt)
                .withExpiresAt(expiresAt)
                .withKeyId(keyId)
                .sign(rsaKey);
    } catch (ClassCastException e) {
        // Credentials file doesn't contain a service account key.
    } catch (IOException e) {
        // Credentials file couldn't be loaded.
    }
    return token;
}

Python

import json
import time

import jwt  # pip install pyjwt

def make_bearer_token(credentials_file):
    with open(credentials_file) as service_json:
        service_account = json.load(service_json)
        issuer = service_account['client_email']
        subject = service_account['client_email']
        private_key_id = service_account['private_key_id']
        private_key = service_account['private_key']
    issued_at = int(time.time())
    expires_at = issued_at + 3600
    payload = {'iss': issuer,
               'sub': subject,
               'aud': 'https://risc.googleapis.com/google.identity.risc.v1beta.RiscManagementService',
               'iat': issued_at,
               'exp': expires_at}
    encoded = jwt.encode(payload, private_key, algorithm='RS256',
                         headers={'kid': private_key_id})
    return encoded

auth_token = make_bearer_token('your-service-account-credentials.json')

Mã thông báo ủy quyền này có thể được sử dụng để thực hiện các lệnh gọi API RISC trong một giờ. Khi mã thông báo hết hạn, hãy tạo một mã mới để tiếp tục thực hiện lệnh gọi API RISC.

2. Gọi API cấu hình luồng RISC

Bây giờ bạn đã có mã thông báo ủy quyền, bạn có thể sử dụng API RISC để định cấu hình luồng sự kiện bảo mật của dự án, bao gồm cả việc đăng ký điểm cuối người nhận của bạn.

Để làm như vậy, hãy thực hiện yêu cầu HTTPS POST tới https://risc.googleapis.com/v1beta/stream:update , chỉ định điểm cuối người nhận của bạn và các loại sự kiện bảo mật mà bạn quan tâm:

POST /v1beta/stream:update HTTP/1.1
Host: risc.googleapis.com
Authorization: Bearer AUTH_TOKEN

{
  "delivery": {
    "delivery_method":
      "https://schemas.openid.net/secevent/risc/delivery-method/push",
    "url": RECEIVER_ENDPOINT
  },
  "events_requested": [
    SECURITY_EVENT_TYPES
  ]
}

Ví dụ:

Java

public static void configureEventStream(final String receiverEndpoint,
                                        final List<String> eventsRequested,
                                        String authToken) throws IOException {
    ObjectMapper jsonMapper = new ObjectMapper();
    String streamConfig = jsonMapper.writeValueAsString(new Object() {
        public Object delivery = new Object() {
            public String delivery_method =
                    "https://schemas.openid.net/secevent/risc/delivery-method/push";
            public String url = receiverEndpoint;
        };
        public List<String> events_requested = eventsRequested;
    });

    HttpPost updateRequest = new HttpPost("https://risc.googleapis.com/v1beta/stream:update");
    updateRequest.addHeader("Content-Type", "application/json");
    updateRequest.addHeader("Authorization", "Bearer " + authToken);
    updateRequest.setEntity(new StringEntity(streamConfig));

    HttpResponse updateResponse = new DefaultHttpClient().execute(updateRequest);
    Header[] responseContentTypeHeaders = updateResponse.getHeaders("Content-Type");
    StatusLine responseStatus = updateResponse.getStatusLine();
    int statusCode = responseStatus.getStatusCode();
    HttpEntity entity = updateResponse.getEntity();
    // Now handle response
}

// ...

configureEventStream(
        "https://your-service.example.com/security-event-receiver",
        Arrays.asList(
                "https://schemas.openid.net/secevent/risc/event-type/account-credential-change-required",
                "https://schemas.openid.net/secevent/risc/event-type/account-disabled"),
        authToken);

Python

import requests

def configure_event_stream(auth_token, receiver_endpoint, events_requested):
    stream_update_endpoint = 'https://risc.googleapis.com/v1beta/stream:update'
    headers = {'Authorization': 'Bearer {}'.format(auth_token)}
    stream_cfg = {'delivery': {'delivery_method': 'https://schemas.openid.net/secevent/risc/delivery-method/push',
                               'url': receiver_endpoint},
                  'events_requested': events_requested}
    response = requests.post(stream_update_endpoint, json=stream_cfg, headers=headers)
    response.raise_for_status()  # Raise exception for unsuccessful requests

configure_event_stream(auth_token, 'https://your-service.example.com/security-event-receiver',
                       ['https://schemas.openid.net/secevent/risc/event-type/account-credential-change-required',
                        'https://schemas.openid.net/secevent/risc/event-type/account-disabled'])

Nếu yêu cầu trả về HTTP 200, luồng sự kiện đã được định cấu hình thành công và điểm cuối người nhận của bạn sẽ bắt đầu nhận mã thông báo sự kiện bảo mật. Phần tiếp theo mô tả cách bạn có thể kiểm tra cấu hình luồng và điểm cuối của mình để xác minh mọi thứ đang hoạt động chính xác cùng nhau.

Nhận và cập nhật cấu hình luồng hiện tại của bạn

Nếu trong tương lai, bạn muốn sửa đổi cấu hình luồng của mình, bạn có thể làm như vậy bằng cách thực hiện yêu cầu GET được ủy quyền tới https://risc.googleapis.com/v1beta/stream để nhận cấu hình luồng hiện tại, sửa đổi nội dung phản hồi và sau đó ĐĂNG cấu hình đã sửa đổi trở lại https://risc.googleapis.com/v1beta/stream:update như được mô tả ở trên.

Dừng và tiếp tục luồng sự kiện

Nếu bạn cần dừng luồng sự kiện từ Google, hãy thực hiện yêu cầu ĐĂNG được ủy quyền tới https://risc.googleapis.com/v1beta/stream/status:update với { "status": "disabled" } trong nội dung yêu cầu. Trong khi luồng bị vô hiệu hóa, Google sẽ không gửi các sự kiện đến điểm cuối của bạn và không đệm các sự kiện bảo mật khi chúng xảy ra. Để bật lại luồng sự kiện, hãy ĐĂNG { "status": "enabled" } lên cùng một điểm cuối.

3. Tùy chọn: Kiểm tra cấu hình luồng của bạn

Bạn có thể xác minh rằng cấu hình luồng và điểm cuối người nhận đang hoạt động chính xác với nhau bằng cách gửi mã xác minh thông qua luồng sự kiện của bạn. Mã thông báo này có thể chứa một chuỗi duy nhất mà bạn có thể sử dụng để xác minh rằng mã thông báo đã được nhận tại điểm cuối của bạn.

Để yêu cầu mã thông báo xác minh, hãy thực hiện yêu cầu ĐĂNG HTTPS được ủy quyền tới https://risc.googleapis.com/v1beta/stream:verify . Trong phần nội dung của yêu cầu, hãy chỉ định một số chuỗi nhận dạng:

{
  "state": "ANYTHING"
}

Ví dụ:

Java

public static void testEventStream(final String stateString,
                                   String authToken) throws IOException {
    ObjectMapper jsonMapper = new ObjectMapper();
    String json = jsonMapper.writeValueAsString(new Object() {
        public String state = stateString;
    });

    HttpPost updateRequest = new HttpPost("https://risc.googleapis.com/v1beta/stream:verify");
    updateRequest.addHeader("Content-Type", "application/json");
    updateRequest.addHeader("Authorization", "Bearer " + authToken);
    updateRequest.setEntity(new StringEntity(json));

    HttpResponse updateResponse = new DefaultHttpClient().execute(updateRequest);
    Header[] responseContentTypeHeaders = updateResponse.getHeaders("Content-Type");
    StatusLine responseStatus = updateResponse.getStatusLine();
    int statusCode = responseStatus.getStatusCode();
    HttpEntity entity = updateResponse.getEntity();
    // Now handle response
}

// ...

testEventStream("Test token requested at " + new Date().toString(), authToken);

Python

import requests
import time

def test_event_stream(auth_token, nonce):
    stream_verify_endpoint = 'https://risc.googleapis.com/v1beta/stream:verify'
    headers = {'Authorization': 'Bearer {}'.format(auth_token)}
    state = {'state': nonce}
    response = requests.post(stream_verify_endpoint, json=state, headers=headers)
    response.raise_for_status()  # Raise exception for unsuccessful requests

test_event_stream(auth_token, 'Test token requested at {}'.format(time.ctime()))

Nếu yêu cầu thành công, mã xác minh sẽ được gửi đến điểm cuối mà bạn đã đăng ký. Sau đó, ví dụ: nếu điểm cuối của bạn xử lý mã thông báo xác minh bằng cách ghi nhật ký đơn giản, bạn có thể kiểm tra nhật ký của mình để xác nhận mã thông báo đã được nhận.

Tham chiếu mã lỗi

API RISC có thể trả lại các lỗi sau:

Mã lỗi Thông báo lỗi Các hành động được đề xuất
400 Cấu hình luồng phải chứa trường $ fieldname . Yêu cầu của bạn đối với điểm cuối https://risc.googleapis.com/v1beta/stream:update không hợp lệ hoặc không thể phân tích cú pháp. Vui lòng bao gồm $ fieldname trong yêu cầu của bạn.
401 Không được phép. Ủy quyển thất bại. Hãy chắc chắn rằng bạn đã đính kèm mã thông báo ủy quyền với yêu cầu và mã thông báo đó hợp lệ và chưa hết hạn.
403 Điểm cuối phân phối phải là URL HTTPS. Điểm cuối phân phối của bạn (tức là điểm cuối mà bạn mong đợi các sự kiện RISC được chuyển đến) phải là HTTPS. Chúng tôi không gửi các sự kiện RISC tới các URL HTTP.
403 Cấu hình luồng hiện tại không có phương thức phân phối tuân thủ đặc điểm cho RISC. Dự án Google Cloud của bạn phải có cấu hình RISC. Nếu bạn đang sử dụng Firebase và đã bật Đăng nhập bằng Google, thì Firebase sẽ quản lý RISC cho dự án của bạn; bạn sẽ không thể tạo cấu hình tùy chỉnh. Nếu bạn không sử dụng Đăng nhập bằng Google cho dự án Firebase của mình, vui lòng tắt tính năng này rồi thử cập nhật lại sau một giờ.
403 Không thể tìm thấy dự án. Đảm bảo rằng bạn đang sử dụng đúng tài khoản dịch vụ cho đúng dự án. Bạn có thể đang sử dụng tài khoản dịch vụ được liên kết với một dự án đã xóa. Tìm hiểu cách xem tất cả các tài khoản dịch vụ được liên kết với một dự án .
403 Tài khoản dịch vụ phải có quyền biên tập viên trong dự án của bạn. Truy cập bảng điều khiển Google Cloud Platform của dự án của bạn và cấp tài khoản dịch vụ đang thực hiện quyền chủ sở hữu / trình chỉnh sửa cuộc gọi cho dự án của bạn bằng cách làm theo các hướng dẫn sau .
403 API quản lý luồng chỉ nên được gọi bởi một tài khoản dịch vụ. Dưới đây là thông tin thêm về cách bạn có thể gọi các API của Google bằng tài khoản dịch vụ .
403 Điểm cuối phân phối không thuộc về bất kỳ miền nào trong dự án của bạn. Mọi dự án đều có một tập hợp các miền được ủy quyền. Nếu điểm cuối phân phối của bạn (tức là điểm cuối mà bạn mong đợi các sự kiện RISC được phân phối đến) không được lưu trữ trên một trong số chúng, chúng tôi yêu cầu bạn thêm miền của điểm cuối vào tập hợp đó.
403 Để sử dụng API này, dự án của bạn phải có ít nhất một ứng dụng khách OAuth được định cấu hình. RISC chỉ hoạt động nếu bạn tạo ứng dụng hỗ trợ Đăng nhập bằng Google . Kết nối này yêu cầu ứng dụng khách OAuth. Nếu dự án của bạn không có ứng dụng khách OAuth, có khả năng RISC sẽ không hữu ích cho bạn. Tìm hiểu thêm về cách sử dụng OAuth của Google cho các API của chúng tôi .
403

Trạng thái không được hỗ trợ.

Trạng thái không hợp lệ.

Chúng tôi chỉ hỗ trợ các trạng thái luồng “ enabled ” và “đã disabled ” tại thời điểm này.
404

Dự án không có cấu hình RISC.

Dự án không có cấu hình RISC hiện có, không thể cập nhật trạng thái.

Gọi cho điểm cuối https://risc.googleapis.com/v1beta/stream:update để tạo cấu hình luồng mới.
4XX / 5XX Không thể cập nhật trạng thái. Kiểm tra thông báo lỗi chi tiết để biết thêm thông tin.

Phạm vi truy cập mã thông báo

Nếu bạn quyết định sử dụng mã thông báo truy cập để xác thực với API RISC, đây là những phạm vi ứng dụng của bạn phải yêu cầu:

Điểm cuối Phạm vi
https://risc.googleapis.com/v1beta/stream/status https://www.googleapis.com/auth/risc.status.readonly HOẶC https://www.googleapis.com/auth/risc.status.readwrite
https://risc.googleapis.com/v1beta/stream/status:update https://www.googleapis.com/auth/risc.status.readwrite
https://risc.googleapis.com/v1beta/stream https://www.googleapis.com/auth/risc.configuration.readonly HOẶC https://www.googleapis.com/auth/risc.configuration.readwrite
https://risc.googleapis.com/v1beta/stream:update https://www.googleapis.com/auth/risc.configuration.readwrite
https://risc.googleapis.com/v1beta/stream:verify https://www.googleapis.com/auth/risc.verify

Cần giúp đỡ?

Trước tiên, hãy kiểm tra phần tham chiếu mã lỗi của chúng tôi. Nếu bạn vẫn có câu hỏi, hãy đăng chúng trên Stack Overflow với thẻ #SecEvents .