ক্রস-অ্যাকাউন্ট সুরক্ষার মাধ্যমে ব্যবহারকারীর অ্যাকাউন্টগুলিকে সুরক্ষিত করুন৷

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

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

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

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

ওভারভিউ

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

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

  2. একটি ইভেন্ট রিসিভার এন্ডপয়েন্ট তৈরি করুন, যেখানে Google নিরাপত্তা ইভেন্ট টোকেন পাঠাবে। এই এন্ডপয়েন্টটি প্রাপ্ত টোকেনগুলিকে যাচাই করার জন্য দায়ী এবং তারপরে আপনি যে উপায়ে বেছে নিন নিরাপত্তা ইভেন্টগুলিতে প্রতিক্রিয়া জানাচ্ছেন।

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

পূর্বশর্ত

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

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

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

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

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

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

  3. এই নির্দেশাবলী অনুসরণ করে RISC কনফিগারেশন অ্যাডমিন ভূমিকা ( roles/riscconfigs.admin ) সহ একটি নতুন পরিষেবা অ্যাকাউন্ট তৈরি করুন।

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

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

RISC API সক্ষম করতে:

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

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

    আপনি যদি একটি সংস্থার মালিকানাধীন একটি প্রকল্পের জন্য API সক্ষম করে থাকেন তবে নিশ্চিত করুন যে আপনি আপনার সংস্থাকে RISC শর্তাবলীতে আবদ্ধ করার জন্য অনুমোদিত৷

  3. আপনি যদি RISC শর্তাবলীতে সম্মত হন তবেই সক্ষম ক্লিক করুন৷

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

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

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

1. নিরাপত্তা ইভেন্ট টোকেন ডিকোড করুন এবং যাচাই করুন

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

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

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

জাভা

java-jwt এবং jwks-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;
}

পাইথন

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 ফেরত দিন। তারপর, টোকেন দ্বারা নির্দেশিত নিরাপত্তা ইভেন্টটি পরিচালনা করুন।

2. নিরাপত্তা ঘটনা হ্যান্ডেল

ডিকোড করা হলে, একটি নিরাপত্তা ইভেন্ট টোকেন নিম্নলিখিত উদাহরণের মত দেখায়:

