Oauth 谷歌登录-“;访问“U令牌”;vs";id“U令牌”;vs";代码“;

Oauth 谷歌登录-“;访问“U令牌”;vs";id“U令牌”;vs";代码“;,oauth,google-signin,Oauth,Google Signin,在我们的网站上,我们在使用谷歌登录时使用access_令牌。首先,我们将用户重定向到google,用户将access_令牌带给我们,我们验证该令牌以确保用户是实际的google用户 然后,我们的Android应用程序需要一个谷歌登录功能,所以我想让Android开发者给我们带来访问令牌。他回答说他不能。我搜索了一下,发现几乎没有关于访问令牌的文档。在文档中,谷歌让我使用“id_令牌” 好的,我希望开发人员给我带来id_令牌,我已经成功地验证了令牌的完整性。然后我想为网站实现同样的功能 我的c#代

在我们的网站上,我们在使用谷歌登录时使用access_令牌。首先,我们将用户重定向到google,用户将access_令牌带给我们,我们验证该令牌以确保用户是实际的google用户

然后,我们的Android应用程序需要一个谷歌登录功能,所以我想让Android开发者给我们带来访问令牌。他回答说他不能。我搜索了一下,发现几乎没有关于访问令牌的文档。在文档中,谷歌让我使用“id_令牌”

好的,我希望开发人员给我带来id_令牌,我已经成功地验证了令牌的完整性。然后我想为网站实现同样的功能

我的c#代码是:

当我在本地运行它时,它工作了,但当我在生产中尝试时,它给出了一个错误:JWT还无效

id_令牌是否是发送到后端并进行验证的正确方法?我还找到了另一个选项:代码

代码类似于A/12112312

Access_令牌类似于ya29.somemorestring


我的问题是,哪一个发送到后端是正确的?顺便说一句,我认为access\u令牌有点不推荐使用或类似的东西。

是的,您应该使用id\u令牌。您可以使用以下方法在客户端获取id_令牌:

var id_token = googleUser.getAuthResponse().id_token;
并在服务器端使用验证(在try/catch块中执行以捕获任何错误):

JWT尚未生效错误是由于服务器上的时间太慢。即使是几秒钟的减速也会导致此问题。为了确保它一直工作,您需要实现一个自定义时钟,它从某处获取准确的时间。下面是一个使用NNTP的示例:

public class AccurateClock : Google.Apis.Util.IClock
{
    const int UpdateIntervalMinutes = 60;
    const string NntpServer = "time.nist.gov";

    private TimeSpan _timeOffset;
    private DateTime _lastChecked;

    public AccurateClock()
    {
        _timeOffset = TimeSpan.FromSeconds(0);
        _lastChecked = DateTime.MinValue;
    }

    private DateTime GetTime()
    {
        try
        {
            if (DateTime.Now.Subtract(_lastChecked).TotalMinutes >= UpdateIntervalMinutes)
            {
                // Update offset 
                var client = new TcpClient(NntpServer, 13);
                DateTime serverTime;
                using (var streamReader = new StreamReader(client.GetStream()))
                {
                    var response = streamReader.ReadToEnd();
                    var utcDateTimeString = response.Substring(7, 17);
                    serverTime = DateTime.ParseExact(utcDateTimeString, "yy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
                }
                _timeOffset = DateTime.UtcNow.Subtract(serverTime);
                _lastChecked = DateTime.Now;
            }
            var accurateTime = DateTime.UtcNow.Subtract(_timeOffset);
            return accurateTime;
        }
        catch (Exception ex)
        {
            return DateTime.UtcNow;
        }

    }

    public DateTime Now
    {
        get
        {
            return GetTime().ToLocalTime();
        }
    }

    public DateTime UtcNow
    {
        get
        {

            return GetTime();
        }
    }
}
然后将自定义时钟传递给验证方法

token = await GoogleJsonWebSignature.ValidateAsync(idToken, new AccurateClock());

请注意:这将在每次创建类时更新正确时间和本地机器时间之间的差异,因此您确实希望在您使用的任何IOC容器中将其注册为单例,并将引用传递给验证器。然后,它将每小时使用NNTP重新检查时间。如果您不使用IOC容器,您可以将类设置为静态。

id\u令牌是一个JWT令牌,您可以验证和提取诸如“电子邮件”、“名称”等信息。这实际上是您在常规情况下需要的


代码访问令牌是当用户当前不使用您的应用程序,但您的应用程序希望代表他们执行任何操作时的流程的一部分。谷歌称之为“离线访问”

根据问题标题,你还应该提到这三个术语的区别。
public class AccurateClock : Google.Apis.Util.IClock
{
    const int UpdateIntervalMinutes = 60;
    const string NntpServer = "time.nist.gov";

    private TimeSpan _timeOffset;
    private DateTime _lastChecked;

    public AccurateClock()
    {
        _timeOffset = TimeSpan.FromSeconds(0);
        _lastChecked = DateTime.MinValue;
    }

    private DateTime GetTime()
    {
        try
        {
            if (DateTime.Now.Subtract(_lastChecked).TotalMinutes >= UpdateIntervalMinutes)
            {
                // Update offset 
                var client = new TcpClient(NntpServer, 13);
                DateTime serverTime;
                using (var streamReader = new StreamReader(client.GetStream()))
                {
                    var response = streamReader.ReadToEnd();
                    var utcDateTimeString = response.Substring(7, 17);
                    serverTime = DateTime.ParseExact(utcDateTimeString, "yy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
                }
                _timeOffset = DateTime.UtcNow.Subtract(serverTime);
                _lastChecked = DateTime.Now;
            }
            var accurateTime = DateTime.UtcNow.Subtract(_timeOffset);
            return accurateTime;
        }
        catch (Exception ex)
        {
            return DateTime.UtcNow;
        }

    }

    public DateTime Now
    {
        get
        {
            return GetTime().ToLocalTime();
        }
    }

    public DateTime UtcNow
    {
        get
        {

            return GetTime();
        }
    }
}
token = await GoogleJsonWebSignature.ValidateAsync(idToken, new AccurateClock());