গুগল কালো সম্প্রদায়ের জন্য জাতিগত সমতা উন্নয়নে প্রতিশ্রুতিবদ্ধ। দেখ কিভাবে.

ক্রস অ্যাকাউন্ট সুরক্ষা দিয়ে ব্যবহারকারীর অ্যাকাউন্টগুলি সুরক্ষিত করুন

যদি আপনার অ্যাপ্লিকেশন ব্যবহারকারীদের গুগল ব্যবহার করে তাদের অ্যাকাউন্টগুলিতে সাইন ইন করতে দেয় তবে আপনি ক্রস অ্যাকাউন্ট সুরক্ষা পরিষেবা সরবরাহ করে এমন সুরক্ষা ইভেন্টের বিজ্ঞপ্তিগুলি শুনে এবং প্রতিক্রিয়া জানিয়ে এই ভাগ করা ব্যবহারকারীর অ্যাকাউন্টগুলির সুরক্ষা উন্নত করতে পারেন।

এই বিজ্ঞপ্তিগুলি আপনাকে আপনার ব্যবহারকারীদের গুগল অ্যাকাউন্টগুলিতে বড় ধরনের পরিবর্তন সম্পর্কে সতর্ক করে, যা প্রায়শই আপনার অ্যাপ্লিকেশন দিয়ে তাদের অ্যাকাউন্টগুলির জন্য সুরক্ষা জড়িত থাকতে পারে। উদাহরণস্বরূপ, যদি কোনও ব্যবহারকারীর গুগল অ্যাকাউন্ট হাইজ্যাক করা হয় তবে এটি ইমেল অ্যাকাউন্ট পুনরুদ্ধার বা একক সাইন-অন ব্যবহারের মাধ্যমে আপনার অ্যাপ্লিকেশনটির সাথে ব্যবহারকারীর অ্যাকাউন্টের সাথে সমঝোতা হতে পারে।

এই জাতীয় ইভেন্টের ঝুঁকি সম্ভাবনা প্রশমিত করতে আপনাকে সহায়তা করতে গুগল সুরক্ষা ইভেন্ট টোকেন নামে আপনার পরিষেবা সামগ্রী পাঠায়। এই টোকেনগুলি খুব অল্প তথ্যই প্রকাশ করে — কেবলমাত্র সুরক্ষা ইভেন্টের ধরণ এবং কখন এটি ঘটেছিল এবং আক্রান্ত ব্যবহারকারীর শনাক্তকারী — তবে আপনি প্রতিক্রিয়াতে যথাযথ ব্যবস্থা নিতে তাদের ব্যবহার করতে পারেন। উদাহরণস্বরূপ, যদি কোনও ব্যবহারকারীর গুগল অ্যাকাউন্ট আপোস করা হয় তবে আপনি সেই ব্যবহারকারীর জন্য গুগল সাইন ইন সাময়িকভাবে অক্ষম করতে এবং অ্যাকাউন্টের পুনরুদ্ধার ইমেলগুলি ব্যবহারকারীর জিমেইল ঠিকানায় প্রেরণ করা থেকে বিরত রাখতে পারেন।

ক্রস অ্যাকাউন্ট সুরক্ষা আরআইএসসি স্ট্যান্ডার্ডের উপর ভিত্তি করে, ওপেনআইডি ফাউন্ডেশনে উন্নত।

ওভারভিউ

আপনার অ্যাপ্লিকেশন বা পরিষেবা দিয়ে ক্রস অ্যাকাউন্ট সুরক্ষা ব্যবহার করতে, আপনাকে অবশ্যই নিম্নলিখিত কাজগুলি সম্পূর্ণ করতে হবে:

  1. আপনার প্রকল্প API Console এ সেট আপ করুন।

  2. একটি ইভেন্টের রিসিভারের শেষ পয়েন্ট তৈরি করুন, যেখানে গুগল সুরক্ষা ইভেন্ট টোকেন প্রেরণ করবে। এই শেষ পয়েন্টটি টোকেনগুলি গ্রহণ করে তা বৈধ করার জন্য এবং তারপরে আপনি যেভাবেই নির্বাচন করুন না কেন সুরক্ষা ইভেন্টগুলিতে প্রতিক্রিয়া জানাতে দায়বদ্ধ।

  3. সুরক্ষা ইভেন্ট টোকেন গ্রহণ শুরু করতে Google এর সাথে আপনার শেষ পয়েন্টটি নিবন্ধ করুন।

পূর্বশর্ত

