# GitHub token ও Git authentication: personal access token, Git Credential Manager, পাসওয়ার্ড ছাড়া push

URL: https://skillaria.top/bn/guides/git/github-token-git-authentication

১৩ আগস্ট ২০২১ থেকে GitHub HTTPS-এ Git কাজের জন্য অ্যাকাউন্টের পাসওয়ার্ড গ্রহণ করে না। এর বদলে লাগে GitHub token (personal access token) অথবা Git Credential Manager, যা browser-এ লগইন করায় এবং credentials নিজেই সংরক্ষণ করে। Token github.com-এ Settings → Developer settings থেকে বানানো হয়, git push বা git clone-এ পাসওয়ার্ডের জায়গায় দিতে হয়, এবং তা credential.helper সংরক্ষণ করে।

## Git কেন GitHub-এর পাসওয়ার্ড নেয় না

যদি `git push`-এ github.com-এর login ও পাসওয়ার্ড দিয়ে প্রত্যাখ্যান পান, তবে কারণ টাইপো নয়। ১৩ আগস্ট ২০২১ থেকে GitHub HTTPS-এ Git কাজের জন্য পাসওয়ার্ড দিয়ে লগইন বন্ধ করেছে। এর বদলে লাগে GitHub token (personal access token, PAT) অথবা Git Credential Manager-এর মাধ্যমে browser-এ অনুমোদন।

ত্রুটি বার্তাটি এরকম দেখায়:

```
remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/... for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/user/project.git/'
```

কারণটি সরল: অ্যাকাউন্টের পাসওয়ার্ড সম্পূর্ণ প্রবেশাধিকার দেয়, সেটি একটি repository-তে সীমাবদ্ধ করা যায় না, এবং বাতিল করাও কঠিন। অন্যদিকে token একটি কাজের জন্য তৈরি হয়, তার মেয়াদ ও অধিকারের সেট থাকে, এবং ফাঁস হলে পাসওয়ার্ড না বদলে এক মিনিটে মুছে ফেলা যায়। GitLab ও Bitbucket-ও একই পথে গেছে, তাই নিচের সব কথা সেখানেও প্রযোজ্য।

## Authorization-এর দুটি পথ: HTTPS ও SSH

Git দূরবর্তী repository-র সঙ্গে দুটি protocol-এর একটি দিয়ে কথা বলে, এবং তার ওপর নির্ভর করে আপনি কীভাবে লগইন করবেন।

| Protocol | Repository-র ঠিকানা | পরিচয় কীভাবে হয় |
| --- | --- | --- |

| HTTPS | `https://github.com/user/project.git` | Token বা Git Credential Manager (browser দিয়ে লগইন) |

| SSH | `git@github.com:user/project.git` | SSH key জোড়া: private key আপনার কাছে, public key GitHub সেটিংসে |

SSH key একবার সেট করলে Git আর লগইন বা পাসওয়ার্ড চায় না। তার বানানো ও GitHub-এ যুক্ত করার বিষয় Git সেটআপের লেখায় বিস্তারিত আছে। এখানে আমরা HTTPS নিয়ে কথা বলব, কারণ নতুন ব্যবহারকারীরা পাসওয়ার্ড চাওয়া সেখানেই সবচেয়ে বেশি দেখেন। আপনার repository কোন protocol-এ যুক্ত, তা এই কমান্ডে জানা যায়:

```
git remote -v
origin  https://github.com/user/project.git (fetch)
origin  https://github.com/user/project.git (push)
```

## GitHub token কীভাবে বানাবেন (personal access token)

Personal access token একটি দীর্ঘ এলোমেলো স্ট্রিং, যা GitHub প্রোগ্রাম দিয়ে অ্যাক্সেসের জন্য পাসওয়ার্ডের জায়গায় দেয়। Classic token `ghp_` দিয়ে শুরু হয়, fine-grained token শুরু হয় `github_pat_` দিয়ে। Token শুধু একবার দেখানো হয়, বানানোর ঠিক পরে, তাই এটি password manager-এ সংরক্ষণ করুন।

