Xamarin.Auth 与 Google API:更新凭据?

2024-03-21

我正在尝试将 Xamarin.Auth 与Xamarin Google-API https://github.com/xamarin/google-apis登录 Google 并访问云端硬盘。我已经设法让几乎一切正常工作,但身份验证令牌似乎在大约一个小时后过期。一切都运行良好一段时间,但大约一个小时后,当我尝试访问时,我收到无效凭据 [401] 错误和泄漏:

Google.Apis.Requests.RequestError
Invalid Credentials [401]
Errors [
    Message[Invalid Credentials] Location[Authorization - header] Reason[authError] Domain[global]
]
: GoogleDriveAgent: FetchRemoteFileList() Failed! with Exception: {0}
[0:] Google.Apis.Requests.RequestError
Invalid Credentials [401]
Errors [
    Message[Invalid Credentials] Location[Authorization - header] Reason[authError] Domain[global]
]
: GoogleDriveAgent: FetchRemoteFileList() Failed! with Exception: {0}

objc[37488]: Object 0x7f1530c0 of class __NSDate autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
objc[37488]: Object 0x7f151e50 of class __NSCFString autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
//...more leaks.

我想确保我按预期使用 Xamarin.Auth 和 Google API,所以这是我的代码:

在我的 GoogleDriveService 类中,我有一个帐户存储和一个已保存的帐户:

AccountStore Store { 
    get {
        if (m_store == null)
            m_store = AccountStore.Create ();
        return m_store;
    }
}

Account SavedAccount { 
    get {
        var savedAccounts = Store.FindAccountsForService ("google");
        m_savedAccount = (savedAccounts as List<Account>).Count > 0 ? (savedAccounts as List<Account>) [0] : null;

        return m_savedAccount;
    }
}

我初始化一个会话并启动服务:

void InitializeSession ()
{
    Authenticator = new GoogleAuthenticator (ClientID, new Uri (RedirectUrl), GoogleDriveScope);
    Authenticator.Completed += HandleAuthenticationCompletedEvents;

    if (SavedAccount != null) {
        Authenticator.Account = SavedAccount;
        StartService ();
    }

    UpdateSignInStatus ();
}

bool StartService ()
{
    try {
        Service = new DriveService (Authenticator);
        return true;
    } catch (Exception ex) {
        // Log exception
        return false;
    }
}

...并响应身份验证完成事件:

void HandleAuthenticationCompletedEvents (object sender, AuthenticatorCompletedEventArgs e)
{
    if (e.IsAuthenticated) {  // Success
        UpdateSignInStatus();
        Store.Save (e.Account, "google");
        Authenticator.Account = e.Account;
        StartService();
        LoginController.DismissViewController(true, null);
    } else {                                    // Cancelled or no success
        UpdateSignInStatus();
        LoginController.DismissViewController(true, null);
        LoginController = null;
        InitializeSession ();  // Start a new session
    }
}

同样,在一段时间内一切正常,但随后身份验证就会过期。我明白那个它应该 https://developers.google.com/accounts/docs/OAuth2#expiration,但我认为保存在 AccountStore 中的凭据应该仍然有效。

In the Xamarin.Auth 入门文档 http://components.xamarin.com/gettingstarted/xamarin.auth,它表示再次调用“保存”将覆盖凭据,并且“这对于使帐户对象中存储的凭据过期的服务很方便”。听起来很有希望...

所以我尝试了另一种方法:有一个 IsSignedIn 属性,它总是覆盖 getter 中的凭据......

public bool IsSignedIn { 
    get {
        if (Authenticator == null) {
            m_isSignedIn = false;
            return m_isSignedIn;
        }

        if (Authenticator.Account != null) {
            Store.Save (Authenticator.Account, "google"); // refresh the account store
            Authenticator.Account = SavedAccount;
            m_isSignedIn = StartService ();
        } else {
            m_isSignedIn = false;
        }

        return m_isSignedIn;
    }
}

...然后我在任何 API 调用(获取元数据、下载等)之前访问 IsSignedIn。它不起作用:我仍然收到上面显示的过期凭据错误。

这种情况是否需要刷新令牌 https://github.com/xamarin/Xamarin.Auth/issues/47?我究竟做错了什么?


访问令牌应该相对较快地过期。这就是为什么在第一次身份验证之后,您还会收到一个刷新令牌,如果当前访问令牌过期,您可以使用它来获取新的访问令牌。连续身份验证不一定会给您刷新令牌,因此请确保保留收到的令牌!

