Google Oauth2 API 取得認證碼程式片段

Google Oauth2 API 取得認證碼程式片段,google其實有提供client library,所以其實可以直接使用library來完成下面的工作。

這程式片段是Installed Applications的認證過程,其他狀況會有些微差異,不詳述。

簡單說一下Installed Applications認證的過程:

跟Oauth伺服器請求特定權限

=>google詢問使用者是否願意開放此權限給應用程式

=>使用者同意

=>google傳回存取碼

=>利用純取碼向OAuth伺服器請求授權碼

=>伺服器傳回授權碼

=>應用程式利用授權碼請求API(執行API指令)

HtmlAgilityPack 是用來解析HTML檔的類別,需要上網另行安裝。

這個範例是用來取得blogger存取權限的認授權碼,所以在取得存取碼的網址中,scope的值是Blogger權限。

下面網址可以用來取得各種google API權限:

https://developers.google.com/identity/

protocols/googlescopes#analyticsv3

注意一點,請求認證的網址是https://開頭的。

由於Installed Applications不會設定redirect_uri的值,所以我們使用預設的3種中的一種urn:ietf:wg:oauth:2.0:oob。

client_id 是妳應用程式當初申請憑證的client_id。

當按下按鈕時會進入使用者同意的畫面

 

程式碼:

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
    doc.LoadHtml(webBrowser1.DocumentText);
    HtmlNodeCollection _tempNode = doc.DocumentNode.SelectNodes( "//input[contains(@id,'code')]");
    if (_tempNode != null)
    {
        HtmlAttribute _temphac = _tempNode[0].Attributes["value"];
        _accessCode = _temphac.Value;
        webBrowser1.DocumentText = "已取得授權碼 請繼續使用!!";
    }
    if (_accessCode != "")
    {
        WebRequest request = WebRequest.Create( "https://www.googleapis.com/oauth2/v4/token");
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        string postData = "code=" + WebUtility.UrlEncode(_accessCode)
          + "&redirect_uri="+ WebUtility.UrlEncode("urn:ietf:wg:oauth:2.0:oob")
          + "&client_id=" + _client_id
          + "&client_secret=" + _client_secret
          + "&grant_type=authorization_code";

        byte[] byteArray = Encoding.UTF8.GetBytes(postData);
        request.ContentLength = byteArray.Length;
        Stream dataStream = request.GetRequestStream();
        dataStream.Write(byteArray, 0, byteArray.Length);
        dataStream.Close();
        WebResponse response = request.GetResponse();
        dataStream = response.GetResponseStream();
        StreamReader reader = new StreamReader(dataStream);
        string responseFromServer = reader.ReadToEnd();
        reader.Close();
        dataStream.Close();
        response.Close();
        dynamic stuff = JsonConvert.DeserializeObject(responseFromServer);
         _access_token = stuff.access_token;
         _refresh_token = stuff.refresh_token;
         string _pause = "";
    }
}

private void button2_Click(object sender, EventArgs e)
{
   webBrowser1.Navigate( "https://accounts.google.com/o/oauth2/v2/auth?"
+"scope=https%3A%2F%2Fwww.googleapis.com%2Fauth"
+"%2Fblogger"
+"&redirect_uri=urn:ietf:wg:oauth:2.0:oob"
+&response_type=code&client_id="+ _client_id); }

 
 

  按個讚!~支持本站!~

FB推薦載入中