### ধাপে ধাপে

1. github.com-এ লগইন করুন, ওপরের ডানদিকে আপনার avatar-এ ক্লিক করে **Settings** খুলুন।
2. বাঁ দিকের মেনুর নিচে **Developer settings** বেছে নিন, তারপর **Personal access tokens**।
3. ধরন বেছে নিন: **Fine-grained tokens** (প্রস্তাবিত) বা **Tokens (classic)**, এবং নতুন token বানানোর বোতাম চাপুন।
4. একটি বোধগম্য নাম দিন (যেমন "laptop, office"), মেয়াদ ও অধিকার ঠিক করুন।
5. Generate বোতাম চেপে token এখনই কপি করুন।

### Fine-grained না classic

Fine-grained token নির্দিষ্ট repository ও আলাদা অধিকারে সীমাবদ্ধ থাকে। কোড নিয়ে সাধারণ কাজের জন্য repository বেছে নিন এবং repository অধিকারে **Contents: Read and write** দিন। Clone, pull ও push-এর জন্য এটুকুই যথেষ্ট। যদি কোনো private repository শুধু পড়তে চান, তবে Read-only যথেষ্ট।

Classic token আপনার সব repository-তে একসঙ্গে প্রযোজ্য। Repository-তে push-এর জন্য `repo` scope লাগে, আর `.github/workflows`-এর ফাইল বদলাতে অতিরিক্ত `workflow`। Classic সহজ, কিন্তু ঝুঁকিপূর্ণ: ফাঁস হলে পুরো অ্যাকাউন্ট খোলা পড়ে।

### মেয়াদ

GitHub কয়েকটি মেয়াদ দেয় এবং নিজের তারিখও বেছে নিতে দেয়। মেয়াদহীন token বানানো যায়, কিন্তু তা করবেন না: ভুলে যাওয়া স্থায়ী token নিরাপত্তার বড় ফাঁক। ৩০ থেকে ৯০ দিন রাখুন, এবং মেয়াদ শেষ হওয়ার আগে GitHub-এর পাঠানো ইমেইল দেখে নতুন token বানান।

## Token দিয়ে git push ও git clone

Token ব্যবহার যতটা কঠিন মনে হয় ততটা নয়: Git "Password" জিজ্ঞেস করে, আর আপনি পাসওয়ার্ডের জায়গায় token বসিয়ে দেন।

```
$ git push origin main
Username for 'https://github.com': your-login
Password for 'https://your-login@github.com':
```

Terminal-এ পাসওয়ার্ডের অক্ষর দেখা যায় না, এটি স্বাভাবিক। Token paste করে Enter চাপুন। Windows-এর Git Bash-এ paste করতে Shift+Insert বা ডান ক্লিক কাজ করে।

### Git clone with token

প্রাইভেট repository-ও এভাবেই clone হয়: `git clone` login ও token জিজ্ঞেস করবে। কোনো প্রশ্ন ছাড়া চলতে হলে (যেমন কোনো script-এ), token সরাসরি ঠিকানায় বসানো যায়:

```
git clone https://your-login:@github.com/user/project.git
```

এর অসুবিধা: ঠিকানাটি token সহ `.git/config`-এ সংরক্ষিত হয় এবং shell history-তেও যেতে পারে। Clone-এর পর ঠিকানা থেকে token সরিয়ে দিন:

```
git remote set-url origin https://github.com/user/project.git
```

CI সিস্টেমে token গোপন environment variable দিয়ে দেওয়া হয়, ফাইলে লেখা হয় না। GitHub Actions-এ বর্তমান repository-র জন্য আগে থেকেই `GITHUB_TOKEN` থাকে, তাই সেখানে আলাদা PAT প্রায়ই লাগে না।

### GitLab: token দিয়ে git clone