访问令牌失效后,您所要做的就是使用refresh_token并将OAuthRequest发送到Google OAuth端点的token_url。

var postDictionary = new Dictionary<string, string>();
postDictionary.Add("refresh_token", googleAccount.Properties["refresh_token"]);
postDictionary.Add("client_id", "<<your_client_id>>");
postDictionary.Add("client_secret", "<<your_client_secret>>");
postDictionary.Add("grant_type", "refresh_token");

var refreshRequest = new OAuth2Request ("POST", new Uri (OAuthSettings.TokenURL), postDictionary, googleAccount);
        refreshRequest.GetResponseAsync().ContinueWith (task => {
            if (task.IsFaulted)
                Console.WriteLine ("Error: " + task.Exception.InnerException.Message);
            else {
                string json = task.Result.GetResponseText();
                Console.WriteLine (json);
                try {
                    <<just deserialize the json response, eg. with Newtonsoft>>
                }
                catch (Exception exception) {
                    Console.WriteLine("!!!!!Exception: {0}", exception.ToString());
                    Logout();
                }
            }
        });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Xamarin.Auth 与 Google API:更新凭据? 的相关文章

  • 授予 Rails 应用 API 访问权限的最佳身份验证方法

    我想为我的网络应用程序提供经过身份验证的 API 访问 此类服务的消费者通常是其他网站 服务 验证这些用户身份的最佳方法是什么 OAuth openID http 身份验证 正如我们的工作一样 哪个最好 的答案是这样的 是 这取决于 HTT
  • 如何在 Jenkins 管道中使用 Google 服务帐户进行身份验证

    我想用gcloud在 Jenkins 管道中 因此我必须首先使用 Google 服务帐户进行身份验证 我正在使用https wiki jenkins io display JENKINS Google OAuth Plugin https
  • 客户端凭据授予的访问令牌是否可以映射到用户?

    我想使用 oauth2 中的客户端凭据授予来保护 API 但是 我希望访问令牌映射到单个用户 由我在带外信任 设置阶段选择 在该阶段我共享密钥 秘密 这是一个问题吗 我知道使用客户端凭据授予的访问令牌不应该在用户的上下文中 以这种方式绑定它
  • 在 Postman 中的后续请求中使用身份验证令牌

    我的应用程序 API 需要通过身份验证令牌进行身份验证 简而言之 我们向 authentication端点 它使用包含令牌的 JSON 对象进行响应 例如 token xxxxxxxxxxxxxxxxxxxxxx 我们应用程序中的每个其他
  • 如何在 MVC 5 中设置自定义 ClaimsPrincipal?

    我创建了一个自定义主体类 public class FacebookPrincipal ClaimsPrincipal public JObject Data get set 我想用它 当用户登录时 我尝试设置 var fbP new Fa
  • Google 登录无法正常工作

    我尝试在我的网站上使用 Google 登录 但是 它一直显示 400 错误 我参考了这篇文章 https developers google com identity sign in web sign in https developers
  • MVC Owin Identity 2 CheckPasswordAsync() 将不会执行

    我有两个问题似乎彼此相关 并且 stackoverflow 中的其他重复项都不能回答我的问题 First当 的时候PasswordSignInAsync方法执行它永远不会停止或抛出任何异常它只是继续执行 var result await S
  • 从 Xamarin Forms 的输入控件中删除下划线

    我是 Xamarin Forms 的新手 正在开发登录表单并使用 Material Design IVisual 我创建了一个自定义 Entry 类并继承它MaterialEntryRenderer来定制它 我想要实现的目标是删除下划线En
  • 瓦廷 Windows 身份验证

    我正在尝试为使用集成身份验证的 Intranet 应用程序编写 Watin 测试 我尝试测试的网页打印 Page User Identity Name 这是我测试的一些代码 if Win32 LogonUser u UserName u D
  • 通过服务删除 Windows 登录屏幕

    我正在尝试从服务启动的可执行文件中删除 Windows 登录屏幕 winlogon 该服务将随 Windows 自动启动 并等待来自另一台计算机的命令 当它收到命令时 它将启动一个 exe 该 exe 将在特定用户名下启动 cmd exe
  • 登录方式使用GINA定制

    我知道在 GINA 中找到大师并不容易 但我的问题最接近进程间通信 IPC 我用非托管 c 编写了我的自定义 GINA 我在其中包含了一个方法来检查用户尝试的指纹的有效性为了登录 该函数将调用正在运行的系统Windows服务中用C 编写的一
  • RefreshToken 在我获得新的令牌 Google Sheets API 后没有发回

    我正在使用带有 PHP 的 Google Sheets API 并遵循可以在此处找到的快速入门指南https developers google com sheets quickstart php https developers goog
  • 尝试使用 SQL 身份验证登录失败

    我正在尝试使用 sa 用户名及其密码连接到 SQL Server 2008 在 SQL Server 日志文件中我看到以下错误 用户 sa 登录失败 原因 尝试使用 SQL 登录 认证失败 服务器配置为 Windows 身份验证 仅有的 当
  • 谷歌驱动器使用统计谷歌驱动器UI和API之间的差异

    我们正在使用 Google Drive API关于 获取 https developers google com drive v2 reference about get方法返回一个关于资源 https developers google
  • 使用单个查询和每用户密码盐进行用户登录

    我决定使用存储在数据库中的每用户盐来实现用户登录 盐作为密码的前缀 该密码使用 SHA 进行哈希处理并存储在数据库中 过去 当我不使用盐时 我会使用典型的方法 使用用户输入的用户名和密码来计算查询返回的行数 然而 对于每个用户的盐 您需要先
  • Google javascript 登录 api:无法离线访问

    我正在尝试为服务器端应用程序实现 Google 登录 如 Google 文档中所示 服务器端应用程序的 Google 登录 https developers google com identity sign in web server si
  • 此列表分配如何进行?

    我看过这个代码示例 它看起来像是将一个数组初始值设定项分配给一个列表 我以为它不会工作 但不知何故它编译了 不是数组初始值设定项吗 Children 的类型为 IList 如果大括号前没有 新列表 它如何工作 var nameLayout
  • Xamarin 分步向导 Android 视图

    我想在 Xamarin c 中构建一个 android 活动 用于逐步注册和 或信息 我怎样才能做这样的事情 谁能给我一个代码示例或其他东西 谢谢 基本上你需要使用一个名为 a 的元素ViewPager 并且每个页面都会不同Fragment
  • Xamarin Forms WebView 打开外部链接

    我的应用程序中有一个网络视图 当单击外部链接 在普通浏览器中在新选项卡中打开 时 我无法返回我的网站 当打开一个新标签时 有可能像 Gmail 一样关闭该标签的菜单吗 目的是 每当单击链接时 用户都可以选择使用哪个选项来查看内容 例如单击链
  • 在 Xamarin 中获取 OutOfMemoryException

    java lang OutOfMemoryError 考虑增加 JavaMaximumHeapSize Java 执行时内存不足 java exe 我的 Visualstudio Xamarin 项目出现内存不足异常 请帮助我如何解决此问题