{
  "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 ) সহ একটি নির্দিষ্ট ব্যবহারকারীকে চিহ্নিত করে৷ এই Google অ্যাকাউন্ট আইডিটি একই শনাক্তকারী ( sub ) যা Google ( জাভাস্ক্রিপ্ট , এইচটিএমএল ) লাইব্রেরি, লিগ্যাসি Google সাইন-ইন লাইব্রেরি বা OpenID কানেক্ট দ্বারা জারি করা JWT আইডি টোকেনগুলিতে রয়েছে। যখন দাবির subject_type হয় id_token_claims , তখন এটি ব্যবহারকারীর ইমেল ঠিকানা সহ একটি email ক্ষেত্রও অন্তর্ভুক্ত করতে পারে।

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

OAuth টোকেন শনাক্তকারী

স্বতন্ত্র টোকেন সম্পর্কে OAuth ইভেন্টগুলির জন্য, টোকেন বিষয় শনাক্তকারীর প্রকারে নিম্নলিখিত ক্ষেত্রগুলি রয়েছে:

  • token_type : শুধুমাত্র refresh_token সমর্থিত।

  • token_identifier_alg : সম্ভাব্য মানগুলির জন্য নীচের টেবিলটি দেখুন।

  • token : নীচের টেবিল দেখুন।

token_identifier_alg টোকেন
prefix টোকেনের প্রথম 16টি অক্ষর।
hash_base64_sha512_sha512 SHA-512 ব্যবহার করে টোকেনের ডবল হ্যাশ।

আপনি যদি এই ইভেন্টগুলির সাথে একীভূত হন, তাহলে ইভেন্টটি প্রাপ্ত হলে দ্রুত মিল নিশ্চিত করতে এই সম্ভাব্য মানগুলির উপর ভিত্তি করে আপনার টোকেনগুলিকে সূচী করার পরামর্শ দেওয়া হয়।

সমর্থিত ইভেন্ট প্রকার

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

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

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

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

https://schemas.openid.net/secevent/oauth/event-type/token-revoked টোকেন শনাক্তকারীদের জন্য OAuth টোকেন শনাক্তকারী বিভাগ দেখুন

প্রয়োজনীয় : আপনি যদি সংশ্লিষ্ট রিফ্রেশ টোকেন সঞ্চয় করেন, তবে এটি মুছুন এবং পরের বার অ্যাক্সেস টোকেনের প্রয়োজন হলে ব্যবহারকারীকে পুনরায় সম্মতি দেওয়ার জন্য অনুরোধ করুন।

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

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

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

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

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

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

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

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

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

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

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

1. একটি অনুমোদন টোকেন তৈরি করুন৷

RISC API-এর জন্য একটি অনুমোদন টোকেন তৈরি করতে, নিম্নলিখিত দাবিগুলির সাথে একটি JWT তৈরি করুন:

{
  "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-এ সাইন ইন করুন, যা আপনি পরিষেবা অ্যাকাউন্ট কী তৈরি করার সময় ডাউনলোড করা JSON ফাইলে পাবেন।

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

জাভা

java-jwt এবং Google এর auth লাইব্রেরি ব্যবহার করে:

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

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

2. RISC স্ট্রীম কনফিগারেশন API কল করুন

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

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

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

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

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

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

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

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

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

আপনার ইভেন্ট স্ট্রীমের মাধ্যমে একটি যাচাইকরণ টোকেন পাঠিয়ে আপনি যাচাই করতে পারেন যে আপনার স্ট্রিম কনফিগারেশন এবং রিসিভার এন্ডপয়েন্ট সঠিকভাবে কাজ করছে। এই টোকেনটিতে একটি অনন্য স্ট্রিং থাকতে পারে যা আপনি আপনার শেষ পয়েন্টে টোকেনটি প্রাপ্ত হয়েছে তা যাচাই করতে ব্যবহার করতে পারেন। এই প্রবাহটি ব্যবহার করতে, আপনার রিসিভার নিবন্ধন করার সময় https://schemas.openid.net/secevent/risc/event-type/verification ইভেন্ট টাইপ-এ সদস্যতা নেওয়া নিশ্চিত করুন৷

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

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

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

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

নিম্নলিখিত ত্রুটিগুলি RISC API দ্বারা ফেরত দেওয়া যেতে পারে:

ভুল সংকেত ভুল বার্তা প্রস্তাবিত কর্ম
400 স্ট্রিম কনফিগারেশনে অবশ্যই $fieldname ক্ষেত্র থাকতে হবে। https://risc.googleapis.com/v1beta/stream:update এন্ডপয়েন্টে আপনার অনুরোধ অবৈধ বা পার্স করা যাবে না। অনুগ্রহ করে আপনার অনুরোধে $fieldname অন্তর্ভুক্ত করুন।
401 অননুমোদিত। অনুমোদন ব্যর্থ. নিশ্চিত করুন যে আপনি অনুরোধের সাথে একটি অনুমোদন টোকেন সংযুক্ত করেছেন এবং টোকেনটি বৈধ এবং মেয়াদ শেষ হয়নি।
403 ডেলিভারি এন্ডপয়েন্ট একটি HTTPS URL হতে হবে। আপনার ডেলিভারি এন্ডপয়েন্ট (অর্থাৎ আপনি যে এন্ডপয়েন্টে RISC ইভেন্ট ডেলিভার করার আশা করছেন) অবশ্যই HTTPS হতে হবে। আমরা HTTP URL-এ RISC ইভেন্ট পাঠাই না।
403 বিদ্যমান স্ট্রীম কনফিগারেশনে RISC-এর জন্য বিশেষ-সঙ্গতিপূর্ণ বিতরণ পদ্ধতি নেই। আপনার Google ক্লাউড প্রজেক্টে অবশ্যই একটি RISC কনফিগারেশন থাকতে হবে। আপনি যদি Firebase ব্যবহার করেন এবং Google সাইন-ইন সক্ষম করে থাকেন, তাহলে Firebase আপনার প্রকল্পের জন্য RISC পরিচালনা করবে; আপনি একটি কাস্টম কনফিগারেশন তৈরি করতে সক্ষম হবেন না। আপনি যদি আপনার Firebase প্রকল্পের জন্য Google সাইন-ইন ব্যবহার না করেন, তাহলে অনুগ্রহ করে এটি নিষ্ক্রিয় করুন এবং তারপর এক ঘণ্টা পর আবার আপডেট করার চেষ্টা করুন।
403 প্রকল্প খুঁজে পাওয়া যায়নি. আপনি সঠিক প্রকল্পের জন্য সঠিক পরিষেবা অ্যাকাউন্ট ব্যবহার করছেন তা নিশ্চিত করুন। আপনি একটি মুছে ফেলা প্রকল্পের সাথে যুক্ত একটি পরিষেবা অ্যাকাউন্ট ব্যবহার করতে পারেন৷ একটি প্রকল্পের সাথে যুক্ত সমস্ত পরিষেবা অ্যাকাউন্টগুলি কীভাবে দেখতে হয় তা শিখুন।
403 আপনার RISC কনফিগারেশন অ্যাক্সেস করার জন্য পরিষেবা অ্যাকাউন্টের অনুমতি প্রয়োজন আপনার প্রজেক্টের API Console এ যান এবং এই নির্দেশাবলী অনুসরণ করে আপনার প্রোজেক্টে কল করা পরিষেবা অ্যাকাউন্টে "RISC কনফিগারেশন অ্যাডমিন" ভূমিকা ( roles/riscconfigs.admin ) বরাদ্দ করুন।
403 স্ট্রিম ম্যানেজমেন্ট API শুধুমাত্র একটি পরিষেবা অ্যাকাউন্টের মাধ্যমে কল করা উচিত। আপনি কীভাবে একটি পরিষেবা অ্যাকাউন্ট দিয়ে Google API-কে কল করতে পারেন সে সম্পর্কে এখানে আরও তথ্য রয়েছে৷
403 ডেলিভারি এন্ডপয়েন্ট আপনার প্রোজেক্টের কোনো ডোমেনের অন্তর্গত নয়। প্রতিটি প্রকল্পের অনুমোদিত ডোমেনের একটি সেট আছে। যদি আপনার ডেলিভারি এন্ডপয়েন্ট (অর্থাৎ আপনি যে এন্ডপয়েন্টে RISC ইভেন্টগুলি ডেলিভার করার আশা করেন) সেগুলোর একটিতে হোস্ট করা না থাকলে, আমরা আপনাকে সেই সেটে এন্ডপয়েন্টের ডোমেন যোগ করতে চাই।
403 এই API ব্যবহার করার জন্য আপনার প্রোজেক্টে অন্তত একটি OAuth ক্লায়েন্ট কনফিগার করা আবশ্যক। আপনি Google সাইন ইন সমর্থন করে এমন একটি অ্যাপ তৈরি করলেই RISC কাজ করে৷ এই সংযোগের জন্য একটি OAuth ক্লায়েন্ট প্রয়োজন৷ যদি আপনার প্রোজেক্টের কোনো OAuth ক্লায়েন্ট না থাকে, তাহলে সম্ভবত RISC আপনার জন্য উপযোগী হবে না। আমাদের API-এর জন্য Google-এর OAuth-এর ব্যবহার সম্পর্কে আরও জানুন।
403

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

অবৈধ অবস্থা

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

প্রকল্পের কোনো RISC কনফিগারেশন নেই।

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

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

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

আপনি যদি RISC API-তে প্রমাণীকরণের জন্য অ্যাক্সেস টোকেনগুলি ব্যবহার করার সিদ্ধান্ত নেন, এইগুলি হল সেই সুযোগগুলি যা আপনার অ্যাপ্লিকেশনকে অবশ্যই অনুরোধ করতে হবে:

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

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

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