GitLab-এ token প্রোফাইল সেটিংসের Access tokens অংশে তৈরি হয়; কোড নিয়ে কাজের জন্য `read_repository` ও `write_repository` scope লাগে। পদ্ধতি একই: GitLab-এর username, এবং পাসওয়ার্ডের জায়গায় token।

```
git clone https://oauth2:@gitlab.com/group/project.git
```

GitLab যেকোনো personal token-এর জন্য `oauth2` নাম গ্রহণ করে; এর বদলে নিজের username-ও লেখা যায়।

### Git pull ও fetch

পাবলিক repository-র জন্য `git pull` ও `git clone` authorization ছাড়াই চলে। Login ও token শুধু প্রাইভেট repository বা `git push`-এর সময় চাওয়া হয়। কোনো পাবলিক প্রজেক্টে pull পাসওয়ার্ড চাইলে সাধারণত ঠিকানায় ভুল থাকে: GitHub অস্তিত্বহীন repository আর প্রাইভেট repository-কে একই উত্তর দেয়।

## Git Credential Manager কী

প্রতিটি push-এ token বসানো অসুবিধাজনক। এই কাজ credential helper সামলায়, একটি সহায়ক প্রোগ্রাম, যাকে Git credentials দরকার হলে ডাকে। Git তাকে server-এর ঠিকানা দেয়, আর helper নিজের ভান্ডার থেকে login ও পাসওয়ার্ড (বা token) ফেরত দেয়।

Git Credential Manager (GCM) এই helper-গুলোর মধ্যে সবচেয়ে সুবিধাজনক। এটি GitHub ও Microsoft-এর তৈরি ক্রস-প্ল্যাটফর্ম প্রোগ্রাম: প্রথম push-এ এটি লগইন উইন্ডো বা browser খোলে, আপনি GitHub-এ অনুমোদন দেন (two-factor authentication সহ), আর GCM নিজে token পেয়ে তা সিস্টেমের নিরাপদ storage-এ রাখে। এই অবস্থায় token হাতে বানানোর দরকার নেই।

GCM GitHub, GitLab, Bitbucket ও Azure DevOps সমর্থন করে। Git for Windows-এ এটি ডিফল্টভাবে ইনস্টল হয়: ইনস্টলারে credential helper বাছাইয়ের যে বিকল্প আসে, সেটিই এটি।

### credential.helper-এর ধরন

| মান | কোথায় সংরক্ষিত হয় | কখন ব্যবহার করবেন |
| --- | --- | --- |

| `manager` | Git Credential Manager: Windows Credential Manager, macOS Keychain, Linux-এ Secret Service | কাজের কম্পিউটারের জন্য প্রস্তাবিত |

| `osxkeychain` | macOS Keychain | Mac-এ Git-এর আদর্শ helper |

| `cache` | মেমোরিতে, ডিফল্ট ১৫ মিনিট | Linux সার্ভার, যেখানে token ডিস্কে রাখতে চান না |

| `store` | `~/.git-credentials`-এ সাদা টেক্সটে | শুধু বিচ্ছিন্ন মেশিনে; ফাইলে প্রবেশাধিকার থাকলে যেকেউ token পড়তে পারে |

## Windows, macOS ও Linux-এ Git authorization সেটআপ

দেখুন কোন helper আগে থেকে সেট আছে:

```
git config --show-origin --get-all credential.helper
```

### Windows

Git ইনস্টলের সময় ডিফল্ট সেটিং রাখলে GCM আগে থেকেই কাজ করে: প্রথম push-এ Git Bash, PowerShell বা VS Code-এ GitHub-এর লগইন উইন্ডো খুলবে। Helper সেট না থাকলে হাতে চালু করুন:

```
git config --global credential.helper manager
```

### macOS

Mac-এ Git সাধারণত `osxkeychain` ব্যবহার করে: একবার দেওয়া token Keychain-এ চলে যায়। Browser দিয়ে লগইন চাইলে Git Credential Manager ইনস্টল করুন (Homebrew দিয়ে: `brew install --cask git-credential-manager`), সে নিজে থেকেই সেটিংসে নিজেকে যোগ করবে।

