Mac 應(yīng)用接入Google 第三方登錄

Mac 應(yīng)用接入Google 第三方登錄

所有的第三方登錄,本質(zhì)上應(yīng)該都是 OAuth 授權(quán)套么。

OAuth授權(quán)共有四種方式医寿,其中最常見(jiàn)的是授權(quán)碼授權(quán)

  • Code 授權(quán)碼,先獲取 授權(quán)碼镊辕,再拿授權(quán)碼獲取 token(最常用)
  • 隱式授權(quán)-直接獲取 token
  • 帳號(hào)密碼式授權(quán)-直接獲取 token (用戶極度信任才會(huì)把帳號(hào)密碼交給你)
  • 憑證授權(quán)-直接獲取 token

而 OAuth 授權(quán),需要用戶同意授權(quán)蚁袭,我們的應(yīng)用向第三方申請(qǐng) 授權(quán)碼征懈,拿到授權(quán)碼之后,再去請(qǐng)求 accessToken揩悄,之后去第三方獲取信息卖哎,帶上這個(gè) token 即可。

而通常,第三方應(yīng)用需要知道誰(shuí)在請(qǐng)求獲取授權(quán)碼亏娜,所以我們需在第三方注冊(cè)應(yīng)用焕窝,獲取客戶端 id 和密碼,用于讓第三方確認(rèn)是誰(shuí)在請(qǐng)求照藻。

請(qǐng)求授權(quán)需要授權(quán)那些信息袜啃,這就需要 scope 來(lái)控制汗侵。

授權(quán)之后幸缕,需要跳轉(zhuǎn)回我們的應(yīng)用程序。通常使用 redirectURI 晰韵,而對(duì)于安裝在計(jì)算上的原生應(yīng)用发乔,又有好幾種方式,關(guān)于應(yīng)用自定義 Scheme 對(duì)有些授權(quán)商來(lái)說(shuō)雪猪,有著嚴(yán)格的規(guī)定栏尚,而有些則很寬松。

雖然OAuth 流程都差不多只恨,但是不同的授權(quán)服務(wù)商的實(shí)現(xiàn)不同译仗,所以還是要仔細(xì)閱讀文檔以及所使用的第三方庫(kù),還是第三方數(shù)據(jù)請(qǐng)求請(qǐng)求的API 接口官觅,用來(lái)獲取想要的信息纵菌。

我覺(jué)得Google 的第三方登錄,對(duì) Mac 本地應(yīng)用來(lái)說(shuō)休涤,難度比 iOS 和安卓 這些移動(dòng)應(yīng)用要大咱圆。當(dāng)然最簡(jiǎn)單的是網(wǎng)頁(yè)端。這個(gè)是谷歌的官網(wǎng)文檔:https://developers.google.com/identity/protocols/OAuth2

1. 去 Google 開(kāi)發(fā)平臺(tái)注冊(cè)應(yīng)用

點(diǎn)擊 注冊(cè)地址 然后再點(diǎn)擊新建功氨,新建一個(gè)項(xiàng)目

2. 創(chuàng)建憑證

選擇 客戶端 id "OAuth client ID"

創(chuàng)建的時(shí)候序苏,可能需要填寫OAuth同意屏幕,這里暫時(shí)只需要填寫應(yīng)用名稱即可捷凄。

類型選擇其他 Other

創(chuàng)建成功之后忱详,記錄下 客戶端 id 和 秘鑰。這個(gè)很重要跺涤。

3. 配置項(xiàng)目

在此踱阿,我們使用第三方庫(kù)來(lái)處理 Google 第三方登錄。

所用的第三方庫(kù)為:GTMAppAuth

使用 pod 引入項(xiàng)目 pod 'GTMAppAuth'

pod install

然后跟著第三方庫(kù)的說(shuō)明走就可以了钦铁。

