使用Azure AppService的原生Android/Google登录

问题描述:

不确定这是否可能:我想从服务器流切换到本机客户端流,以便为我的用户提供更好的身份验证体验。使用Azure AppService的原生Android/Google登录

问题是Azure AppService需要一个“Web应用程序”OAUTH设置(包含客户端ID和密码),而本地登录仅使用客户端ID而非秘密。这意味着在电话上登录后,我确实有Google令牌,但AppService不知道如何处理它并返回给我HTTP Unauthorized

手机客户端SDK为我提供了一个API,但这不适用于这种令牌。

var jObject = new JObject(
    new JProperty("access_token", auth.AccessToken), 
    new JProperty("id_token", auth.IdToken)); 

await ServiceClient.LoginAsync(MobileServiceAuthenticationProvider.Google, jObject); 

任何想法正确的方式来整合,而不必写我自己的服务器端令牌验证?

由于您试图访问非Google API,因此您仍然需要在Google中配置Web应用程序。本身的登录是不够的。

这意味着您仍然需要为后端提供ID和密码。客户端负责获取发送给服务器的id令牌和授权码,并且服务器根据Google documentation实际检索访问令牌。

因此,这意味着您的通话将实际上看起来像下面这样:

var jObject = new JObject(
    new JProperty("authorization_code", auth.ServerAuthCode), // not sure what property your auth binding exposes this as 
    new JProperty("id_token", auth.IdToken)); 

await ServiceClient.LoginAsync(MobileServiceAuthenticationProvider.Google, jObject); 

没有使用Xamarin.Android端至端的文档,但你可能会发现它很有用浏览一下App Service iOS documentation for this scenario只是为了看运动部件。您将遵循的一般模式是:

  • 配置一切为了服务器流量(因为你已经做过)
  • 设置的谷歌登录的SDK(好像你已经做了已经,也)。
  • 使通话以上

所描述的,你可能会遇到的主要问题是确保您有API控制台登录正确的。您需要确保您的Android客户端连接到您正在使用的Web应用程序客户端ID。我建议快速查看Google Sign-in for Android setup instructions。另外请注意,授权码是一次性使用,并且Google会在一定时间内为用户提出太多要求的限制。你可能会在开发期间遇到这种情况。

据我所知,本地客户端流程也使用谷歌代码流获取访问令牌。

根据此article,Android,iOS或Chrome应用程序不需要获取访问令牌的秘密。

从API控制台获取的客户端密钥。注册为Android,iOS或Chrome应用程序的客户端不需要此值。

但是,如果您未在后端设置启用Azure应用服务认证/授权,则Web应用后端将不会授权此访问令牌。因为后端将拥有自己的逻辑(移动服务器库根据访问令牌编写逻辑)根据访问令牌返回认证令牌。

现在,在您的移动应用程序中启用客户端流程的最简单方法是在您的后端设置,以启用Azure应用服务谷歌身份验证/授权与同一clientid和秘密(基于我的测试:如果你不设置正确的秘密,后端仍然会返回授权令牌)。

下面是测试图像:

enter image description here

如果你还不想让谷歌应用程序容易权威性,我建议你可以创建一个包含自己的逻辑来检查accesstoekn定制认证并从谷歌获取用户信息。

如果检查结果是成功并获得足够的值,则可以生成身份验证令牌并返回到客户端。

有关如何在移动应用程序后端创建自定义身份验证的更多详细信息,请参阅此article

+0

圣牛白兰度,只是添加一个虚拟秘密ClientID工作!我在这里有两个问题:你是否发现了AppService中一个允许提交假令牌的严重安全漏洞,或者如果密钥不匹配,Azure是否会验证该令牌是否违背Google的公钥基础结构?请参阅https://developers.google.com/identity/sign-in/web/backend-auth#verify-the-integrity-of-the-id-token。 另外:我使用的密钥仅限于Android应用。这意味着我的应用服务无法为使用简单认证的iOS客户端服务,而不是? –

+0

在我看来,使用服务器流时,秘密用于获取访问令牌。如果您使用客户端流量,您将首先获取访问令牌和idtoken,并将其发送到后端。后端将解码idtoken(jwt token),它包含观众。如果观众与google appid相同,并且用户信息与idtoken数据相同,则会将auth令牌返回给客户端。 –

+0

如果您使用相同的appid在ios和android中获取访问令牌和标识令牌,则简单验证可以将正确的验证令牌返回给客户端。 –