0

Google カレンダーにエントリを作成するツールを作成しようとしています。Google ドキュメントに従い、API コンソールで client-identifier/secret を作成した後、正しく認証され、登録済みの Google カレンダーを表示するクライアントをまとめることができました。今のところ、Google アカウントが何らかの形でクライアント ID/シークレットに関連付けられているようです。私が知りたいのは、このツールの他のユーザーが自分の 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

私は自分で問題を解決しました。

問題は、私は通常常にGoogleに接続していることであり、アクセストークンを取得するためにアプリがGoogleにリダイレクトされる前にGoogleからログアウトしなかったため、Googleはアカウントのアクセストークンを自動的に生成しました-その部分をスキップしました入力フォームが表示され、誰もが自分のユーザー資格情報を入力して、Google に自分のアカウントのアクセス トークンを生成させることができます。

于 2013-03-26T13:29:16.487 に答える