আপনি কেবল সেই গুগল ব্যবহারকারীদের জন্য সুরক্ষা ইভেন্ট টোকেনগুলি পান যারা তাদের প্রোফাইল তথ্য বা ইমেল ঠিকানাগুলি অ্যাক্সেস করার জন্য আপনার পরিষেবার অনুমতি দিয়েছে permission আপনি profile বা email স্কোপগুলির অনুরোধ করে এই অনুমতিটি পান। গুগল সাইন ইন এসডিকে ডিফল্টরূপে এই স্কোপগুলির জন্য অনুরোধ করে তবে আপনি যদি ডিফল্ট সেটিংস ব্যবহার না করেন বা আপনি যদি গুগলের ওপেনআইডি কানেক্টের শেষ পয়েন্টটি সরাসরি অ্যাক্সেস করেন তবে নিশ্চিত হন যে আপনি এই স্কোপের কমপক্ষে একটির জন্য অনুরোধ করছেন।

API Console এ একটি প্রকল্প সেট আপ করুন

সুরক্ষা ইভেন্ট টোকেনগুলি গ্রহণ শুরু করার আগে আপনাকে অবশ্যই একটি পরিষেবা অ্যাকাউন্ট তৈরি করতে হবে এবং আপনার API Console প্রকল্পে RISC API সক্ষম করতে হবে। আপনার অ্যাপ্লিকেশনটিতে গুগল সাইন ইন যেমন গুগল পরিষেবাগুলি অ্যাক্সেস করতে আপনি একই API Console প্রকল্পটি ব্যবহার করতে হবে।

পরিষেবা অ্যাকাউন্ট তৈরি করতে:

  1. API Console Credentials page খুলুন। যখন অনুরোধ করা হয়, তখন আপনার অ্যাপ্লিকেশনটিতে Google পরিষেবাদি অ্যাক্সেস করতে আপনি API Console প্রকল্পটি ব্যবহার করুন।

  2. শংসাপত্র তৈরি করুন> পরিষেবা অ্যাকাউন্ট কী ক্লিক করুন

  3. সম্পাদকের ভূমিকা সহ একটি নতুন পরিষেবা অ্যাকাউন্ট তৈরি করুন।

    JSON কী প্রকারটি চয়ন করুন এবং তারপরে তৈরি ক্লিক করুন । কীটি তৈরি হয়ে গেলে আপনি একটি JSON ফাইল ডাউনলোড করবেন যাতে আপনার পরিষেবা অ্যাকাউন্টের শংসাপত্রগুলি রয়েছে। এই ফাইলটি কোথাও নিরাপদ রাখুন, তবে আপনার ইভেন্টের রিসিভারের শেষ পয়েন্টেও অ্যাক্সেসযোগ্য।

আপনি যখন আপনার প্রকল্পের শংসাপত্রগুলি পৃষ্ঠায় রয়েছেন, তখন Google সাইন-ইন করার জন্য আপনি যে ক্লায়েন্ট আইডি ব্যবহার করেন সেগুলিও নোট করুন। সাধারণত, আপনার সমর্থিত প্রতিটি প্ল্যাটফর্মের জন্য আপনার কাছে একটি ক্লায়েন্ট আইডি রয়েছে। পরবর্তী বিভাগে বর্ণিত, সুরক্ষা ইভেন্ট টোকেনগুলি বৈধ করতে আপনার এই ক্লায়েন্ট আইডিগুলির প্রয়োজন হবে।

আরআইএসসি এপিআই সক্ষম করতে:

  1. API Console এ RISC API পৃষ্ঠাটি খুলুন। Google পরিষেবাদি অ্যাক্সেস করতে আপনি যে প্রকল্পটি ব্যবহার করছেন তা এখনও নির্বাচিত রয়েছে তা নিশ্চিত করুন।

  2. আরআইএসসি শর্তাবলী পড়ুন এবং নিশ্চিত করুন যে আপনি প্রয়োজনীয়তাগুলি বুঝতে পেরেছেন।

    আপনি যদি কোনও সংস্থার মালিকানাধীন কোনও প্রকল্পের জন্য এপিআই সক্ষম করে থাকেন তবে নিশ্চিত হন যে আপনি নিজের সংস্থাকে আরআইএসসি শর্তে আবদ্ধ করার জন্য অনুমোদিত are

  3. আপনি আরআইএসসি শর্তাদি সম্মত হলেই সক্ষম করুন ক্লিক করুন।

ইভেন্টের রিসিভারের শেষ পয়েন্ট তৈরি করুন

