How to use Google Contacts API via Oauth2 authentication

后端 未结 2 915
失恋的感觉
失恋的感觉 2021-01-01 05:02

I have this below code to get calendar entries using the google Calendar API (https://developers.google.com/google-apps/calendar/) which uses OAuth2. It works well.

相关标签:
2条回答
  • 2021-01-01 05:09

    I ended up doing this by fetching the access code by having a browser control read the Document title value when the user selects the google account and grants access.

    eg:

    To Generate URL

    RedirectURI = "urn:ietf:wg:oauth:2.0:oob"
    
    OAuth2Parameters parameters = new OAuth2Parameters()
    {
        ClientId = clientId,
        ClientSecret = clientSecret,
        RedirectUri = redirectUri,
        Scope = requiredScope
    };
    
    
    // Request authorization from the user (by opening a browser window):
    string url = OAuthUtil.CreateOAuth2AuthorizationUrl(parameters);
    var loginUri = new Uri(url);
    
    // This form has browser control
    GoogleLoginForm form = new GoogleLoginForm(loginUri, redirectUri);
    var dr = form.ShowDialog();
    
    if (dr == System.Windows.Forms.DialogResult.OK)
    {
        parameters.AccessCode = form.OAuthVerifierToken;
    }
    

    Then In GoogleLoginForm : We have a browser control and registered browserControl_Navigated event and the do the below. The DocumentTitle contains the AccessCode which is used to generate the token.

    private void GoogleLoginForm_Load(object sender, EventArgs e)
    {
       wbGoogleLogin.Url = _loginUri;
    }
    
    private void wbGoogleLogin_Navigated(object sender, WebBrowserNavigatedEventArgs e)
    {
        string fullPath = e.Url.ToString();
        WebBrowser control = sender as WebBrowser;
        if (control != null &&  !string.IsNullOrEmpty(control.DocumentTitle) && control.DocumentTitle.Contains("Success code"))
        {
           _OAuthVerifierToken = control.DocumentTitle.Replace("Success code=","");
           DialogResult = DialogResult.OK;
        }
    }
    

    This way it can be done in the same piece of code, without having to write a complicated callback service of some sort to read the access token back into our system.

    Not exactly sure why the calendar api has this built in, and the contacts API doesn't.

    0 讨论(0)
  • 2021-01-01 05:31

    Firstly, the quick answer to your question. I believe that the IAuthorizationState has similar properties to OAuth2Parameters. Thus, you should be able to do this (combining it with the code you have for the calender):

    OAuth2Authenticator<NativeApplicationClient> auth = new OAuth2Authenticator<NativeApplicationClient>(provider, GetAuthorization);
    
    //This will call your GetAuthorization method
    auth.LoadAccessToken()
    RequestSettings settings = new RequestSettings("appName", auth.State.AccessToken);
    ContactsRequest cRequest = new ContactsRequest(settings);
    
    // fetch contacts list
    Feed<Contact> feedContacts = cRequest.GetContacts();
    foreach (Contact gmailAddresses in feedContacts.Entries)
    {
            // Looping to read  email addresses
            foreach (EMail emailId in gmailAddresses.Emails)
            {
               lstContacts.Add(emailId.Address);
            }
    }
    

    This should work as the RequestSettings allows you to specify an access token. That being said, I myself prefer to use :

    var parameters = new OAuth2Parameters()
    {
        //Client 
        ClientId = CLIENT_ID,
        ClientSecret = CLIENT_SECRET,
        RedirectUri = redirectUri,
        Scope = "https://www.google.com/m8/feeds",
        ResponseType = "code"
    };
    
    //User clicks this auth url and will then be sent to your redirect url with a code parameter
    var authorizationUrl = OAuthUtil.CreateOAuth2AuthorizationUrl(parameters);
    .
    .
    .
    //using the code parameter
    parameters.AccessCode = code;
    OAuthUtil.GetAccessToken(parameters);
    var settings = new RequestSettings(applicationName, parameters);
    var cr = new ContactsRequest(settings);
    //Now you can use contacts as you would have before
    

    Although, Ive only tested this with Web Server Apps, so maybe the authenticator is needed for your situation? I found these source codes handy:

    OAuth2Demo

    IAuthorizationState

    OAuth2Authenticator

    0 讨论(0)
提交回复
热议问题