顯示具有 oauth2 標籤的文章。 顯示所有文章
顯示具有 oauth2 標籤的文章。 顯示所有文章

2022年5月22日 星期日

Go 開發筆記 - 使用 golang.org/x/oauth2 與 Facebook 登入 / Google OAuth 串接

最近評估網站是否從 PHP 翻到 Golang ,研究了一下關於串接 OAuth2 相關部分。早年在串 FB 登入時,都是直接使用 Facebook PHP SDK ,雖然都知道底層還是 OAuth2 ,但不免還是擔心要串時很麻煩(主要是很懶再刻一份)。稍微研究了一下,原來有 golang.org/x/oauth2 套件可以用,裡頭有支援了各式各家的登入機制,非常方便。

接著反而開始複習起來 Facebook 登入 該怎樣處理,過程:
  • 建立一個 FB 應用程式 developers.facebook.com/apps/
  • 設定 FB 登入相關事宜,包括應用程式網域(添加 localhost)、FB 登入用戶端 OAuth 設定,如 有效的 OAuth 重新導向 URI
  • 處理相關雜事
結果處理相關雜事反而耗掉最多時間,包括:
  • FB應用程式要儲存時,還得弄個 隱私政策網址 跟 用戶資料刪除 網頁
  • FB登入相關,要求都走 https 溝通,變成要研究 golang gin 如何跑 https web server 出來、憑證該怎樣產生等
  • 寫完程式後,體驗流程後,想弄個 github 筆記一下且降低程式碼變動,開始規劃如何靠 YAML 檔案來抽換設定檔
大概就是如此,花了不少時間。最後的效果純粹驗證支援 FB 登入是可行的,收工 XD

2019年6月18日 星期二

Google API 筆記 - 使用 Google OAuth 2.0 與 IdToken 和 People API 取得 Email address

大概在 2015 年開發的 Google OAuth2 登入流程 已經需要更新了。當初一直靠 Google Plus API 取得用戶的 Email (GMail) 資訊,結果 Google+ APIs 已經在 2019/03/07 領便當了
https://developers.google.com/+/integrations-shutdown
停用 Google+ 整合服務
2019 年 3 月 7 日起,所有網站上與行動應用程式中的 Google+ 整合功能將全部停止運作。詳細情形如下:
網路整合 (例如外掛程式與互動訊息) 將停止提供服務。如果網站擁有者未採取任何行動,網站的版面配置和/或功能可能會受到影響。
行動應用程式整合 (例如 +1 按鈕、分享到 Google+ 與應用程式活動) 將停止運作。
我們將從 1 月下旬起逐漸停用相關功能。最早從 2019 年 1 月 29 日起,網站與行動應用程式整合功能會偶爾發生失敗的情形。
我們強烈建議開發人員儘快從其網站上和/或行動應用程式中移除相關程式碼。我們也將陸續停用 Google+ API 和 Google+ 登入功能。詳情請參閱這份額外
通知。
雖然我們即將停用 Google+ 一般使用者版本,但我們同時致力為企業機構 提供 Google+ 服務。Google+ 即將換上全新風貌並加入新功能,如需詳細資訊, 請參閱這篇網誌文章
原先是靠這 Google Plus API 取得 Email address:

<?php
$profile_ret = @json_decode(file_get_contents('https://www.googleapis.com/plus/v1/people/me?'.http_build_query( array(
'access_token' => $access_token,
))), true);


現在就改靠 People API:https://developers.google.com/people/api/rest/v1/people/get

<?php
$profile_ret =  @json_decode(file_get_contents('https://people.googleapis.com/v1/people/me?'.http_build_query( array(
'personFields' => 'names,nicknames,emailAddresses,coverPhotos,photos',
'access_token' => $access_token,
))), true);


在 2019 年 06 月,這隻 Google Plus api : https://www.googleapis.com/plus/v1/people/me 仍正常工作著,說不定它就真的是一直從 People API 服務著。

除此之外,原先 Google OAuth2 已經推薦改用 IdToken 進行認證,若是走 IdToken 時,可以在當下就拿到 Email Address 了:

<?php

require_once 'vendor/autoload.php';

$client = new Google_Client();
$client->setClientId($oauth_project_client_id);
$client->setClientSecret($oauth_project_secret_key);
$client->setAccessType("offline");
$client->addScope(['email','profile']);
$client->setRedirectUri($oauth_callback_url);

$token = $client->fetchAccessTokenWithAuthCode($code);
$token_data = $client->verifyIdToken();

$uid = $token_data['sub'];
$email = isset($token_data['email_verified']) && $token_data['email_verified'] ?$token_data['email'] : NULL;


如此就搞定取得用戶 Email address 的項目了!

其他筆記:

$ curl -s 'https://people.googleapis.com/v1/people/me?personFields=names%2Cnicknames%2CemailAddresses%2CcoverPhotos&access_token=USER_ACCESS_TOKEN'
{
  "resourceName": "people/UID",
  "etag": "XXXXXXXXXXXX",
  "names": [
    {
      "metadata": {
        "primary": true,
        "source": {
          "type": "PROFILE",
          "id": "UID"
        }
      },
      "displayName": "NICKNAME",
      "familyName": "LAST_NAME",
      "givenName": "FIRST_NAME",
      "displayNameLastFirst": "LAST_NAME, FIRST_NAME"
    }
  ],
  "coverPhotos": [
    {
      "metadata": {
        "primary": true,
        "source": {
          "type": "PROFILE",
          "id": "UID"
        }
      },
      "url": "https://XXX.googleusercontent.com/cXXXXXXX",
      "default": true
    }
  ],
  "emailAddresses": [
    {
      "metadata": {
        "primary": true,
        "verified": true,
        "source": {
          "type": "ACCOUNT",
          "id": "UID"
        }
      },
      "value": "USER_EMAIL@gmail.com"
    }
  ]
}