গুগল থেকে সুরক্ষা ইভেন্টের বিজ্ঞপ্তিগুলি পেতে, আপনি একটি এইচটিটিপিএস এন্ডপয়েন্টটি তৈরি করেন যা এইচটিটিপিএস পোস্টের অনুরোধগুলি পরিচালনা করে। আপনি এই শেষ পয়েন্টটি নিবন্ধ করার পরে (নীচে দেখুন) গুগল সুরক্ষার ইভেন্ট টোকেন নামে শেষের পয়েন্টে ক্রিপ্টোগ্রাফিকভাবে স্বাক্ষরযুক্ত স্ট্রিং পোস্ট করা শুরু করবে। সুরক্ষা ইভেন্ট টোকেনগুলি JWT গুলিতে স্বাক্ষরিত হয় যেখানে একক সুরক্ষা সম্পর্কিত ইভেন্ট সম্পর্কিত তথ্য থাকে।

প্রতিটি সুরক্ষা ইভেন্টের টোকেনের জন্য আপনি আপনার শেষ পয়েন্টে প্রাপ্ত হন, প্রথমে টোকেনটিকে বৈধতা দিন এবং ডিকোড করুন, তারপরে আপনার পরিষেবার জন্য উপযুক্ত হিসাবে সুরক্ষা ইভেন্টটি পরিচালনা করুন। নিম্নলিখিত বিভাগগুলি এই কাজগুলি বর্ণনা করে:

1. সুরক্ষা ইভেন্ট টোকেনটি ডিকোড করুন এবং বৈধ করুন

যেহেতু সুরক্ষা ইভেন্ট টোকেনগুলি একটি নির্দিষ্ট ধরণের জেডাব্লুটিটি , আপনি ডাব্লুড করতে এবং বৈধ করতে jwt.io এ তালিকাভুক্ত যেকোন JWT গ্রন্থাগার ব্যবহার করতে পারেন। আপনি যে কোনও লাইব্রেরি ব্যবহার করুন না কেন, আপনার টোকেন বৈধকরণ কোডটি নিম্নলিখিতটি করতে হবে:

  1. গুগলের আরআইএসসি কনফিগারেশন ডকুমেন্ট থেকে ক্রস অ্যাকাউন্ট অ্যাকাউন্ট jwks_uri শনাক্তকারী ( issuer ) এবং স্বাক্ষর কী কী শংসাপত্র ইউআরআই ( jwks_uri ) পান, যা আপনি https://accounts.google.com/.well-known/risc-configuration jwks_uri / jwks_uri এ খুঁজে পেতে পারেন।
  2. আপনার পছন্দের জেডাব্লুটি লাইব্রেরি ব্যবহার করে, সুরক্ষা ইভেন্ট টোকনের শিরোনাম থেকে স্বাক্ষর কী আইডি পান ID
  3. গুগলের স্বাক্ষরকরণ কী শংসাপত্রের নথি থেকে, পূর্বের ধাপে আপনি যে কী আইডি পেয়েছিলেন তা দিয়ে সর্বজনীন কীটি পান। আপনি যে আইডিটির সন্ধান করছেন তাতে নথিতে যদি কোনও কী না থাকে তবে এটি সম্ভবত সুরক্ষা ইভেন্টের টোকেনটি অবৈধ এবং আপনার শেষ পয়েন্টটি HTTP ত্রুটি 400 ফিরিয়ে দিতে হবে।
  4. আপনার পছন্দের জেডাব্লুটি লাইব্রেরি ব্যবহার করে নিম্নলিখিতটি যাচাই করুন:
    • আপনি আগের পদক্ষেপে পাবলিক কী ব্যবহার করে সুরক্ষা ইভেন্ট টোকেন স্বাক্ষরিত হয়।
    • aud দাবিটি আপনার অ্যাপ্লিকেশনগুলির ক্লায়েন্ট আইডিগুলির মধ্যে একটি।
    • টোকেনের iss দাবিটি আরআইএসসি আবিষ্কারের নথি থেকে আপনি পেয়েছেন এমন ইস্যুকারী শনাক্তকারীর সাথে মেলে। মনে রাখবেন আপনি টোকেন এর মেয়াদ (যাচাই করার প্রয়োজন হবে না exp ) কারণ নিরাপত্তা ঘটনা টোকেন ঐতিহাসিক ঘটনা প্রতিনিধিত্ব করেন এবং যেমন মেয়াদ ফুরিয়ে যায়না।

উদাহরণ স্বরূপ:

