0

我正在尝试编写一个在谷歌日历中创建条目的工具。在遵循谷歌文档并在 api 控制台中创建客户端标识符/秘密之后,我设法将一个客户端组合在一起,该客户端可以正确验证并显示我注册的谷歌日历。现在对我来说,我的谷歌帐户似乎以某种方式与我的客户标识符/秘密相关联。我想知道的是:如何更改身份验证过程,以便该工具的其他用户可以输入他的 google-id 并访问他的日历?

编辑:换句话说(在 RFC 中使用):我想让资源所有者部分可编辑,同时保持客户端部分不变。但我的示例虽然有效,但将客户和资源所有者联系在一起。

这是我到目前为止运行良好的应用程序:

    public void Connect()
    {
        var provider = new NativeApplicationClient(GoogleAuthenticationServer.Description);
        provider.ClientIdentifier = "123456123456.apps.googleusercontent.com";
        provider.ClientSecret = "nASdjKlhnaxEkasDhhdfLklr";
        var auth = new OAuth2Authenticator<NativeApplicationClient>(provider, GetAuthorization);
        var service = new CalendarService(auth);

        //Events instances = service.Events.Instances("primary", "recurringEventId").Fetch();
        var list = service.CalendarList.List().Fetch();

        foreach (var itm in list.Items)
            Console.WriteLine(itm.Summary);
    }

    private static readonly byte[] AditionalEntropy = { 1, 2, 3, 4, 5 };

    private static IAuthorizationState GetAuthorization(NativeApplicationClient arg)
    {
        var state = new AuthorizationState(new[] { CalendarService.Scopes.Calendar.GetStringValue() });
        state.Callback = new Uri(NativeApplicationClient.OutOfBandCallbackUrl);

        var refreshToken = LoadRefreshToken();
        if (!String.IsNullOrWhiteSpace(refreshToken))
        {
            state.RefreshToken = refreshToken;

            if (arg.RefreshToken(state))
                return state;
        }

        var authUri = arg.RequestUserAuthorization(state);

        // Request authorization from the user (by opening a browser window):
        Process.Start(authUri.ToString());
        var frm = new FormAuthCodeInput();
        frm.ShowDialog();

        // Retrieve the access token by using the authorization code:
        var auth = arg.ProcessUserAuthorization(frm.txtAuthCode.Text, state);
        StoreRefreshToken(state);
        return auth;
    }

    private static string LoadRefreshToken()
    {
        try
        {
            return Encoding.Unicode.GetString(ProtectedData.Unprotect(Convert.FromBase64String(Properties.Settings.Default.RefreshToken), AditionalEntropy, DataProtectionScope.CurrentUser));
        }
        catch
        {
            return null;
        }
    }

    private static void StoreRefreshToken(IAuthorizationState state)
    {
        Properties.Settings.Default.RefreshToken = Convert.ToBase64String(ProtectedData.Protect(Encoding.Unicode.GetBytes(state.RefreshToken), AditionalEntropy, DataProtectionScope.CurrentUser));
        Properties.Settings.Default.Save();
    }
4

2 回答 2

0

提示用户输入他们的 ClientIdentifier 和 ClientSecret,然后将这些值传递给您的 Connect 方法。

于 2013-03-15T03:03:14.543 回答
0

我自己解决了这个问题。

问题是,我通常总是连接到谷歌,因为在我的应用程序重定向到谷歌以获取访问令牌之前我没有从谷歌注销,谷歌自动为我的帐户生成访问令牌 - 跳过部分出现输入表单的地方,任何人都可以输入他/她的用户凭据,让谷歌为他/她的帐户生成访问令牌。

于 2013-03-26T13:29:16.487 回答