成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

詳解 Github App 的玩法

LoftySoul / 2107人閱讀

摘要:之前在使用搭建博客平臺的時候,研究過一番如何取得授權(quán)并調(diào)用的辦法。后來經(jīng)過研究,總算找到了這種更為優(yōu)雅的辦法。網(wǎng)站通過上的授權(quán)碼往取回。要完成上述的流程,首先必須先注冊一個。此時通過授權(quán)的倉庫都可以被用戶通過進(jìn)行讀寫操作了。

之前在使用 Github issues 搭建博客平臺的時候,研究過一番如何取得 Github 授權(quán)并調(diào)用 API 的辦法。后來選擇了較簡單的賬號密碼和 Token 的方法。但是有讀者反饋這樣的操作依然稍顯麻煩,且在第三方的頁面輸入賬號密碼總感覺不安全。后來經(jīng)過研究,總算找到了 Github App 這種更為優(yōu)雅的辦法。

什么是 Github App

要回答這個問題,可以直接套用官方文檔的說法:

GitHub Apps are first-class actors within GitHub. A GitHub App acts on its own behalf, taking actions via the API directly using its own identity, which means you don"t need to maintain a bot or service account as a separate user.

簡單翻譯一下,就是 Github App 可以通過 Github 提供的認(rèn)證信息去調(diào)用 Github API。

細(xì)心的讀者會發(fā)現(xiàn),Github 還提供了一個叫做“OAuth App”的東西,它的使用方式和 Github App 非常類似,最大的不同點是 OAuth App 所獲取的權(quán)限都是固定只讀的,用戶只能讀取固定的數(shù)據(jù)而不能修改數(shù)據(jù);而 Github App 幾乎可以獲取Github提供的所有功能權(quán)限,且所獲取的權(quán)限可以被設(shè)定為“只讀”,“可讀可寫”和“禁止訪問”,對于權(quán)限的授權(quán)粒度會更細(xì)。

獲取了對某些操作的權(quán)限之后,我們就可以使用這些權(quán)限去搭建一個獨立的 App,比如一個第三方的 Github 客戶端等等,這也是 Github App 的實用之處。

第三方登錄的原理

前文提到,Github App 可以免去用戶在第三方頁面輸入賬號密碼或者 Token 的操作而完成授權(quán),那么它是怎么做到的呢?其實說白了,它也是一種 OAuth 登錄的方式,只不過把獲取 Token 的方式從“用戶輸入”變成“由 Github 提供”。

下面介紹這種登錄方式的流程:

A 網(wǎng)站跳轉(zhuǎn)到 Github 的授權(quán)頁面。

Github 授權(quán)頁面詢問用戶:“是否允許A網(wǎng)站獲取下列權(quán)限”,用戶點擊“允許”,取得授權(quán)碼。

Github 授權(quán)頁面重定向回 A 網(wǎng)站,同時在URL 上帶上授權(quán)碼。

A 網(wǎng)站通過 URL 上的授權(quán)碼往 Github 取回 Token。

A 網(wǎng)站使用這個 Token 去調(diào)用 Github API。

要完成上述的流程,首先必須先注冊一個 Github App。

注冊 Github App

進(jìn)入 Github主頁,點擊用戶頭像,找到 Setting/Developer settings/Github Apps,然后點擊“New Github App”,即可進(jìn)入編輯界面:

依次填入名稱(此處為 SOMEONE:BLOG )、描述、主頁 URL 以后,關(guān)鍵要在User authorization callback URL填入獲取授權(quán)后的回調(diào)地址,然后在Permissions里面設(shè)置一些需要用到的 API 讀寫能力。如果你希望這個 APP 只能自己用,那么使用默認(rèn)的Only on this account,否則就選擇Any account,最后點擊Create Github App即可。

操作成功后,就可以看到這個 APP 的信息了:

其中的 Client ID 和 Client secret 就是這個應(yīng)用的身份識別碼,需要記下來。

Github App 注冊完畢,接下來就需要第三方網(wǎng)站使用這個 APP 的 Client ID 去找 Github 要授權(quán)碼了。

獲取授權(quán)碼

第三方網(wǎng)站要獲取授權(quán)碼,只需要讓頁面跳轉(zhuǎn)到 Github 授權(quán)頁即可,其中需要在 URL 中攜帶兩個參數(shù),分別是 Client ID 和 Redirect URL。

const CLIENT_ID = "app 的 client id"
const REDIRECT_URL = "app 的 redirect_url"

location.href = `https://github.com/login/oauth/authorize?` + 
`client_id=${CLIENT_ID}&redirect_uri=${REDIRECT_URL}`

跳轉(zhuǎn)后,Github 會詢問用戶是否允許這個 APP 獲取某些權(quán)限:

用戶確定后,會帶著授權(quán)碼重定向到給定的回調(diào)地址:

這時候,第三方頁面(這里是 localhost:8080)已經(jīng)拿到了授權(quán)碼,接下來就需要憑借這個授權(quán)碼以及 APP 的 Client ID 和 Client secret 去兌換 Token 了。

兌換 Token

兌換 Token 的代碼如下:

router.post("/oauth", async function (ctx, next) {
  const { clientID = CLIENT_ID, clientSecret = CLIENT_SECRET, code } = ctx.request.body
  const { status, data } = await axios({
    method: "post",
    url: "http://github.com/login/oauth/access_token?" +
    `client_id=${clientID}&` +
    `client_secret=${clientSecret}&` +
    `code=${code}`,
    headers: {
      accept: "application/json"
    }
  }).catch(e => e.response)
  ctx.body = { status, data }
})

由于跨域限制,所以這部分的代碼必須通過服務(wù)端實現(xiàn),換句話說,A 網(wǎng)站拿到授權(quán)碼以后,需要發(fā)往這個服務(wù)端,由服務(wù)端獲取 Token 后再重新返回給 A 網(wǎng)站。

A 網(wǎng)站拿到服務(wù)端返回的 Token 以后,就可以通過設(shè)置 Header 的方式在調(diào)用 Github API 的時候使用了:

"Authorization": `Bearer ${Token}`

到目前為止,基本已經(jīng) OK 了,但還有一個很大的問題,就是目前的 Token 所拿到的數(shù)據(jù)都是“只讀”的,并不能對某個 Github 倉庫進(jìn)行任何提交或修改的操作——這是因為此 Github APP 還未被倉庫所安裝,這也是和 OAuth APP 最大的不同。

安裝 Github APP

以我的博客平臺 jrainlau.github.io 為例,如果希望用戶能夠通過 API 對某條 issue 發(fā)起評論等操做,我需要在這個倉庫里安裝我的 Github APP:

進(jìn)入 Github APP 編輯頁 Setting/Developer settings/Github Apps/SOMEONE:BLOG,找到左側(cè)的 Install App,然后選擇你的賬戶去安裝:

你可以選擇賬戶下的所有倉庫或者僅某個倉庫去使用這個 APP。點擊授權(quán)以后,Github APP 安裝完畢。此時通過授權(quán)的倉庫都可以被用戶通過 API 進(jìn)行讀寫操作了。

在博客平臺里,通過這個 APP 評論的用戶,其外觀上的體現(xiàn)也會標(biāo)注來自 Github APP:

參考資料

GitHub OAuth 第三方登錄示例教程 ——阮一峰

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/104270.html

相關(guān)文章

  • 游戲開發(fā)

    摘要:工欲善其事必先利其器游戲環(huán)境對比發(fā)表算法在游戲上超過人類之后,游戲研究迅速成為了研究熱點。當(dāng)然這不是網(wǎng)絡(luò)游戲服務(wù)器架構(gòu)概述一架構(gòu)模型現(xiàn)代電子游戲,基本上都會使用一定的網(wǎng)絡(luò)功能。 每個程序員都需要知道一些游戲網(wǎng)絡(luò)知識 本文主要針對游戲的網(wǎng)絡(luò)設(shè)計,在文章中目前主流的網(wǎng)絡(luò)游戲?qū)崿F(xiàn)方案都有講解。從Peer-to-Peer 幀同步,客戶端/服務(wù)器(c/s架構(gòu)),客戶端預(yù)測(Client-Side...

    Enlightenment 評論0 收藏0
  • 小程序·云開發(fā)云函數(shù)路由高級玩法

    摘要:甚至如果你的小程序的后臺邏輯不復(fù)雜,請求量不是特別大,完全可以在云函數(shù)里面做一個單一的微服務(wù),根據(jù)路由來處理任務(wù)。介紹及用法為了方便大家試用,咱們騰訊云團(tuán)隊開發(fā)了,云函數(shù)路由管理庫方便大家使用。 李成熙,騰訊云高級工程師。2014年度畢業(yè)加入騰訊AlloyTeam,先后負(fù)責(zé)過QQ群、花樣直播、騰訊文檔等項目。2018年加入騰訊云云開發(fā)團(tuán)隊。專注于性能優(yōu)化、工程化和小程序服務(wù)。微博 | ...

    ASCH 評論0 收藏0
  • 阿里云前端周刊 - 第 32 期

    摘要:有贊全鏈路壓測方案設(shè)計與實施詳解有贊在雙十一之前完成了全鏈路壓測方案,并把它用于大促的擴(kuò)容和容量驗證,取得錯的成果。實現(xiàn)外部系統(tǒng)與蘇寧的完美對接,使業(yè)務(wù)的處理更加高效便捷。 推薦 1. Preact:一個備胎的自我修養(yǎng) https://zhuanlan.zhihu.com/p/... 前一段時間由于React Licence的問題,團(tuán)隊內(nèi)部積極的探索React的替代方案,同時考慮到之后...

    LuDongWei 評論0 收藏0

發(fā)表評論

0條評論

LoftySoul

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<