জাভা

জাভা-জাডব্লিউটি এবং জ্বেক্স-আরএসএ-জাভা ব্যবহার :

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;
}

পাইথন

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)

যদি টোকেনটি বৈধ এবং সাফল্যের সাথে ডিকোড করা হয়ে থাকে, তবে HTTP স্থিতি 202 ফিরিয়ে দিন Then তারপরে, টোকেন দ্বারা নির্দেশিত সুরক্ষা ইভেন্টটি পরিচালনা করুন।

২. সুরক্ষা ইভেন্টগুলি পরিচালনা করুন

ডিকোড করা হলে, সুরক্ষা ইভেন্টের টোকেনটি নীচের উদাহরণের মতো দেখায়:

{
  "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"
    }
  }
}

iss এবং aud দাবিগুলি টোকেন (গুগল) এবং টোকেনের উদ্দেশ্যে প্রাপক (আপনার পরিষেবা) প্রদানকারীকে নির্দেশ করে। আপনি পূর্ববর্তী পদক্ষেপে এই দাবিগুলি যাচাই করেছেন।

jti দাবী একটি স্ট্রিং যা একটি একক সুরক্ষা ইভেন্ট চিহ্নিত করে এবং প্রবাহের জন্য অনন্য। আপনি কোন সুরক্ষা ইভেন্ট পেয়েছেন তা ট্র্যাক করতে আপনি এই সনাক্তকারীটি ব্যবহার করতে পারেন।

events দাবীতে টোকেনটি যে সুরক্ষা ইভেন্টটি উপস্থাপন করে সে সম্পর্কে তথ্য রয়েছে। এই দাবিটি একটি একটি ইভেন্ট টাইপ আইডেন্টিফায়ার থেকে একটি ম্যাপিং হয় subject দাবি, যা ব্যবহারকারী এই ইভেন্ট উদ্বেগ নির্দিষ্ট করে, এবং ইভেন্ট উপলব্ধ হতে পারে সম্পর্কে অন্য কোনও অতিরিক্ত বিশদ করে।

subject দাবিটি ব্যবহারকারীর অনন্য Google অ্যাকাউন্ট আইডি ( sub ) সহ একটি নির্দিষ্ট ব্যবহারকারীকে সনাক্ত করে। এই আইডি গুগল সাইন ইন দ্বারা উত্পাদিত আইডি টোকেনগুলিতে থাকা সনাক্তকারী হিসাবে একই। যখন subject_type দাবির হয় id_token_claims , এটি একটি অন্তর্ভুক্ত হতে পারে email ব্যবহারকারীর ইমেইল ঠিকানা দিয়ে ক্ষেত্র।

নির্দিষ্ট ব্যবহারকারীর অ্যাকাউন্টে ইভেন্টের ধরণের জন্য যথাযথ পদক্ষেপ নেওয়ার দাবিতে events তথ্য ব্যবহার করুন।

সমর্থিত ইভেন্টের ধরণ

ক্রস অ্যাকাউন্ট সুরক্ষা নিম্নলিখিত ধরণের সুরক্ষা ইভেন্টগুলিকে সমর্থন করে:

ইভেন্টের ধরণ বৈশিষ্ট্য কীভাবে প্রতিক্রিয়া জানাতে হয়
https://schemas.openid.net/secevent/risc/event-type/sessions-revoked প্রয়োজনীয় : ব্যবহারকারীদের বর্তমানে খোলা সেশনগুলি শেষ করে পুনরায় সুরক্ষিত করুন।
https://schemas.openid.net/secevent/oauth/event-type/tokens-revoked

প্রয়োজনীয় : টোকেনটি যদি গুগল সাইন-ইন করার জন্য থাকে তবে তাদের বর্তমানে খোলা সেশনগুলি সমাপ্ত করুন। অতিরিক্ত হিসাবে, আপনি একটি বিকল্প সাইন ইন পদ্ধতি সেট আপ করতে ব্যবহারকারীকে পরামর্শ দিতে চাইতে পারেন।

প্রস্তাবিত : টোকেনটি যদি অন্য গুগল এপিআইতে অ্যাক্সেসের জন্য থাকে তবে ব্যবহারকারীর যে কোনও OAuth টোকেন আপনি সংরক্ষণ করেছেন তা মুছুন।

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

প্রয়োজনীয় : যদি অ্যাকাউন্টটি অক্ষম করার কারণে hijacking , তবে ব্যবহারকারীদের বর্তমানে খোলা সেশনগুলি শেষ করে পুনরায় সুরক্ষিত করুন।