### Linux

Linux-এ GCM আলাদাভাবে ইনস্টল হয় (.deb প্যাকেজ বা প্রজেক্টের releases থেকে archive), তারপর তাকে configure করে storage বেছে নিতে হয়:

```
git-credential-manager configure
git config --global credential.credentialStore secretservice
```

গ্রাফিক্যাল ইন্টারফেসহীন সার্ভারে সহজ উপায় হলো অস্থায়ী cache:

```
git config --global credential.helper 'cache --timeout=3600'
```

### GitHub-এর জন্য বিকল্প: gh auth login

GitHub CLI ইনস্টল থাকলে `gh auth login` browser দিয়ে লগইন করায়, এবং `gh auth setup-git` Git-কে এমনভাবে সেট করে যাতে সে credentials `gh`-এর কাছ থেকে নেয়। "Git Bash-এ লগইন" করার এটি একটি সহজ এক-কমান্ড উপায়।

## সংরক্ষিত Git পাসওয়ার্ড বা token কীভাবে রিসেট করবেন

সবচেয়ে সাধারণ পরিস্থিতি: token-এর মেয়াদ শেষ হয়েছে, বা আপনি অ্যাকাউন্ট বদলেছেন, আর Git পুরনো তথ্য পাঠাতে থাকে, ফলে `Authentication failed` আসে। সমাধান হলো সংরক্ষিত এন্ট্রি মুছে ফেলা, তখন পরের push-এ Git আবার জিজ্ঞেস করবে।

### সর্বজনীন কমান্ড

যেকোনো helper-এর সঙ্গে কাজ করে:

```
printf "protocol=https\nhost=github.com\n\n" | git credential reject
```

### Windows-এ git reset credentials

"Control Panel" → "Credential Manager" → "Windows Credentials" খুলুন, `git:https://github.com`-এর মতো এন্ট্রি খুঁজে মুছুন। কমান্ড লাইন থেকেও একই কাজ হয়:

```
cmdkey /list | findstr git
cmdkey /delete:git:https://github.com
```

GCM ব্যবহার হলে তার নিজের লগআউট কমান্ডও আছে: `git credential-manager github logout <login>`।

### macOS

"Keychain Access" খুলুন, `github.com`-এর "Internet password" এন্ট্রি খুঁজে মুছে দিন। অথবা terminal থেকে:

```
git credential-osxkeychain erase
host=github.com
protocol=https
```

শেষ লাইনের পরে আরেকবার Enter চাপুন, যাতে ফাঁকা লাইন পাঠানো হয়।

### Linux ও store

`store`-এর জন্য `~/.git-credentials` থেকে github.com-এর লাইন মুছুন, এবং `cache`-এর জন্য `git credential-cache exit` চালান।

## Authorization-এর ত্রুটি ও তার সমাধান

### Support for password authentication was removed

আপনি অ্যাকাউন্টের পাসওয়ার্ড দিয়েছেন। Token বানিয়ে Password ঘরে বসান, অথবা Git Credential Manager সেট করুন। Git পাসওয়ার্ড না চেয়েই এই ত্রুটি দেখালে বুঝবেন, পুরনো পাসওয়ার্ড কোথাও সংরক্ষিত আছে: ওপরে বলা উপায়ে মুছুন।

### git push: Authentication failed

কারণগুলো আনুমানিক এই ক্রমে আসে: token-এর মেয়াদ শেষ; token বাতিল হয়েছে; fine-grained token-এর এই repository-তে প্রবেশাধিকার নেই, বা Contents অধিকার শুধু পড়ার জন্য; সংরক্ষিত credentials অন্য অ্যাকাউন্টের। Developer settings-এ token-এর মেয়াদ ও অধিকার দেখুন, এবং সংরক্ষিত credentials রিসেট করুন।

### remote: Permission denied (403)

লগইন সফল হয়েছে, কিন্তু এই repository-তে আপনার লেখার অধিকার নেই। মালিককে আপনাকে Collaborators-এ যুক্ত করতে হবে, অথবা আপনি নিজের fork ও pull request-এর মাধ্যমে কাজ করুন।

