LoginSignup
3
0

More than 1 year has passed since last update.

WindowsでGitの認証情報をcredential.namespaceと資格情報で管理し認可重複に耐える

Last updated at Posted at 2021-11-24

TL;DR

Windowsで複数のGit Reposを扱うときはsshでトンネルたくさん掘るんじゃなくてnamespace(credential.namespace)使ってHTTPSでやったほうがいいよ。

はじめに

お仕事でAアカウントのAWS CodeCommit、BアカウントのAWS CodeCommit、Azure DevOps、Github…といった具合にGit Reposが(悲しいことに、認証認可単位ごと)どんどこ増えて行くわけですが、みなさんも経験お有りじゃないでしょうか。
メンバーが「HTTPS接続のトークンだとWindowsだとリポジトリが上書きになっちゃうのでsshキー登録してます」「諦めてこのプロジェクトではMac使ってます」みたいなことになってきたので、改めてcredential helperとnamespaceについて整理することにしました。

この記事は何をしようとしているのか

異なる認可体系のGit Reposの認証認可状態について、PATをWindowsの資格情報マネージャを使って管理し、再認証不要にします。
この方法では、個別に設定するnamespaceでreposと認可情報を識別するので、reposのURLが被ってるのにアカウントが違うので覚えさせようとすると認証・認可状態が重複する、というようなケースに対応できるはず。(CodeCommitのとあるreposはIAM Aで、別のreposはIAM Bでのみアクセスできる、みたいな場合を想定。)

準備

まず、Gitクライアントが古い場合はアップデートしちゃいましょう。一昔まえまではWindowsのGit認可管理はwincredっていうcredential helperでやってたのですが、これがちょい前くらいにmanager(Git Credential Manager for Windows)に取って代わられており、さらに最近managerはmanager-core(Git Credential Manager またはGCM Core)に取って代わられています。

手っ取り早いのは、最新のGit for Windowsを用意し、インストーラーを注意深く見守ることです。

準備ができていると、credential.helperにmanager-coreが設定されているはず。

PS E:\hoge> git config --get credential.helper
manager-core

手元の環境ではすでにここで書いたことを設定済なので、初めてやる方は以下のコマンドの結果が変わってくるかもしれませんが、credential.<scheme>://<fqdn>.usehttppath trueになってるところが使いたいreposのURLに合ってないと駄目かもしれません。

PS E:\hoge> git config --get-regexp credential.+
credential.helper manager-core
credential.https://dev.azure.com.usehttppath true

設定例

Azure DevOps (dev.azure.comドメインでアクセス時)

VSTS時代からのユーザはtest.visualstudio.comみたいになってるかもしれないのでその場合はアドレス直してください。
reposのURLは以下と仮定します。

https://{user-name}@dev.azure.com/{org-name}/{prj-name}/_git/{repos-name}

汎用資格情報の登録(ADO)

以下のように登録します。以下アドレス項目の、ado-test-gitが今回指定するgitのcredential namespaceです。
ユーザ名のPersonalAccessTokenはAzure DevOpsの場合決め打ちです。
※間違えてWindows資格情報を登録しようとするとうまくいかないので注意。

  • インターネットまたはネットワークのアドレス:
    • ado-test-git:https://{user-name}@dev.azure.com/{org-name}
  • ユーザ名:
    • PersonalAccessToken
  • パスワード:
    • Azure DevOpsで払い出したPAT

git clone(ADO)

Cloneするときにnamespaceを指定します。

git clone https://{user-name}@dev.azure.com/{org-name}/{prj-name}/_git/{repos-name} `
  -c credential.namespace=ado-test-git
# -c credential.namespaceのところ、"="でつなぎ忘れないように。ぼくは10回はやった。

認証を問われることなくcloneできてればOK。

確認

cmdkeyで資格情報の登録状況確認します。

PS E:\hoge> cmdkey /list:ado*

結果(なんか一個増えてるな。。)

ado* のために現在保存されている資格情報:

    ターゲット: ado-test-git:https://dev.azure.com/XXXX
    種類: 汎用
    ユーザー: PersonalAccessToken
    ローカル コンピューターの常設

    ターゲット: ado-test-git:https://XXXX@dev.azure.com/XXXX
    種類: 汎用
    ユーザー: PersonalAccessToken

ついでに、ローカルにできたreposの状態を確認します。

PS E:\hoge> Set-Location .\{prj-name}\
PS E:\hoge\{prj-name}> git config --local --get-regex cred*

結果(localのgit configのnamespaceが指定した内容になっている)

credential.namespace ado-test-git

GitHub

汎用資格情報の登録とgit cloneまで書きます。確認はADOと同じなので省略。

汎用資格情報の登録(GitHub)

Azure DevOpsと同様に汎用資格情報を登録していきます。今回のcredential namespaceはgithub-gitとしました。

  • インターネットまたはネットワークのアドレス:
  • ユーザー名:
    • GitHubで登録していてログインに使ってるメールアドレス(ユーザー名でもいけるかも)
  • パスワード:
    • GitHubで払い出したPAT

ちなみに、PATを払い出す場所がわかりにくいですが、以下にあります。

  • Settings (右上のアイコンのところのメニュー項目にある)
    • <> Developper settingメニュー
      • Personal access tokensメニュー

git clone(GitHub)

Cloneするときにcredential namespaceを指定します。

# -c はkeyとvalueを"="でつなぐ。大事なことなので2回言いました
git clone https://github.com/{user-name}/{prj-name}.git `
  -c credential.namespace=github-git

認証を問われることなくcloneできてればOK。

AWS CodeCommit

気持ちが高ぶったら書く

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0