প্রস্তাবিত : যদি অ্যাকাউন্টটি অক্ষম করার কারণটি bulk-account , আপনার পরিষেবাতে ব্যবহারকারীর ক্রিয়াকলাপটি বিশ্লেষণ করুন এবং যথাযথ ফলো-আপ ক্রিয়াকলাপ নির্ধারণ করুন।

প্রস্তাবিত : যদি কোনও কারণে সরবরাহ না করা থাকে তবে ব্যবহারকারীর জন্য গুগল সাইন-ইন অক্ষম করুন এবং ব্যবহারকারীর গুগল অ্যাকাউন্টের সাথে সম্পর্কিত ইমেল ঠিকানা ব্যবহার করে অ্যাকাউন্ট পুনরুদ্ধার অক্ষম করুন (সাধারণত, তবে কোনও Gmail অ্যাকাউন্ট নয়)। ব্যবহারকারীকে একটি বিকল্প সাইন ইন পদ্ধতি অফার করুন।

https://schemas.openid.net/secevent/risc/event-type/account-enabled প্রস্তাবিত : ব্যবহারকারীর জন্য গুগল সাইন ইন পুনরায় সক্ষম করুন এবং ব্যবহারকারীর গুগল অ্যাকাউন্ট ইমেল ঠিকানা দিয়ে অ্যাকাউন্ট পুনরুদ্ধার পুনরায় সক্ষম করুন।
https://schemas.openid.net/secevent/risc/event-type/account-purged প্রস্তাবিত : ব্যবহারকারীর অ্যাকাউন্ট মুছুন বা তাদের একটি বিকল্প সাইন ইন পদ্ধতি সরবরাহ করুন।
https://schemas.openid.net/secevent/risc/event-type/account-credential-change-required প্রস্তাবিত : আপনার পরিষেবাতে সন্দেহজনক ক্রিয়াকলাপ সন্ধান করুন এবং যথাযথ পদক্ষেপ নিন।
https://schemas.openid.net/secevent/risc/event-type/verification state = state প্রস্তাবিত : লগ করুন যে একটি পরীক্ষার টোকেন প্রাপ্ত হয়েছিল।

সদৃশ এবং মিস করা ইভেন্ট

ক্রস অ্যাকাউন্ট সুরক্ষা ইভেন্টগুলি বিতরণ করার চেষ্টা করবে যা এটি বিশ্বাস করে যে বিতরণ করা হয়নি। অতএব, আপনি মাঝে মাঝে একই ইভেন্টটি একাধিকবার পেতে পারেন। যদি এটি আপনার ব্যবহারকারীদের অসুবিধার জন্য বারবার পদক্ষেপের কারণ হতে পারে তবে ইভেন্টগুলি ডি- jti করার জন্য jti দাবি (যা কোনও ইভেন্টের জন্য একটি অনন্য jti ) হিসাবে বিবেচনা করুন। গুগল ক্লাউড ডেটাফ্লো এর মতো বাহ্যিক সরঞ্জাম রয়েছে যা আপনাকে ডি-ডুপ ডেটাফ্লো কার্যকর করতে সহায়তা করতে পারে।

নোট করুন ইভেন্টগুলি সীমিত পুনরায় চেষ্টা সহ বিতরণ করা হয় তাই যদি আপনার রিসিভার একটি বর্ধিত সময়ের জন্য বন্ধ থাকে তবে আপনি স্থায়ীভাবে কিছু ইভেন্ট মিস করতে পারেন।

আপনার রিসিভার নিবন্ধন করুন

সুরক্ষা ইভেন্টগুলি পেতে শুরু করতে, আরআইএসসি এপিআই ব্যবহার করে আপনার রিসিভারের শেষ পয়েন্টটি নিবন্ধ করুন। আরআইএসসি এপিআইতে কল করার সাথে একটি অনুমোদনের টোকেন অবশ্যই থাকতে হবে।

আপনি কেবল আপনার অ্যাপ্লিকেশন ব্যবহারকারীর জন্য সুরক্ষা ইভেন্টগুলি পাবেন, সুতরাং আপনাকে নীচে বর্ণিত পদক্ষেপগুলির পূর্বশর্ত হিসাবে আপনার জিসিপি প্রকল্পে একটি OAuth সম্মতি স্ক্রিন কনফিগার করতে হবে।

1. একটি অনুমোদন টোকেন উত্পন্ন