### Repository not found

প্রাইভেট repository-র ক্ষেত্রে GitHub জানায় না যে সেটি আছে কি না, তাই ভুল token-এও "not found" আসে। `git remote -v` দিয়ে ঠিকানা এবং token-এর অধিকার যাচাই করুন।

### Git clone প্রতিবার পাসওয়ার্ড চায়

Credential helper সেট নেই। `manager` বা `osxkeychain` চালু করুন: প্রথম সফল প্রবেশের পর Git আর জিজ্ঞেস করবে না। আরেকটি উপায় হলো SSH-এ চলে যাওয়া।

## Token নিরাপদে রাখার উপায়

- ন্যূনতম অধিকার দিন: classic-এর `repo`-এর বদলে fine-grained token, যা শুধু দরকারি repository-তে থাকে।
- মেয়াদ রাখুন এবং নতুন token বানান, অনির্দিষ্টকাল বাড়িয়ে যাবেন না।
- Token commit করবেন না এবং remote-এর ঠিকানায় বসাবেন না। Token পাবলিক repository-তে পৌঁছালে GitHub তা নিজে থেকে বাতিল করতে পারে, তবু তাকে ফাঁস ধরে নিয়ে নিজেও মুছুন।
- `store`-এর বদলে সিস্টেমের storage (GCM, Keychain) ব্যবহার করুন।
- এক token, এক মেশিন বা এক কাজ: তাহলে ফাঁস হলে শুধু সেটিই বাতিল করতে হবে।

## উপসংহার

HTTPS-এ Git-এর জন্য GitHub-এর পাসওয়ার্ড ২০২১ সাল থেকে কাজ করে না। তিনটি কার্যকর পথ আছে: Git Credential Manager দিয়ে browser-এ লগইন, GitHub token বানিয়ে পাসওয়ার্ডের জায়গায় দেওয়া, অথবা SSH key-তে যাওয়া। Token Settings → Developer settings-এ বানানো হয়, credential.helper তা সংরক্ষণ করে, আর `Authentication failed` এলে সাধারণত token নতুন করে বানিয়ে পুরনো credentials মুছলেই কাজ হয়। GitHub-এর সঙ্গে যুক্ত হওয়া ও remote repository নিয়ে কাজ এই কোর্সে বাস্তবে শেখানো হয়েছে।

## FAQ

**তৈরি হওয়ার পর কি GitHub token আবার দেখা যায়?**

না, GitHub token শুধু একবার দেখায়। সেটি সংরক্ষণ না করে থাকলে পুরনোটি মুছে নতুন বানান।

**পাবলিক repository clone করতে কি token লাগে?**

না, পাবলিক repository authorization ছাড়াই clone ও git pull করা যায়; token লাগে প্রাইভেট repository ও git push-এর জন্য।

**Token-এর মেয়াদ শেষ হলে কী হবে?**

Git-এ Authentication failed আসতে শুরু করবে। নতুন token বানান (অথবা পুরনোটিতে Regenerate চাপুন), সংরক্ষিত credentials মুছুন, এবং পরের push-এ নতুন token বসান।

**GitHub token কি two-factor authentication-এর সঙ্গে কাজ করে?**

হ্যাঁ, 2FA চালু থাকলে token-এর প্রয়োজন হয়ই: এটি Git কাজের জন্য পাসওয়ার্ড ও verification code দুটোরই জায়গা নেয়। Browser-এ লগইনে Git Credential Manager 2FA নিজেই সামলায়।

**Git লগইন ও পাসওয়ার্ড কোথায় সংরক্ষণ করে?**

Git নিজে কিছু সংরক্ষণ করে না, এই কাজ করে credential helper: Windows Credential Manager, macOS Keychain, Linux-এ Secret Service, অথবা helper store হলে ~/.git-credentials ফাইল।


---
Source: Skillaria.Top (https://skillaria.top)
