jgit_JGit身份验证说明
jgit
JGit中的身份驗(yàn)證與本地Git大致相同。 支持SSH和HTTP(S)等常用協(xié)議及其身份驗(yàn)證方法。 本文總結(jié)了如何使用JGit身份驗(yàn)證API安全地訪問遠(yuǎn)程Git存儲(chǔ)庫。
 盡管本文中的示例使用CloneCommand,但是可以將所描述的技術(shù)應(yīng)用于連接到遠(yuǎn)程存儲(chǔ)庫的所有類,例如FetchCommand,PushCommand,LsRemoteCommand等。所有這些命令都有一個(gè)公共基類-TransportCommand-提供了所討論的方法這里。 
HTTP(S)– https://example.com/repo.git
通過HTTP和HTTPS進(jìn)行身份驗(yàn)證非常簡單。 當(dāng)命令請求身份驗(yàn)證憑據(jù)時(shí),將使用CredentialsProvider的實(shí)現(xiàn)返回身份驗(yàn)證憑據(jù)。 可以通過setCredentialsProvider()指定用于特定命令的CredentialsProvider。
例如,以下代碼通過HTTPS克隆存儲(chǔ)庫,并使用用戶名和密碼進(jìn)行身份驗(yàn)證。
CloneCommand cloneCommand = Git.cloneRepository(); cloneCommand.setURI( "https://example.com/repo.git" ); cloneCommand.setCredentialsProvider( new UsernamePasswordCredentialsProvider( "user", "password" ) );UsernamePasswordCredentialsProvider是JGit隨附的CredentialsProvider的實(shí)現(xiàn),并使用給定的用戶名和密碼進(jìn)行身份驗(yàn)證。
另外,JGit(3.5版和更高版本)也可以從用戶的.netrc文件中讀取憑據(jù)。 NetRCCredentialsProvider使用文件中的第一個(gè)機(jī)器條目進(jìn)行身份驗(yàn)證。
盡管不建議通過不安全的連接發(fā)送憑據(jù),但是所描述的方法也適用于純HTTP,例如http://example.com/repo.git。
帶有公鑰的SSH – ssh://user@example.com/repo.git
JGit委托創(chuàng)建和銷毀與抽象SshSessionFactory的SSH連接。 要將公共密鑰身份驗(yàn)證用于SSH連接,必須為執(zhí)行的命令指定這樣的會(huì)話工廠。
使用setTransportConfigCallback(),可以指定TransportConfigCallback接口以攔截連接過程。 建立連接之前,將調(diào)用唯一的方法configure()。 傳遞給它一個(gè)傳輸類型的參數(shù),該參數(shù)將用于在本地和遠(yuǎn)程存儲(chǔ)庫之間復(fù)制對象。 對于每個(gè)協(xié)議,都有一個(gè)不同的Transport子類來處理該協(xié)議的各個(gè)詳細(xì)信息。
如下所示,該回調(diào)可用于在使用前立即配置Transport實(shí)例:
SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {@Overrideprotected void configure( Host host, Session session ) {// do nothing} }; CloneCommand cloneCommand = Git.cloneRepository(); cloneCommand.setURI( "ssh://user@example.com/repo.git" ); cloneCommand.setTransportConfigCallback( new TransportConfigCallback() {@Overridepublic void configure( Transport transport ) {SshTransport sshTransport = ( SshTransport )transport;sshTransport.setSshSessionFactory( sshSessionFactory );} } );JGit提供了一個(gè)抽象的JSchConfigSessionFactory,它使用JSch建立SSH連接,并要求覆蓋它的configure()。 因?yàn)樵谧詈唵蔚那闆r下沒有任何要配置的內(nèi)容,所以上面的示例只是覆蓋了使代碼編譯的方法。
JSchConfigSessionFactory大多數(shù)與本機(jī)Git使用的SSH實(shí)現(xiàn)OpenSSH兼容。 它從用戶的.ssh目錄中的默認(rèn)主機(jī)(身份,id_rsa和id_dsa)的默認(rèn)位置加載已知主機(jī)和私鑰。
如果您的私鑰文件的名稱不同或位于其他位置,則建議覆蓋createDefaultJSch()。 調(diào)用基本方法后,可以像這樣添加自定義私鑰:
@Override protected JSch createDefaultJSch( FS fs ) throws JSchException {JSch defaultJSch = super.createDefaultJSch( fs );defaultJSch.addIdentity( "/path/to/private_key" )return defaultJSch; }在此示例中,添加了來自自定義文件位置的私鑰。 如果您查看JSch JavaDoc ,將會(huì)發(fā)現(xiàn)更多重載的addIdentity()方法。
為了完整起見,我應(yīng)該提到還有一個(gè)全球會(huì)話工廠。 可以通過SshSessionFactory.get / setInstance()獲取和更改它,并且如果沒有為命令配置特定的shSessionFactory,它將用作默認(rèn)值。 但是,我建議不要使用它。 除了使編寫?yīng)毩⒌臏y試變得更加困難之外,您的控件之外可能還有一些代碼會(huì)更改全局會(huì)話工廠。
SSH和密碼– ssh://user@example.com/repo.git
與通過公用密鑰使用SSH一樣,必須指定SshSessionFactory以使用受密碼保護(hù)的SSH連接。 但是這次,會(huì)話工廠的configure()方法是有目的的。
SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {@Overrideprotected void configure( Host host, Session session ) {session.setPassword( "password" );} } );CloneCommand cloneCommand = Git.cloneRepository(); cloneCommand.setURI( "ssh://user@example.com/repo.git" ); cloneCommand.setTransportConfigCallback( new TransportConfigCallback() {@Overridepublic void configure( Transport transport ) {SshTransport sshTransport = ( SshTransport )transport;sshTransport.setSshSessionFactory( sshSessionFactory );} } );JSch會(huì)話表示與SSH服務(wù)器的連接,在第4行中,設(shè)置了當(dāng)前會(huì)話的密碼。 其余代碼與用于通過SSH與公共密鑰身份驗(yàn)證進(jìn)行連接的代碼相同。
使用哪種身份驗(yàn)證方法?
此處討論的某些身份驗(yàn)證方法也可以組合使用。 例如,在嘗試通過帶有公共密鑰的SSH連接到遠(yuǎn)程存儲(chǔ)庫時(shí)設(shè)置憑據(jù)提供者不會(huì)有任何危害。 但是,您通常希望事先知道給定的存儲(chǔ)庫URL將使用哪種傳輸。
為了確定這一點(diǎn),可以使用TransportProtocol的canHandle()方法。 如果協(xié)議可以處理給定的URL,則返回true,否則返回false。 可以從Transport.getTransportProtocols()獲得所有已注冊TransportProtocol的列表。 一旦知道了協(xié)議,就可以選擇適當(dāng)?shù)纳矸蒡?yàn)證方法。
驗(yàn)證@ GitHub
GitHub支持多種協(xié)議和身份驗(yàn)證方法,但肯定不是所有可能的組合。 例如,一個(gè)常見的錯(cuò)誤是嘗試將SSH與密碼驗(yàn)證一起使用。 但是不支持此組合-僅支持帶公鑰的SSH。
GitHub提供的協(xié)議的比較列出了支持的內(nèi)容和不支持的內(nèi)容。 總結(jié)一下,有:
- Plain Git(例如git://github.com/user/repo.git):傳輸未加密,服務(wù)器未通過驗(yàn)證。
- HTTPS(例如https://github.com/user/repo.git):實(shí)際上可在任何地方使用。 使用密碼身份驗(yàn)證進(jìn)行推送,但允許匿名獲取和克隆。
- SSH(例如ssh://git@github.com:user / repo.git):使用公鑰身份驗(yàn)證,也用于獲取和克隆。
結(jié)束JGit身份驗(yàn)證
雖然我發(fā)現(xiàn)身份驗(yàn)證功能在JGit API上散布了很多,但它們可以完成任務(wù)。 此處給出的食譜有望為您提供必要的基礎(chǔ)知識(shí),以驗(yàn)證JGit中的連接,并且隱藏API的復(fù)雜性可以視為練習(xí)干凈代碼的練習(xí)!
如果您有困難或問題,請隨時(shí)發(fā)表評論或向友好而樂于助人的JGit社區(qū)尋求幫助。
翻譯自: https://www.javacodegeeks.com/2014/12/jgit-authentication-explained.html
jgit
總結(jié)
以上是生活随笔為你收集整理的jgit_JGit身份验证说明的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 9个最佳未来主义标志以及如何在2022年
- 下一篇: 电脑接口这么多接口多的笔记本电脑