আরআইএসসি এপিআই-এর অনুমোদনের টোকেন তৈরি করতে, নিম্নলিখিত দাবিগুলির সাথে একটি জেডাব্লুটি তৈরি করুন:

{
  "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
}

আপনার পরিষেবা অ্যাকাউন্টের ব্যক্তিগত কী ব্যবহার করে জাবডাব্লুটি স্বাক্ষর করুন, যা আপনি পরিষেবা অ্যাকাউন্ট কী তৈরি করার সময় ডাউনলোড করা জেএসএন ফাইলটিতে খুঁজে পেতে পারেন।

উদাহরণ স্বরূপ:

জাভা

জাভা jwt এবং গুগলের লেখক লাইব্রেরি ব্যবহার করে :

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;
}

পাইথন

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')

এই অনুমোদনের টোকেনটি এক ঘন্টার জন্য আরআইএসসি এপিআই কল করতে ব্যবহৃত হতে পারে। টোকেনটির মেয়াদ শেষ হয়ে গেলে, আরআইএসসি এপিআই কলগুলি চালিয়ে যেতে একটি নতুন তৈরি করুন।

2. আরআইএসসি স্ট্রিম কনফিগারেশন এপিআই কল করুন

এখন আপনার কাছে অনুমোদনের টোকেন রয়েছে, আপনি আপনার রিসিভারের শেষ পয়েন্টটি নিবন্ধকরণ সহ আপনার প্রকল্পের সুরক্ষা ইভেন্ট স্ট্রিমটি কনফিগার করতে RISC API ব্যবহার করতে পারেন।

এটি করতে, আপনার রিসিভারের শেষের অবস্থান এবং আপনার আগ্রহী সুরক্ষা ইভেন্টগুলির ধরণ উল্লেখ করে https://risc.googleapis.com/v1beta/stream:update একটি HTTPS পোস্ট অনুরোধ করুন:

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
  ]
}

উদাহরণ স্বরূপ:

জাভা

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);

পাইথন

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'])

যদি অনুরোধটি এইচটিটিপি 200 ফিরিয়ে দেয়, ইভেন্ট স্ট্রিমটি সফলভাবে কনফিগার করা হয়েছিল এবং আপনার রিসিভারের শেষ পয়েন্টটি সুরক্ষা ইভেন্ট টোকেনগুলি গ্রহণ করা শুরু করবে। পরবর্তী বিভাগে বর্ণনা করা হয়েছে যে আপনি কীভাবে আপনার স্ট্রিম কনফিগারেশন এবং টেস্ট করতে পারেন সবকিছু যা একসাথে সঠিকভাবে কাজ করছে তা যাচাই করতে এবং শেষ পয়েন্টটি পরীক্ষা করতে।

আপনার বর্তমান স্ট্রিম কনফিগারেশনটি পান এবং আপডেট করুন

ভবিষ্যতে যদি আপনি কখনও আপনার স্ট্রিম কনফিগারেশনটি সংশোধন করতে চান, তবে আপনি বর্তমান স্ট্রিম কনফিগারেশনটি পেতে, অনুমোদিত প্রতিক্রিয়াটির সংশোধন করার জন্য https://risc.googleapis.com/v1beta/stream একটি অনুমোদিত জিইটি অনুরোধ করে এটি করতে পারেন , এবং তারপরে উপরে বর্ণিত হিসাবে https://risc.googleapis.com/v1beta/stream:update এ পরিবর্তিত কনফিগারেশন পোস্ট করে।

বন্ধ করুন এবং ইভেন্ট স্ট্রিম পুনরায় শুরু করুন

যদি আপনাকে কখনও গুগল থেকে ইভেন্টের স্ট্রিম বন্ধ করতে হয়, অনুরোধের সংস্থায় ps { "status": "disabled" } with সহ https://risc.googleapis.com/v1beta/stream/status:update অনুমোদিত পোষ্ট অনুরোধ করুন। স্ট্রিমটি নিষ্ক্রিয় করা অবস্থায়, গুগল আপনার প্রান্তে ইভেন্টগুলি প্রেরণ করে না এবং যখন ঘটে তখন সুরক্ষা ইভেন্টগুলি বাফার করে না। ইভেন্ট স্ট্রিমটি পুনরায় { "status": "enabled" } করতে, একই সমাপ্তি বিন্দুতে { "status": "enabled" } O পোস্ট করুন।

৩. alচ্ছিক: আপনার স্ট্রিম কনফিগারেশন পরীক্ষা করুন