随机推荐

  • 将一个静态共享库链接到我的共享库

    我在链接我当前正在从事的项目的一些选项方面遇到了一些困难 我正在尝试创建一个与其他 2 个库链接的共享库 我们称他们为libfoo so and libbar so 我的输出库必须是共享库 并且我想要静态链接libfoo so到生成的库 但
  • 无需 Visual Studio 即可部署到 Azure WebRole

    有没有一种方法可以将我的整个网站 Web 应用程序部署到 Azure WebRole 而不需要 Visual Studio Context IIS 网络部署 http www iis net downloads microsoft web
  • 如何在React Native中以redux形式设置隐藏字段?

    如何在React Native中以redux形式设置隐藏字段 我只是找不到任何方法来做到这一点 有什么帮助吗 我结束使用这个 this props dispatch change FORM NAME FIELD NAME VALUE 运行此
  • 为什么这个图在添加散点时失败,但在删除散点时却有效?

    我正在使用以下内容来绘制 x 日期和 y 小数 如果没有注释行 散点 它的效果很好 但是如果您取消注释它 它会在一个 x 轴上显示所有内容 我缺少什么 thanks import matplotlib pyplot as plt impor
  • 使用 TypeScript 实现流畅的 API?

    我正在尝试用 TypeScript 开发一个流畅的 api 我想使用它 如下所示 export interface Person firstName string lastName string new Builder
  • 您如何比较今年和去年同一周的同一天?

    大多数零售商在销售报告中使用商品日历 这可以帮助他们找到当年和上一年同一周的同一天 例如今天是 2016 10 10 星期一 上一年 2015 年同一周 星期一是 2015 年 10 月 12 日 我们如何通过 SQL 查询捕获这一点并将它
  • 分页库和房间具有不同的 PagedLists,取决于不同的请求

    我正在尝试使用新的 Android 架构组件设置所有列表 房间持久性库 https developer android com topic libraries architecture room html and 分页库 https dev
  • 如何使用批处理文件构建解决方案

    我想使用批处理文件构建 NET 解决方案 我知道我需要使用以下语句 devenv build release D Source Code Source test sln 但我不知道如何创建将在 VS 命令提示符下执行的批处理文件 Visua
  • .Net 的 RSS/Atom 解析库

    我正在尝试找到一个可以读取给定 RSS Atom 提要的库 并且可以猜测其格式并将其抽象为项目列表 这个想法是构建一个可以接收任何提要的简单 RSS 阅读器 我知道 PHP 有一些库可以做到这一点 但我找不到任何 Net 版本 如果您使用的
  • 仅获取未隐藏的元素.. Jquery

    我只需要获取 jquery foreach 循环中的 show 元素 在下面的代码中 我得到了所有带有类测试的元素 即隐藏和显示的元素 但只需要显示而不是隐藏一个 如何过滤并在这一行本身中获取它 element find test each
  • 将 Symfony 翻译传递给 Symfony Webpack Encore

    对于 Symfony 我使用翻译 https symfony com doc current components translation html 树枝和Webpack 再来一次 https symfony com doc current
  • 从网站获取html源代码,然后从html文件中获取元素

    我想获取网站的 HTML 代码 然后从该 HTML 文件中获取某个元素 有些东西可以获取 HTML 代码 例如 ajax 和 jquery 我正在使用节点并希望它是完整的JavaScript 另外 我不知道如何从中获取某个元素 我已经在 p
  • Perl,数组的哈希:添加和删除键,添加到数组,所有这些都在 while 循环中

    我有一个散列 它应该包含链接到它们自己的数组的某些键 更具体地说 哈希键是质量值 数组是序列名称 如果已经存在该质量的数组 我想将序列名称添加到链接到相关质量的数组中 如果没有 我想创建一个并向其添加序列名称 所有这些都是在 while 循
  • 在渲染到布局之前获取文本视图的高度

    找不到什么好的解决办法计算textview高度其中文本在渲染文本视图到布局之前设置 请提供任何帮助 2个解决方案 一开始用的是方案1 后来找到了方案2 两者都有效 这确实是您喜欢的 重要的是要确保所有尺寸都正确 因为混合 sp 或 px 字
  • JOI:数组中允许空值

    我正在尝试在 POST 请求中添加数组验证 Joi array items Joi string single optional 我需要在有效负载中允许空值 您能告诉我如何做到这一点吗 如果你想让数组为空 请使用 Joi array ite
  • Node.js / 删除文件中的内容

    我想用node js删除一个简单文本文件的内容 或者用新的 空的文件替换该文件 我怎样才能在节点中实现这一点 您正在寻找fs truncate http nodejs org api fs html fs fs truncate path
  • 如何在 PHP 中一次按多个值搜索多维数组?

    给定以下二维数组 data info array array array score gt 100 name gt Alice subject gt Data Structures array score gt 50 name gt Bob
  • DataTables - 不使用 Ajax 扩展子级详细信息

    我正在开发一个使用jquery DataTables 版本1 10 的页面 TableData 源当前仅作为渲染页面上的 HTML 表发送 并且工作正常 不过 我希望能够扩展行以显示详细信息 非常喜欢这个例子Here https datat
  • Visual Studio 2010 可以使用 IE 调试 Javascript,但不能使用 Firefox 或 Chrome。有什么解决办法吗?

    我已经在堆栈溢出和谷歌上阅读了很多消息 但没有任何运气 我的问题很简单 我想使用 firefox 或 chrome 而不是 IE 从 Visual Studio 调试我的应用程序 但是当执行 断点当前不会被命中 没有为该文档加载任何符号 时
  • Xamarin.Auth 与 Google API:更新凭据?

    我正在尝试将 Xamarin Auth 与Xamarin Google API https github com xamarin google apis登录 Google 并访问云端硬盘 我已经设法让几乎一切正常工作 但身份验证令牌似乎在大