0

我有以下情况:

我目前正在尝试编写一个 Metro 风格的应用程序,它能够让用户使用他的 Google 帐户登录,并且应用程序请求多个权限,如 Userinfo.profile 和 Userinfo.email。

为此,我目前正在使用 OAuthv2,并且请求细节效果很好(经过相当多的努力和研究)。

使用的网址:

const string url = "https://accounts.google.com/o/oauth2/auth?" +
                   "client_id=" + clientId +
                   "&redirect_uri=" + "urn:ietf:wg:oauth:2.0:oob" +
                   "&response_type=code" +
                   "&scope=https://www.googleapis.com/auth/userinfo.profile+https://www.googleapis.com/auth/userinfo.email" +
                   "&access_type=offline";

现在的问题是,如果我希望用户保持身份验证,我要么必须通过用户在客户端保存令牌来做到这一点,要么找到使用谷歌登录的某种方式,保持会话并检查是否他已通过身份验证。

问题是,我不知道如何执行后者,也不知道如何使用它。目前,每次我打开应用程序时,用户都会被重定向到谷歌授权页面,整个过程在每次重新启动时一遍又一遍地开始。

我想要完成的是,如果用户登录,我有某种方式来识别他,而不是总是通过重新请求给定详细信息的权限来给他带来负担。

我调查了OpenID,但我总是得到

<?xml version="1.0" encoding="UTF-8"?>
<xrds:XRDS xmlns:xrds="xri://$xrds" xmlns="xri://$xrd*($v*2.0)">
<XRD>
<Service priority="0">
<Type>http://specs.openid.net/auth/2.0/server</Type>
<Type>http://openid.net/srv/ax/1.0</Type>
<Type>http://specs.openid.net/extensions/ui/1.0/mode/popup</Type>
<Type>http://specs.openid.net/extensions/ui/1.0/icon</Type>
<Type>http://specs.openid.net/extensions/pape/1.0</Type>
<URI>https://www.google.com/accounts/o8/ud</URI>
</Service>
</XRD>
</xrds:XRDS>

作为对此网址的回应:

https://www.google.com/accounts/o8/id?openid.mode=checkid_setup&openid.ns=http://specs.openid.net/auth/2.0&openid.return_to=urn:ietf:wg:oauth:2.0:oob&openid.ns.ui=http://specs.openid.net/extensions/ui/1.0&openid.ns.ax=http://openid.net/srv/ax/1.0&openid.ax.mode=fetch_request&openid.ax.required=email,firstname,language,lastname,country&openid.ns.ext=http://specs.openid.net/extensions/oauth/1.0&openid.ext2.consumer=https://www.google.com/accounts/o8/ud?openid.mode=checkid_setup&openid.ns=http://specs.openid.net/auth/2.0&openid.return_to=urn:ietf:wg:oauth:2.0:oob&openid.ext2.scope=https://www.googleapis.com/auth/userinfo.profile+https://www.googleapis.com/auth/userinfo.email

我建错了吗?

如果有任何建议,关于如何“正确”执行此操作,我正在尝试完成什么(与谷歌集成,允许用户使用谷歌电子邮件登录,并且只有在他没有授权应用程序的情况下,请他这样做,再加上在第二次以上登录时找到他是谁的方式),或者我如何做到这一点,请随意。

此外,通过使用 .Net 4.5 框架的精简版本,我似乎无法使用 OpenID 库,因为它们依赖于完整的 4.5 。

*编辑*看看MSDN这会出现:

To support SSO, the online provider must allow you to register a redirect URI in the form ms-app://appSID, where appSID is the SID for your app. 

这是否意味着不可能?因为在谷歌我只能请求一个域的密钥http(s)://

4

1 回答 1

1

你看过这个吗?https://developers.google.com/accounts/docs/OAuth2Login

看起来您正在使用 Webserver 流程​​并请求离线访问。交换代码后,这应该会给您一个刷新令牌。在您的应用程序中保留此令牌。如果您也进行了登录授权,您将获得一个令牌,您可以使用它来获取 Google 用户的用户 ID

如果您有特定用户的有效刷新令牌,您的应用程序应该跟踪。然后使用该令牌获取当前凭据。您可以使用 tokeninfo enpoint 来验证令牌。如果您有用户的有效令牌,则无需通过代码流向他们发送以获取另一个刷新令牌。

如果您使用 tokeninfo 端点,则仅当访问令牌请求中存在https://www.googleapis.com/auth/userinfo.profile范围时,才会出现 userid 字段。此字段的值是登录用户的不可变标识符。存储这个,你应该有一个持久的用户标识符。

于 2012-12-18T00:46:16.760 回答