আপনি আপনার ইভেন্ট স্ট্রিমের মাধ্যমে একটি ভেরিফিকেশন টোকন প্রেরণ করে আপনার স্ট্রিম কনফিগারেশন এবং রিসিভারের শেষ পয়েন্টটি সঠিকভাবে এক সাথে কাজ করছে তা যাচাই করতে পারবেন। এই টোকনে একটি অনন্য স্ট্রিং থাকতে পারে যা আপনি টোকেনটি আপনার শেষ পয়েন্টে প্রাপ্ত হয়েছিল তা যাচাই করতে ব্যবহার করতে পারেন।

একটি যাচাইকরণ টোকেন অনুরোধ করার জন্য, https://risc.googleapis.com/v1beta/stream:verify করতে একটি অনুমোদিত HTTPS পোষ্ট অনুরোধ করুন। অনুরোধের মুখ্য অংশে, কিছু সনাক্তকারী স্ট্রিং নির্দিষ্ট করুন:

{
  "state": "ANYTHING"
}

উদাহরণ স্বরূপ:

জাভা

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);

পাইথন

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()))

যদি অনুরোধটি সফল হয়, যাচাইকরণ টোকেন আপনার নিবন্ধিত শেষ পয়েন্টে প্রেরণ করা হবে। তারপরে, উদাহরণস্বরূপ, যদি আপনার শেষ পয়েন্টটি কেবলমাত্র লগিংয়ের মাধ্যমে যাচাইকরণ টোকেনগুলি পরিচালনা করে, আপনি টোকেনটি পেয়েছেন তা নিশ্চিত করার জন্য আপনার লগগুলি পরীক্ষা করতে পারেন।

ত্রুটি কোড রেফারেন্স

নিম্নলিখিত ত্রুটিগুলি আরআইএসসি এপিআই দ্বারা ফিরিয়ে দেওয়া যেতে পারে:

