2023-02-15 flutter pub publish發(fā)布組件 OAuth2.0授權(quán)流程

1、請求授權(quán)碼:

請求地址:

tokenEndpoint:https://accounts.google.com/o/oauth2/auth?access_type=offline' '&approval_prompt=force
回調(diào)地址:
_redirectEndpoint:http://localhost:53732

添加必要的參數(shù)鲁驶,得到完整地址:

https://accounts.google.com/o/oauth2/auth?access_type=offline &approval_prompt=force &response_type=code &client_id=818368855108-8grd2eg9tj9f38os6f1urbcvsq399u8n.apps.googleusercontent.com &redirect_uri=http://localhost:53732 &code_challenge=feEgljqpwBZROzS997ZdJaFMre_XWPZXY9tKOM1ehO4 &code_challenge_method=S256 &scope=openid+https://www.googleapis.com/auth/userinfo.email

總的來說是請求谷歌獲取授權(quán)碼钥弯。

2脆霎、在回調(diào)中,處理授權(quán)返回的響應(yīng)鹦马。請求令牌玖院。

在第一步的回調(diào)中拿到授權(quán)碼code,然后請求谷歌獲取 令牌
請求地址:
tokenEndpoint: https://accounts.google.com/o/oauth2/token
回調(diào)地址:(這一步這個回調(diào)沒啥用。难菌。)
_redirectEndpoint:http://localhost:53732

完整請求如下:

請求谷歌试溯,授權(quán)碼獲取令牌,是一個POST請求

image.png

返回的內(nèi)容為:

image.png

3郊酒、保存令牌遇绞。

拼裝成一個 credentials 對象


image.png

3、pub 源代碼分析

下面是代碼:

/// Gets the user to authorize pub as a client of pub.dev via oauth2.
///
/// Returns a Future that completes to a fully-authorized [Client].
Future<Client> _authorize() async {
  var grant = AuthorizationCodeGrant(
    _identifier, _authorizationEndpoint, tokenEndpoint,
    secret: _secret,
    // Google's OAuth2 API doesn't support basic auth.
    basicAuth: false,
    httpClient: _retryHttpClient,
  );

  // Spin up a one-shot HTTP server to receive the authorization code from the
  // Google OAuth2 server via redirect. This server will close itself as soon as
  // the code is received.
  var completer = Completer();
  var server = await bindServer('localhost', 0);
  shelf_io.serveRequests(server, (request) {
    if (request.url.path.isNotEmpty) {
      return shelf.Response.notFound('Invalid URI.');
    }

    log.message('Authorization received, processing...');
    var queryString = request.url.query;
    // Closing the server here is safe, since it will wait until the response
    // is sent to actually shut down.
    server.close();
    completer
        .complete(grant.handleAuthorizationResponse(queryToMap(queryString)));

    return shelf.Response.found('https://pub.dev/authorized');
  });

  var authUrl = grant.getAuthorizationUrl(
    Uri.parse('http://localhost:${server.port}'),
    scopes: _scopes,
  );

  log.message(
      'Pub needs your authorization to upload packages on your behalf.\n'
      'In a web browser, go to $authUrl\n'
      'Then click "Allow access".\n\n'
      'Waiting for your authorization...');

  var client = await completer.future;
  log.message('Successfully authorized.\n');
  return client;
}
  • 創(chuàng)建一個AuthorizationCodeGrant對象燎窘,該對象代表了使用OAuth2協(xié)議的授權(quán)碼授權(quán)流程摹闽。
  • 使用AuthorizationCodeGrant對象的getAuthorizationUrl方法獲取授權(quán)URL,該URL將重定向到pub.dev的授權(quán)頁面褐健,以便用戶授權(quán)Pub作為客戶端訪問pub.dev的API澜汤。
  • 啟動一個本地的HTTP服務(wù)器,并使用該URL響應(yīng)任何傳入的HTTP請求舵匾。服務(wù)器將綁定到本地地址localhost和隨機(jī)端口俊抵,以接收來自pub.dev授權(quán)服務(wù)器的響應(yīng)。
  • 在瀏覽器中打開授權(quán)URL坐梯,用戶將在pub.dev網(wǎng)站上看到授權(quán)請求徽诲。用戶需要登錄并授權(quán)Pub訪問API。
  • 授權(quán)服務(wù)器將重定向到之前啟動的本地HTTP服務(wù)器吵血,并將授權(quán)碼作為查詢參數(shù)傳遞谎替。HTTP服務(wù)器收到授權(quán)碼后,使用Completer將授權(quán)碼傳遞給Future蹋辅。
  • 使用授權(quán)碼調(diào)用AuthorizationCodeGrant對象的handleAuthorizationResponse方法來獲取訪問令牌钱贯。
  • 本地HTTP服務(wù)器響應(yīng)一個重定向,將用戶重定向回pub.dev/authorized侦另,以便用戶了解授權(quán)已成功完成喷舀。
  • 關(guān)閉本地HTTP服務(wù)器,并返回已授權(quán)的HTTP Client對象淋肾,以便Pub可以使用OAuth2訪問pub.dev API硫麻。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市樊卓,隨后出現(xiàn)的幾起案子拿愧,更是在濱河造成了極大的恐慌,老刑警劉巖碌尔,帶你破解...
    沈念sama閱讀 222,946評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浇辜,死亡現(xiàn)場離奇詭異,居然都是意外死亡唾戚,警方通過查閱死者的電腦和手機(jī)柳洋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叹坦,“玉大人熊镣,你說我怎么就攤上這事∧际椋” “怎么了绪囱?”我有些...
    開封第一講書人閱讀 169,716評論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長莹捡。 經(jīng)常有香客問我鬼吵,道長,這世上最難降的妖魔是什么篮赢? 我笑而不...
    開封第一講書人閱讀 60,222評論 1 300
  • 正文 為了忘掉前任齿椅,我火速辦了婚禮琉挖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘涣脚。我一直安慰自己粹排,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,223評論 6 398
  • 文/花漫 我一把揭開白布涩澡。 她就那樣靜靜地躺著,像睡著了一般坠敷。 火紅的嫁衣襯著肌膚如雪妙同。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,807評論 1 314
  • 那天膝迎,我揣著相機(jī)與錄音粥帚,去河邊找鬼。 笑死限次,一個胖子當(dāng)著我的面吹牛芒涡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播卖漫,決...
    沈念sama閱讀 41,235評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼费尽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了羊始?” 一聲冷哼從身側(cè)響起旱幼,我...
    開封第一講書人閱讀 40,189評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎突委,沒想到半個月后柏卤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,712評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡匀油,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,775評論 3 343
  • 正文 我和宋清朗相戀三年缘缚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敌蚜。...
    茶點(diǎn)故事閱讀 40,926評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡桥滨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出弛车,到底是詐尸還是另有隱情该园,我是刑警寧澤,帶...
    沈念sama閱讀 36,580評論 5 351
  • 正文 年R本政府宣布帅韧,位于F島的核電站里初,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏忽舟。R本人自食惡果不足惜双妨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,259評論 3 336
  • 文/蒙蒙 一淮阐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧刁品,春花似錦泣特、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至兜挨,卻和暖如春膏孟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拌汇。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評論 1 274
  • 我被黑心中介騙來泰國打工柒桑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人噪舀。 一個月前我還...
    沈念sama閱讀 49,368評論 3 379
  • 正文 我出身青樓魁淳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親与倡。 傳聞我的和親對象是個殘疾皇子界逛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,930評論 2 361

推薦閱讀更多精彩內(nèi)容