例如獲取 token

        let kClientID = google["ClientID"]!
        let kClientSecret = google["ClientSecret"]!
        let redirectURI = URL(string:google["redirectURI"]!)!
        configuration = GTMAppAuthFetcherAuthorization.configurationForGoogle()
        let request = OIDAuthorizationRequest.init(configuration: configuration!, clientId: kClientID, clientSecret: kClientSecret, scopes: ["openid","profile"], redirectURL: redirectURI, responseType: "code", additionalParameters: nil)
        (NSApp.delegate as! AppDelegate).currentAuthorizationFlow = OIDAuthState.authState(byPresenting: request, callback: { (authState, error) in
            if let auth = authState {
                self.authorization = GTMAppAuthFetcherAuthorization.init(authState: auth)
                log.info("get access token :\(auth.lastTokenResponse!.accessToken!)")
                self.getUserInfo()
            }else {
                if let err = error {
                    log.error("Authorization error:\(err.localizedDescription)")
                }
                self.authorization = nil
            }
        })

注意配置好 客戶端 id 秘鑰软舌,以及是 回調(diào)URI

在我們的項(xiàng)目中使用回調(diào) URI,需要在 info 欄配置URL Schemes

而這個(gè)URL Schemes規(guī)則應(yīng)該是是Google 定好的 (我從這篇文檔中推測(cè)的牛曹,當(dāng)然也可能此第三方庫(kù)做了處理)佛点,我們不能隨意填寫。Google 返回的客戶端 id,反著寫就好了超营。

例如:客戶端 id: 279659059126-0d06hf001bm5bb9p2aj6sqjvjgp5smj2.apps.googleusercontent.com

則 scheme定義:com.googleusercontent.apps.279659059126-0d06hf001bm5bb9p2aj6sqjvjgp5smj2而真實(shí)的回調(diào) URI 也是 Google 規(guī)定好的鸳玩,scheme 之后 加上 ":/oauthredirect",注意是一個(gè)斜杠演闭,而不是兩個(gè)不跟。

跳轉(zhuǎn) URI:com.googleusercontent.apps.279659059126-0d06hf001bm5bb9p2aj6sqjvjgp5smj2:/oauthredirect

配置好之后,應(yīng)該就可以了米碰。

此外窝革,還需要在 appdelegate 中做一些處理。當(dāng)授權(quán)后跳轉(zhuǎn)到我們的應(yīng)用程序吕座,需要處理一下:

  func applicationDidFinishLaunching(_ aNotification: Notification) {
        thirdPartOpenURLHandle()
    }
func thirdPartOpenURLHandle() {
        NSAppleEventManager.shared().setEventHandler(self, andSelector: #selector(handleGetURLEvent(event:with:)), forEventClass: AEEventClass(kInternetEventClass), andEventID: AEEventID(kAEGetURL))
    }
    @objc func handleGetURLEvent(event:NSAppleEventDescriptor, with replyEvent:NSAppleEventDescriptor) {
        if let urlString = event.paramDescriptor(forKeyword: keyDirectObject)?.stringValue , let url = URL(string: urlString) {
            currentAuthorizationFlow?.resumeExternalUserAgentFlow(with: url)
        }
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末虐译,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子吴趴,更是在濱河造成了極大的恐慌漆诽,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锣枝,死亡現(xiàn)場(chǎng)離奇詭異厢拭,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)撇叁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門供鸠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人税朴,你說(shuō)我怎么就攤上這事回季。” “怎么了正林?”我有些...
    開(kāi)封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵泡一,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我觅廓,道長(zhǎng)鼻忠,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任杈绸,我火速辦了婚禮帖蔓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瞳脓。我一直安慰自己塑娇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布劫侧。 她就那樣靜靜地躺著埋酬,像睡著了一般哨啃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上写妥,一...
    開(kāi)封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天拳球,我揣著相機(jī)與錄音,去河邊找鬼珍特。 笑死祝峻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的扎筒。 我是一名探鬼主播莱找,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼砸琅!你這毒婦竟也來(lái)了宋距?” 一聲冷哼從身側(cè)響起轴踱,我...
    開(kāi)封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤症脂,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后淫僻,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體诱篷,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年雳灵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了棕所。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡悯辙,死狀恐怖琳省,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情躲撰,我是刑警寧澤针贬,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站拢蛋,受9級(jí)特大地震影響桦他,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谆棱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一快压、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧垃瞧,春花似錦蔫劣、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春鸵隧,著一層夾襖步出監(jiān)牢的瞬間绸罗,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工豆瘫, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留珊蟀,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓外驱,卻偏偏與公主長(zhǎng)得像育灸,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子昵宇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

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