ভুল সংকেত ভুল বার্তা প্রস্তাবিত কর্ম
400 স্ট্রিম কনফিগারেশনে অবশ্যই $ ক্ষেত্রের নাম ক্ষেত্র থাকতে হবে। Https://risc.googleapis.com/v1beta/stream:update শেষপয়েন্টে আপনার অনুরোধটি অবৈধ বা পার্স করা যাবে না। আপনার অনুরোধে $ FIELDNAME অন্তর্ভুক্ত করুন।
401 অননুমোদিত। অনুমোদন ব্যর্থ. নিশ্চিত হয়ে নিন যে আপনি অনুরোধের সাথে একটি অনুমোদনের টোকেন সংযুক্ত করেছেন এবং টোকেনটি বৈধ এবং মেয়াদোত্তীর্ণ হয়নি।
403 ডেলিভারি শেষ পয়েন্টটি অবশ্যই একটি HTTPS URL হওয়া উচিত। আপনার ডেলিভারি শেষ পয়েন্ট (যেমন আপনি শেষের পয়েন্টটি আশা করছেন আরআইএসসি ইভেন্টগুলি সরবরাহ করা হবে) অবশ্যই এইচটিটিপিএস হতে হবে। আমরা এইচটিটিপি ইউআরএলগুলিতে আরআইএসসি ইভেন্টগুলি প্রেরণ করি না।
403 বিদ্যমান স্ট্রিম কনফিগারেশনে আরআইএসসির জন্য নির্দিষ্টভাবে অনুপযুক্ত বিতরণ পদ্ধতি নেই। আপনার গুগল ক্লাউড প্রকল্পের অবশ্যই একটি আরআইএসসি কনফিগারেশন থাকতে হবে। আপনি যদি ফায়ারবেস ব্যবহার করছেন এবং গুগল সাইন-ইন সক্ষম করেছেন, তবে ফায়ারবেস আপনার প্রকল্পের জন্য আরআইএসসি পরিচালনা করবে; আপনি একটি কাস্টম কনফিগারেশন তৈরি করতে সক্ষম হবেন না। আপনি যদি নিজের ফায়ারবেস প্রকল্পের জন্য গুগল সাইন-ইন ব্যবহার না করে থাকেন তবে দয়া করে এটি অক্ষম করুন এবং তারপরে এক ঘন্টা পরে আবার আপডেট করার চেষ্টা করুন।
403 প্রকল্পটি পাওয়া যায়নি। আপনি সঠিক প্রকল্পের জন্য সঠিক পরিষেবা অ্যাকাউন্টটি ব্যবহার করছেন তা নিশ্চিত করুন। আপনি মুছে ফেলা প্রকল্পের সাথে সম্পর্কিত কোনও পরিষেবা অ্যাকাউন্ট ব্যবহার করছেন। কোনও প্রকল্পের সাথে সম্পর্কিত সমস্ত পরিষেবা অ্যাকাউন্টগুলি কীভাবে দেখতে হবে তা শিখুন।
403 পরিষেবা অ্যাকাউন্টে আপনার প্রকল্পে সম্পাদকের অনুমতি থাকতে হবে। আপনার প্রকল্পের গুগল ক্লাউড প্ল্যাটফর্ম কনসোলে যান এবং এই নির্দেশিকাগুলি অনুসরণ করে আপনার প্রকল্পে কলস সম্পাদক / মালিককে অনুমতি দেওয়ার জন্য পরিষেবা অ্যাকাউন্টটি মঞ্জুর করুন।
403 স্ট্রিম ম্যানেজমেন্ট এপিআইগুলিকে কেবল একটি পরিষেবা অ্যাকাউন্ট দ্বারা কল করা উচিত। আপনি কীভাবে কোনও পরিষেবা অ্যাকাউন্ট দিয়ে গুগল এপিআইগুলিতে কল করতে পারেন সে সম্পর্কে আরও তথ্য এখানে।
403 বিতরণ সমাপ্তি আপনার প্রকল্পের কোনও ডোমেনের অন্তর্ভুক্ত নয়। প্রতিটি প্রকল্পে অনুমোদিত ডোমেনগুলির একটি সেট থাকে। যদি আপনার ডেলিভারি এন্ডপয়েন্ট (যেমন আপনি যে রিসাইক ইভেন্টগুলি বিতরণ করার প্রত্যাশা করেন সেই প্রান্তটি) এর মধ্যে একটিতে হোস্ট না করা হয়, তবে আমাদের প্রয়োজন যে আপনি সেই সেটটিতে শেষ পয়েন্টের ডোমেন যুক্ত করুন।
403 এই এপিআই ব্যবহার করতে আপনার প্রকল্পের কমপক্ষে একটি OAuth ক্লায়েন্ট কনফিগার করা থাকতে হবে। আরআইএসসি কেবলমাত্র যদি আপনি এমন অ্যাপ্লিকেশন তৈরি করেন যা Google সাইন ইনকে সমর্থন করে। এই সংযোগটির জন্য একটি OAuth ক্লায়েন্ট প্রয়োজন। যদি আপনার প্রকল্পের কোনও OAuth ক্লায়েন্ট না থাকে তবে সম্ভবত এটি আরআইএসসি আপনার পক্ষে কার্যকর হবে না। আমাদের APIs এর জন্য গুগলের OAuth ব্যবহার সম্পর্কে আরও জানুন।
403

অসমর্থিত স্থিতি।

অবৈধ অবস্থা।

আমরা এই সময়ে কেবলমাত্র স্ট্রিম স্ট্যাটাসগুলিকে " enabled " এবং " disabled " সমর্থন করি।
404

প্রকল্পের কোনও আরআইএসসি কনফিগারেশন নেই।

প্রকল্পের কোনও বিদ্যমান আরআইএসসি কনফিগারেশন নেই, স্থিতি আপডেট করতে পারে না।

একটি নতুন স্ট্রিম কনফিগারেশন তৈরি করতে https://risc.googleapis.com/v1beta/stream:update শেষ বিন্দুতে কল করুন।
4 এক্সএক্স / 5 এক্সএক্স স্থিতি আপডেট করতে অক্ষম। আরও তথ্যের জন্য বিশদ ত্রুটির বার্তাটি পরীক্ষা করুন।

টোকেন স্কোপে অ্যাক্সেস করুন

আরআইএসসি এপিআইয়ের অনুমোদনের জন্য আপনার অ্যাক্সেস টোকেনগুলি ব্যবহার করার সিদ্ধান্ত নেওয়া উচিত, এগুলি আপনার অ্যাপ্লিকেশনটির জন্য অনুরোধ করা উচিত:

শেষপ্রান্ত ব্যাপ্তি
https://risc.googleapis.com/v1beta/stream/status https://www.googleapis.com/auth/risc.status.readonly OR 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 OR 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

সাহায্য দরকার?

প্রথমে আমাদের ত্রুটি কোডের রেফারেন্স বিভাগটি দেখুন। আপনার যদি এখনও প্রশ্ন থাকে তবে এটিকে # সেকেন্ডস ট্যাগ সহ স্ট্যাক ওভারফ্লোতে পোস্ট করুন।