问题描述
我们有
-
带有 Python social auth 的现有 Django 后端,用于通过 Google 登录,提供基于网络的应用程序和用于移动应用程序的 API。
-
一款带有 GoogleSignIn pod 的 iOS 移动应用。
现在我们希望允许移动应用用户在应用内使用 Google 登录,然后在后端对其进行身份验证,以便他们可以通过应用访问他们的个人数据。
所以我对算法的想法是:
-
应用使用 GoogleSignIn 并最终收到
access_token
。 -
应用将此
access_token
发送到后端。 -
应用将此
sessionid
用于进一步请求。
问题出在第三步:令牌验证。我找到了两种验证方式:
1. Python社交认证流程
如docs中所述:
token = request.GET.get('access_token')
user = request.backend.do_auth(token)
if user:
login(request,user)
return 'OK'
else:
return 'ERROR'
这将是一个首选流程,因为它已经包含所有必需的步骤并且与网络应用完美配合(例如,帐户创建、新创建用户的默认设置、分析收集等)。
但问题是后端和应用程序使用不同的 CLIENT_ID 进行身份验证。这是由于 Google Developers Console 中的限制:创建凭据时,您需要选择是 Web 应用还是 iOS 应用,不能两者兼而有之。
我尝试使用不同的客户端 id(然后后端无法验证),尝试在应用程序内部使用 web id(然后 pod 不起作用),并尝试在 web 内部使用应用程序 id(然后后端无法再次验证).
2. Google Api 客户端库
另一种选择是利用 Google Sign-In for iOS documentation 中的方式:
from google.oauth2 import id_token
from google.auth.transport import requests
try:
idinfo = id_token.verify_oauth2_token(token,requests.Request(),CLIENT_ID)
userid = idinfo['sub']
except ValueError:
# Invalid token
pass
它起作用了,但是在这里我们缺少社交身份验证提供的所有管道(例如,我们需要以某种方式创建用户),而且我找不到从中间启动管道的正确方法,而我担心它会非常脆弱且容易出错。
此解决方案的另一个问题是,实际上我们还使用 Apple 登录和 Facebook 登录,而此解决方案将需要对每个后端进行临时编码,这也会带来更多混乱和不可靠性。
>3.网页浏览
第三种选择是不在 Swift 中使用 SDK,而只在 Web 应用程序中使用 Web 视图,就像在浏览器中一样。
这解决了管道和客户端 ID 的问题。
但它看起来不是原生的,并且一些用户可能怀疑网络钓鱼企图(它与试图通过制作外观相同的表单来窃取 Google 身份的恶意应用程序有何不同?)。另外,我不确定它是否可以与设备上配置的帐户很好地配合。而且它甚至需要我们打开浏览器才能登录Apple,这看起来有些尴尬。而且我们不确定这样的应用会通过审核。
但是,也许,这些都是小问题?
⁂
那你怎么看?有没有第四种选择?或者也许可以改进上面的选项?在您的应用中是如何解决的?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)