Oauth 谷歌登录-“;访问“U令牌”;vs";id“U令牌”;vs";代码“;
在我们的网站上,我们在使用谷歌登录时使用access_令牌。首先,我们将用户重定向到google,用户将access_令牌带给我们,我们验证该令牌以确保用户是实际的google用户 然后,我们的Android应用程序需要一个谷歌登录功能,所以我想让Android开发者给我们带来访问令牌。他回答说他不能。我搜索了一下,发现几乎没有关于访问令牌的文档。在文档中,谷歌让我使用“id_令牌” 好的,我希望开发人员给我带来id_令牌,我已经成功地验证了令牌的完整性。然后我想为网站实现同样的功能 我的c#代码是: 当我在本地运行它时,它工作了,但当我在生产中尝试时,它给出了一个错误:JWT还无效 id_令牌是否是发送到后端并进行验证的正确方法?我还找到了另一个选项:代码 代码类似于A/12112312 Access_令牌类似于ya29.somemorestringOauth 谷歌登录-“;访问“U令牌”;vs";id“U令牌”;vs";代码“;,oauth,google-signin,Oauth,Google Signin,在我们的网站上,我们在使用谷歌登录时使用access_令牌。首先,我们将用户重定向到google,用户将access_令牌带给我们,我们验证该令牌以确保用户是实际的google用户 然后,我们的Android应用程序需要一个谷歌登录功能,所以我想让Android开发者给我们带来访问令牌。他回答说他不能。我搜索了一下,发现几乎没有关于访问令牌的文档。在文档中,谷歌让我使用“id_令牌” 好的,我希望开发人员给我带来id_令牌,我已经成功地验证了令牌的完整性。然后我想为网站实现同样的功能 我的c#代
我的问题是,哪一个发送到后端是正确的?顺便说一句,我认为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());