যাচাইকরণের মাধ্যমে কোনও ব্যক্তির পরিচয় প্রতিষ্ঠা করা হয় এবং সাধারণত একে ব্যবহারকারীর সাইন-আপ বা সাইন-ইন বলা হয়। অনুমোদন হল ডেটা বা রিসোর্স অ্যাক্সেস করার অনুমতি দেওয়া বা প্রত্যাখ্যান করার প্রসেস। যেমন, আপনার অ্যাপ ব্যবহারকারীর Google Drive অ্যাক্সেস করার জন্য ব্যবহারকারীর সম্মতি চায়।
অ্যাপের প্রয়োজনীয়তার উপর ভিত্তি করে যাচাইকরণ ও অনুমোদনের কল দুটি আলাদা ও স্বতন্ত্র ফ্লো হতে হবে।
আপনার অ্যাপে এমন ফিচার থাকলে যা Google API ডেটা ব্যবহার করতে পারে, কিন্তু আপনার অ্যাপের মূল ফিচারের অংশ হিসেবে প্রয়োজন হয় না, তাহলে API ডেটা অ্যাক্সেসযোগ্য না হলে কেসগুলি সুন্দরভাবে পরিচালনা করতে আপনার অ্যাপ ডিজাইন করুন। যেমন, ব্যবহারকারী Drive অ্যাক্সেস করার অনুমতি না দিলে, আপনি সম্প্রতি সেভ করা ফাইলের তালিকা লুকাতে পারেন।
ব্যবহারকারী যখন এমন কোনও অ্যাকশন পারফর্ম করেন যার জন্য নির্দিষ্ট API অ্যাক্সেস করার প্রয়োজন হয়, শুধুমাত্র তখনই Google API অ্যাক্সেস করার জন্য প্রয়োজনীয় স্কোপের অ্যাক্সেসের অনুরোধ করা উচিত। যেমন, ব্যবহারকারী যখনই Drive-এ সেভ করুন বোতামে ট্যাপ করবেন, তখনই আপনাকে ব্যবহারকারীর Drive অ্যাক্সেস করার অনুমতি চাইতে হবে।
যাচাইকরণ থেকে অনুমোদন আলাদা করে, আপনি নতুন ব্যবহারকারীদের বিভ্রান্তি এড়াতে পারেন, বা ব্যবহারকারীদের বিভ্রান্ত করতে পারেন যে কেন তাদের নির্দিষ্ট কিছু অনুমতির জন্য জিজ্ঞাসা করা হচ্ছে।
যাচাইকরণের জন্য, আমরা ক্রেডেনশিয়াল ম্যানেজার API ব্যবহার করার সাজেশন দিই। Google-এর স্টোর করা ব্যবহারকারীর ডেটা অ্যাক্সেস করার প্রয়োজন আছে এমন অ্যাকশন অনুমোদনের জন্য, আমরা AuthorizationClient ব্যবহার করার সাজেশন দিই।
আপনার Google Cloud Console প্রোজেক্ট সেট-আপ করুন
- Cloud Console-এ আপনার প্রোজেক্ট খুলুন, অথবা আপনার কোনও প্রোজেক্ট না থাকলে একটি তৈরি করুন।
- ব্র্যান্ডিং পৃষ্ঠায়,
সব তথ্য সম্পূর্ণ ও সঠিক কিনা তা নিশ্চিত করুন।
- আপনার অ্যাপে সঠিক অ্যাপের নাম, অ্যাপের লোগো এবং অ্যাপের হোমপেজ অ্যাসাইন করা আছে কিনা তা নিশ্চিত করুন। এইসব ভ্যালু ব্যবহারকারীদের সাইন-আপ করার সময় Google-এর মাধ্যমে সাইন-ইন করুন সম্মতি স্ক্রিনে এবং থার্ড-পার্টি অ্যাপ ও পরিষেবা স্ক্রিনে দেখানো হবে।
- আপনার অ্যাপের গোপনীয়তা নীতি ও পরিষেবার শর্তাবলীর URL উল্লেখ করেছেন কিনা তা ভাল করে দেখে নিন।
- ক্লায়েন্ট পৃষ্ঠা থেকে,
আপনার অ্যাপের জন্য Android ক্লায়েন্ট আইডি আগে থেকে না থাকলে, একটি তৈরি করুন। আপনাকে
অ্যাপের প্যাকেজের নাম এবং SHA-1 স্বাক্ষর উল্লেখ করতে হবে।
- ক্লায়েন্ট পৃষ্ঠায় যান।
- ক্লায়েন্ট তৈরি করুন বিকল্পে ক্লিক করুন।
- Android অ্যাপ্লিকেশনের ধরন বেছে নিন।
- OAuth ক্লায়েন্টের জন্য একটি নাম লিখুন। ক্লায়েন্টকে শনাক্ত করার জন্য এই নাম আপনার প্রোজেক্টের ক্লায়েন্ট পৃষ্ঠায় দেখানো হয়।
- আপনার Android অ্যাপের প্যাকেজের নাম লিখুন। এই ভ্যালু আপনার
AndroidManifest.xmlফাইলের<manifest>এলিমেন্টেরpackageঅ্যাট্রিবিউটে সংজ্ঞায়িত করা আছে। - অ্যাপ ডিস্ট্রিবিউশনের SHA-1 সাইনিং সার্টিফিকেট ফিঙ্গারপ্রিন্ট লিখুন।
- আপনার অ্যাপ যদি Google Play-এর মাধ্যমে অ্যাপ সাইনিং ব্যবহার করে, তাহলে Play Console-এর অ্যাপ সাইনিং পৃষ্ঠা থেকে SHA-1 ফিঙ্গারপ্রিন্ট কপি করুন।
- আপনি নিজের কীস্টোর ও সাইনিং কী ম্যানেজ করলে, Java-র সাথে অন্তর্ভুক্ত keytool
ইউটিলিটি ব্যবহার করে মানুষের-পঠনযোগ্য ফর্ম্যাটে সার্টিফিকেটের তথ্য
প্রিন্ট করুন। keytool আউটপুটের
Certificate fingerprintsবিভাগেরSHA-1ভ্যালু কপি করুন। আরও তথ্যের জন্য Android ডকুমেন্টেশনের জন্য Google API-তে আপনার ক্লায়েন্ট যাচাই করা দেখুন। - (ঐচ্ছিক) আপনার Android অ্যাপ্লিকেশনের মালিকানা যাচাই করুন।
- ক্লায়েন্ট পৃষ্ঠা থেকে,
আগে থেকে না থাকলে, নতুন "ওয়েব অ্যাপ্লিকেশন" ক্লায়েন্ট আইডি তৈরি করুন। আপনি
আপাতত "অনুমোদিত জাভাস্ক্রিপ্ট অরিজিন" এবং "অনুমোদিত রিডাইরেক্ট URI"
ফিল্ডগুলি উপেক্ষা করতে পারেন। Google-এর যাচাইকরণ পরিষেবার সাথে যোগাযোগ করার সময় আপনার ব্যাকএন্ড সার্ভার শনাক্ত করতে
এই ক্লায়েন্ট আইডি ব্যবহার করা হবে।
- ক্লায়েন্ট পৃষ্ঠায় যান।
- ক্লায়েন্ট তৈরি করুন বিকল্পে ক্লিক করুন।
- ওয়েব অ্যাপ্লিকেশন-এর ধরন বেছে নিন।
অ্যাপের মালিকানা যাচাই করুন
অ্যাপের ছদ্মবেশ ধারণের ঝুঁকি কমাতে আপনি নিজের অ্যাপ্লিকেশনের মালিকানা যাচাই করতে পারেন।
যাচাইকরণ প্রক্রিয়া সম্পূর্ণ করতে, আপনার Google Play ডেভেলপার অ্যাকাউন্ট থাকলে সেটি ব্যবহার করতে পারেন এবং আপনার অ্যাপ Google Play Console-এ রেজিস্টার করা থাকতে হবে। যাচাইকরণ সম্পূর্ণ করতে নিম্নলিখিত প্রয়োজনীয়তা পূরণ করতে হবে:
- আপনি যে Android OAuth ক্লায়েন্টের জন্য যাচাইকরণ সম্পূর্ণ করছেন, সেটির মতো একই প্যাকেজের নাম এবং SHA-1 সাইনিং সার্টিফিকেট ফিঙ্গারপ্রিন্ট সহ Google Play Console-এ আপনার একটি রেজিস্টার করা অ্যাপ্লিকেশন থাকতে হবে।
- Google Play Console-এ অ্যাপের জন্য আপনার কাছে অ্যাডমিন অনুমতি থাকতে হবে। Google Play Console-এ অ্যাক্সেস ম্যানেজমেন্ট সম্পর্কে আরও জানুন।
Android ক্লায়েন্টের অ্যাপের মালিকানা যাচাই করুন বিভাগে, যাচাইকরণ প্রসেস সম্পূর্ণ করতে মালিকানা যাচাই করুন বোতামে ক্লিক করুন।
যাচাইকরণ সম্পূর্ণ হলে, যাচাইকরণ প্রক্রিয়া সম্পূর্ণ হওয়ার বিষয়টি কনফার্ম করার জন্য একটি বিজ্ঞপ্তি দেখানো হবে। অন্যথায়, সমস্যা সম্পর্কিত প্রম্পট দেখানো হবে।
যাচাইকরণ সম্পূর্ণ না হলে, নিম্নলিখিত ধাপগুলি অনুসরণ করুন:
- আপনি যে অ্যাপ যাচাই করছেন সেটি Google Play Console-এ রেজিস্টার করা অ্যাপ কিনা তা নিশ্চিত করুন।
- Google Play Console-এ অ্যাপের জন্য আপনার কাছে অ্যাডমিন অনুমতি আছে কিনা তা নিশ্চিত করুন।
ডিপেন্ডেন্সি ঘোষণা করা
আপনার মডিউলের build.gradle ফাইলে, Google Identity Services লাইব্রেরির লেটেস্ট ভার্সন ব্যবহার করে ডিপেন্ডেন্সি ঘোষণা করুন।
dependencies {
// ... other dependencies
implementation "com.google.android.gms:play-services-auth:22.0.0"
}
ব্যবহারকারীর অ্যাকশনের জন্য প্রয়োজনীয় অনুমতির অনুরোধ করুন
ব্যবহারকারী যখনই এমন কোনও অ্যাকশন করেন যার জন্য অতিরিক্ত স্কোপ প্রয়োজন, তখন
AuthorizationClient.authorize() কল করুন। যেমন, কোনও ব্যবহারকারী এমন কোনও অ্যাকশন পারফর্ম করলে
যার জন্য তার Drive অ্যাপ স্টোরেজে অ্যাক্সেস প্রয়োজন, তাহলে নিম্নলিখিতগুলি করুন:
Kotlin
val requestedScopes: List<Scope> = listOf(DriveScopes.DRIVE_FILE)
val authorizationRequest = AuthorizationRequest.builder()
.setRequestedScopes(requestedScopes)
.build()
Identity.getAuthorizationClient(activity)
.authorize(authorizationRequestBuilder.build())
.addOnSuccessListener { authorizationResult ->
if (authorizationResult.hasResolution()) {
val pendingIntent = authorizationResult.pendingIntent
// Access needs to be granted by the user
startAuthorizationIntent.launch(IntentSenderRequest.Builder(pendingIntent!!.intentSender).build())
} else {
// Access was previously granted, continue with user action
saveToDriveAppFolder(authorizationResult);
}
}
.addOnFailureListener { e -> Log.e(TAG, "Failed to authorize", e) }
জাভা
List<Scopes> requestedScopes = Arrays.asList(DriveScopes.DRIVE_FILE);
AuthorizationRequest authorizationRequest = AuthorizationRequest.builder()
.setRequestedScopes(requestedScopes)
.build();
Identity.getAuthorizationClient(activity)
.authorize(authorizationRequest)
.addOnSuccessListener(authorizationResult -> {
if (authorizationResult.hasResolution()) {
// Access needs to be granted by the user
startAuthorizationIntent.launch(
new IntentSenderRequest.Builder(
authorizationResult.getPendingIntent().getIntentSender()
).build()
);
} else {
// Access was previously granted, continue with user action
saveToDriveAppFolder(authorizationResult);
}
})
.addOnFailureListener(e -> Log.e(TAG, "Failed to authorize", e));
ActivityResultLauncher সংজ্ঞায়িত করার সময়, নিম্নলিখিত স্নিপেটে যেভাবে দেখানো হয়েছে সেইভাবে উত্তর ম্যানেজ করুন, যেখানে আমরা ধরে নিই যে এটি ফ্র্যাগমেন্টে করা হয়েছে। কোডটি চেক করে
যে প্রয়োজনীয় অনুমতিগুলি সফলভাবে মঞ্জুর করা হয়েছে এবং তারপরে ব্যবহারকারীর অ্যাকশন
সম্পন্ন করে।
Kotlin
private lateinit var startAuthorizationIntent: ActivityResultLauncher<IntentSenderRequest>
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?,
): View? {
// ...
startAuthorizationIntent =
registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) { activityResult ->
try {
// extract the result
val authorizationResult = Identity.getAuthorizationClient(requireContext())
.getAuthorizationResultFromIntent(activityResult.data)
// continue with user action
saveToDriveAppFolder(authorizationResult);
} catch (e: ApiException) {
// log exception
}
}
}
জাভা
private ActivityResultLauncher<IntentSenderRequest> startAuthorizationIntent;
@Override
public View onCreateView(
@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// ...
startAuthorizationIntent =
registerForActivityResult(
new ActivityResultContracts.StartIntentSenderForResult(),
activityResult -> {
try {
// extract the result
AuthorizationResult authorizationResult =
Identity.getAuthorizationClient(requireActivity())
.getAuthorizationResultFromIntent(activityResult.getData());
// continue with user action
saveToDriveAppFolder(authorizationResult);
} catch (ApiException e) {
// log exception
}
});
}
আপনি সার্ভার সাইডে Google API অ্যাক্সেস করলে, AuthorizationResult থেকে getServerAuthCode() মেথড কল করুন যাতে
একটি অথরাইজেশন কোড পান যা আপনি অ্যাক্সেস ও রিফ্রেশ টোকেন এক্সচেঞ্জ করার জন্য
আপনার ব্যাকএন্ডে পাঠান। আরও জানতে, ব্যবহারকারীর ডেটাতে চলমান অ্যাক্সেস বজায় রাখুন দেখুন।
ব্যবহারকারীর ডেটা বা রিসোর্সের অনুমতি প্রত্যাহার করা
আগে দেওয়া অ্যাক্সেস তুলে নিতে, AuthorizationClient.revokeAccess()-এ কল করুন। যেমন, ব্যবহারকারী আপনার অ্যাপ থেকে তার অ্যাকাউন্ট সরিয়ে দিলে এবং আপনার অ্যাপকে আগে
DriveScopes.DRIVE_FILE-এ অ্যাক্সেস দেওয়া হয়ে থাকলে, অ্যাক্সেস তুলে নিতে নিম্নলিখিত কোড ব্যবহার করুন:
Kotlin
val requestedScopes: MutableList<Scope> = mutableListOf(DriveScopes.DRIVE_FILE)
RevokeAccessRequest revokeAccessRequest = RevokeAccessRequest.builder()
.setAccount(account)
.setScopes(requestedScopes)
.build()
Identity.getAuthorizationClient(activity)
.revokeAccess(revokeAccessRequest)
.addOnSuccessListener { Log.i(TAG, "Successfully revoked access") }
.addOnFailureListener { e -> Log.e(TAG, "Failed to revoke access", e) }
জাভা
List<Scopes> requestedScopes = Arrays.asList(DriveScopes.DRIVE_FILE);
RevokeAccessRequest revokeAccessRequest = RevokeAccessRequest.builder()
.setAccount(account)
.setScopes(requestedScopes)
.build();
Identity.getAuthorizationClient(activity)
.revokeAccess(revokeAccessRequest)
.addOnSuccessListener(unused -> Log.i(TAG, "Successfully revoked access"))
.addOnFailureListener(e -> Log.e(TAG, "Failed to revoke access", e));
টোকেন ক্যাশে মুছুন
সার্ভার থেকে পাওয়ার পরে OAuth অ্যাক্সেস টোকেন স্থানীয়ভাবে ক্যাশে করা হয়, যা অ্যাক্সেস করার গতি বাড়ায়
এবং নেটওয়ার্ক কল কমায়। এই টোকেনগুলির মেয়াদ শেষ হয়ে গেলে, ক্যাশে থেকে এগুলি অটোমেটিক মুছে যায়, তবে অন্য কারণেও এগুলি অবৈধ হয়ে যেতে পারে।
টোকেন ব্যবহার করার সময় আপনি IllegalStateException পেলে, লোকাল ক্যাশে মুছে দিন যাতে অ্যাক্সেস টোকেনের জন্য পরবর্তী অনুমোদনের অনুরোধ OAuth সার্ভারে যায়। নিম্নলিখিত স্নিপেট লোকাল ক্যাশে থেকে
invalidAccessToken সরিয়ে দেয়:
Kotlin
Identity.getAuthorizationClient(activity)
.clearToken(ClearTokenRequest.builder().setToken(invalidAccessToken).build())
.addOnSuccessListener { Log.i(TAG, "Successfully removed the token from the cache") }
.addOnFailureListener{ e -> Log.e(TAG, "Failed to clear token", e) }
জাভা
Identity.getAuthorizationClient(activity)
.clearToken(ClearTokenRequest.builder().setToken(invalidAccessToken).build())
.addOnSuccessListener(unused -> Log.i(TAG, "Successfully removed the token from the cache"))
.addOnFailureListener(e -> Log.e(TAG, "Failed to clear the token cache", e));
অনুমোদন করার সময় ব্যবহারকারীর তথ্য পান
অনুমোদন সংক্রান্ত উত্তরে ব্যবহারকারীর অ্যাকাউন্ট সম্পর্কে কোনও তথ্য থাকে না; উত্তরে শুধু অনুরোধ করা স্কোপের জন্য টোকেন থাকে। যেমন, কোনও ব্যবহারকারীর Google Drive অ্যাক্সেস করার জন্য অ্যাক্সেস টোকেন পাওয়ার উত্তরে, ব্যবহারকারীর বেছে নেওয়া অ্যাকাউন্টের পরিচয় প্রকাশ করা হয় না, যদিও ব্যবহারকারীর ড্রাইভে ফাইল অ্যাক্সেস করার জন্য এটি ব্যবহার করা যেতে পারে। ব্যবহারকারীর নাম বা ইমেলের মতো তথ্য পেতে, আপনার কাছে নিম্নলিখিত বিকল্প আছে:
অনুমোদনের জন্য জিজ্ঞাসা করার আগে ক্রেডেনশিয়াল ম্যানেজার API ব্যবহার করে ব্যবহারকারীকে তার Google অ্যাকাউন্ট দিয়ে সাইন-ইন করুন। ক্রেডেনশিয়াল ম্যানেজার থেকে যাচাইকরণ সংক্রান্ত উত্তরে ব্যবহারকারীর তথ্য অন্তর্ভুক্ত থাকে, যেমন ইমেল আইডি এবং এটি অ্যাপের ডিফল্ট অ্যাকাউন্টকে বেছে নেওয়া অ্যাকাউন্টে সেট করে; প্রয়োজন হলে, আপনি নিজের অ্যাপে এই অ্যাকাউন্ট ট্র্যাক করতে পারবেন। পরবর্তী অনুমোদনের অনুরোধে অ্যাকাউন্টটি ডিফল্ট হিসেবে ব্যবহার করা হয় এবং অনুমোদনের ফ্লোতে অ্যাকাউন্ট বেছে নেওয়ার ধাপটি এড়িয়ে যাওয়া হয়। অনুমোদনের জন্য অন্য কোনও অ্যাকাউন্ট ব্যবহার করতে, ডিফল্ট নয় এমন অ্যাকাউন্ট থেকে অনুমোদন দেখুন।
আপনার অনুমোদনের অনুরোধে, আপনি যে স্কোপ চান (যেমন,
Drive scope) তার পাশাপাশিuserinfo,profileএবংopenidস্কোপের জন্য অনুরোধ করুন। অ্যাক্সেস টোকেন ফেরত পাওয়ার পরে, আপনার পছন্দের HTTP লাইব্রেরি ব্যবহার করে এবংGETOAuth userinfo এন্ডপয়েন্টে (https://www.googleapis.com/oauth2/v3/userinfo) HTTP অনুরোধ করে ব্যবহারকারীর তথ্য পান। এর সাথে, আপনি হেডারে যে অ্যাক্সেস টোকেন পেয়েছেন সেটিও অন্তর্ভুক্ত করুন। এটি নিম্নলিখিতcurlকমান্ডের সমতুল্য:curl -X GET \ "https://www.googleapis.com/oauth2/v1/userinfo?alt=json" \ -H "Authorization: Bearer $TOKEN"রেসপন্স হল
UserInfo, যা অনুরোধ করা স্কোপের মধ্যে সীমিত, JSON-এ ফর্ম্যাট করা।
ডিফল্ট নয় এমন অ্যাকাউন্ট থেকে অনুমোদন
আপনি যাচাইকরণের জন্য ক্রেডেনশিয়াল ম্যানেজার ব্যবহার করলে এবং
AuthorizationClient.authorize() রান করলে, আপনার অ্যাপের ডিফল্ট অ্যাকাউন্ট
ব্যবহারকারীর বেছে নেওয়া অ্যাকাউন্টে সেট করা হয়। এর অর্থ হল, অনুমোদনের জন্য পরবর্তী যেকোনও কল
এই ডিফল্ট অ্যাকাউন্ট ব্যবহার করে। অ্যাকাউন্ট বাছাইকারীকে জোর করে দেখাতে,
ক্রেডেনশিয়াল ম্যানেজার থেকে clearCredentialState() API ব্যবহার করে
অ্যাপ থেকে ব্যবহারকারীকে সাইন-আউট করুন।
ব্যবহারকারীর ডেটাতে চলমান অ্যাক্সেস বজায় রাখুন
আপনার অ্যাপ থেকে ব্যবহারকারীর ডেটা অ্যাক্সেস করতে হলে, একবার
AuthorizationClient.authorize() কল করুন; পরবর্তী সেশনে এবং
ব্যবহারকারী যতক্ষণ পর্যন্ত মঞ্জুর করা অনুমতি সরিয়ে না নিচ্ছেন, ততক্ষণ পর্যন্ত ব্যবহারকারীর সাথে কোনও
ইন্টার্যাকশন ছাড়াই আপনার উদ্দেশ্য পূরণ করার জন্য অ্যাক্সেস টোকেন পেতে একই
পদ্ধতি কল করুন। অন্যদিকে, আপনার ব্যাকএন্ড সার্ভার থেকে অফলাইন মোডে ব্যবহারকারীর ডেটা অ্যাক্সেস করতে হলে,
আপনাকে "রিফ্রেশ টোকেন" নামে অন্য ধরনের টোকেনের জন্য অনুরোধ করতে হবে।
অ্যাক্সেস টোকেন ইচ্ছাকৃতভাবে স্বল্পস্থায়ী হওয়ার জন্য ডিজাইন করা হয়েছে এবং এর মেয়াদ এক ঘণ্টা। কোনও অ্যাক্সেস টোকেন ইন্টারসেপ্ট বা কম্প্রোমাইজ করা হলে, এর সীমিত বৈধতার উইন্ডো সম্ভাব্য অপব্যবহার কম করে। মেয়াদ শেষ হয়ে যাওয়ার পরে, টোকেন অবৈধ হয়ে যায় এবং এটি ব্যবহার করার যেকোনও প্রচেষ্টা রিসোর্স সার্ভার বাতিল করে দেয়। অ্যাক্সেস টোকেন অল্প সময়ের জন্য কাজ করে বলে, ব্যবহারকারীর ডেটায় অ্যাক্সেস বজায় রাখতে সার্ভার রিফ্রেশ টোকেন ব্যবহার করে। রিফ্রেশ টোকেন হল দীর্ঘ আয়ুষ্কাল সহ টোকেন যা কোনও ক্লায়েন্ট ব্যবহারকারীর কোনও ইন্টার্যাকশন ছাড়াই, পুরনো অ্যাক্সেস টোকেনের মেয়াদ শেষ হয়ে গেলে, অথরাইজেশন সার্ভার থেকে স্বল্প আয়ুষ্কাল সহ অ্যাক্সেস টোকেনের অনুরোধ করার জন্য ব্যবহার করে।
রিফ্রেশ টোকেন পেতে, আপনাকে প্রথমে আপনার অ্যাপে অনুমোদনের ধাপ চলাকালীন "অফলাইন অ্যাক্সেস" চেয়ে একটি অথ কোড (বা অনুমোদন কোড) পেতে হবে এবং তারপরে আপনার সার্ভারে রিফ্রেশ টোকেনের জন্য অথ কোড এক্সচেঞ্জ করতে হবে। আপনার সার্ভারে দীর্ঘমেয়াদী রিফ্রেশ টোকেন নিরাপদে স্টোর করা অত্যন্ত গুরুত্বপূর্ণ কারণ নতুন অ্যাক্সেস টোকেন পাওয়ার জন্য সেগুলি বারবার ব্যবহার করা যেতে পারে। তাই, নিরাপত্তার কারণে ডিভাইসে রিফ্রেশ টোকেন স্টোর করার ব্যাপারে কঠোরভাবে নিরুৎসাহিত করা হয়। পরিবর্তে, সেগুলি অ্যাপের ব্যাকএন্ড সার্ভারে স্টোর করা উচিত যেখানে অ্যাক্সেস টোকেন এক্সচেঞ্জ করা হয়।
আপনার অ্যাপের ব্যাকএন্ড সার্ভারে অথরাইজেশন কোড পাঠানো হয়ে গেলে, আপনি অ্যাকাউন্ট অথরাইজেশন গাইড-এ উল্লেখ করা ধাপগুলি অনুসরণ করে সার্ভারে স্বল্পমেয়াদী অ্যাক্সেস টোকেন এবং দীর্ঘমেয়াদী রিফ্রেশ টোকেনের জন্য এটি এক্সচেঞ্জ করতে পারবেন। এই এক্সচেঞ্জ শুধুমাত্র আপনার অ্যাপের ব্যাকএন্ডে হওয়া উচিত।
Kotlin
// Ask for offline access during the first authorization request
val authorizationRequest = AuthorizationRequest.builder()
.setRequestedScopes(requestedScopes)
.requestOfflineAccess(serverClientId)
.build()
Identity.getAuthorizationClient(activity)
.authorize(authorizationRequest)
.addOnSuccessListener { authorizationResult ->
startAuthorizationIntent.launch(IntentSenderRequest.Builder(
pendingIntent!!.intentSender
).build())
}
.addOnFailureListener { e -> Log.e(TAG, "Failed to authorize", e) }
জাভা
// Ask for offline access during the first authorization request
AuthorizationRequest authorizationRequest = AuthorizationRequest.builder()
.setRequestedScopes(requestedScopes)
.requestOfflineAccess(serverClientId)
.build();
Identity.getAuthorizationClient(getContext())
.authorize(authorizationRequest)
.addOnSuccessListener(authorizationResult -> {
startAuthorizationIntent.launch(
new IntentSenderRequest.Builder(
authorizationResult.getPendingIntent().getIntentSender()
).build()
);
})
.addOnFailureListener(e -> Log.e(TAG, "Failed to authorize"));
নিম্নলিখিত স্নিপেট ধরে নেয় যে ফ্র্যাগমেন্ট থেকে অনুমোদন শুরু হয়েছে।
Kotlin
private lateinit var startAuthorizationIntent: ActivityResultLauncher<IntentSenderRequest>
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?,
): View? {
// ...
startAuthorizationIntent =
registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) { activityResult ->
try {
val authorizationResult = Identity.getAuthorizationClient(requireContext())
.getAuthorizationResultFromIntent(activityResult.data)
// short-lived access token
accessToken = authorizationResult.accessToken
// store the authorization code used for getting a refresh token safely to your app's backend server
val authCode: String = authorizationResult.serverAuthCode
storeAuthCodeSafely(authCode)
} catch (e: ApiException) {
// log exception
}
}
}
জাভা
private ActivityResultLauncher<IntentSenderRequest> startAuthorizationIntent;
@Override
public View onCreateView(
@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// ...
startAuthorizationIntent =
registerForActivityResult(
new ActivityResultContracts.StartIntentSenderForResult(),
activityResult -> {
try {
AuthorizationResult authorizationResult =
Identity.getAuthorizationClient(requireActivity())
.getAuthorizationResultFromIntent(activityResult.getData());
// short-lived access token
accessToken = authorizationResult.getAccessToken();
// store the authorization code used for getting a refresh token safely to your app's backend server
String authCode = authorizationResult.getServerAuthCode()
storeAuthCodeSafely(authCode);
} catch (ApiException e) {
// log exception
}
});
}