如何使用苹果验证 ID 令牌签名作为谷歌 oauth2 的替代方案

问题描述

大家好,我使用 google oauth api 创建了一种使用 tokeninfo 端点验证 ID 令牌签名以进行调试的简单方法

要使用 tokeninfo 端点验证 ID 令牌,我向端点发出 HTTPS POST 或 GET 请求,并在 id_token 参数中传递我的 ID 令牌。例如,要验证令牌“XYZ123”,请发出以下 GET 请求:

https://oauth2.googleapis.com/tokeninfo?id_token=XYZ123

如果令牌已正确签名并具有适当的值,我将收到 HTTP 200 响应(我遵循本指南 https://developers.google.com/identity/sign-in/web/backend-auth

苹果内部的替代选择是什么?关于如何为苹果修复完全相同的问题的任何建议?

这是我的代码示例:

$curl = curl_init();

            curl_setopt_array($curl,array(
              CURLOPT_URL => 'https://oauth2.googleapis.com/tokeninfo?id_token=' . $request->input('token'),CURLOPT_RETURNTRANSFER => true,CURLOPT_ENCODING => '',CURLOPT_MAXREDirs => 10,CURLOPT_TIMEOUT => 0,CURLOPT_FOLLOWLOCATION => true,CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,CURLOPT_CUSTomrEQUEST => 'GET',));

            $response = curl_exec($curl);
            curl_close($curl);
            $responseDecoded = json_decode($response);

            if (isset($responseDecoded->error)) //Failed TO GOOGLE AUTHENTICATED
            {
                if ($responseDecoded->error=='invalid_token')
                {
                    return response()->json(['status' => 'fail','message'=>'invalid_token']);
                }
            }

解决方法

这里需要理解的一个关键点:

  • 用户有无数种登录方式 - 其中之一是 Apple - 他们来来去去 - 请参阅 Curity Authenticators Page 以了解这一点。

  • 保护您的数据在所有情况下都应该是一样的。

因此,如果您以 Apple 为基础进行数据保护,那么对于不使用 Apple 登录的人来说就行不通了,而且您限制了自己的可能性。

以下是解决方案的工作原理:

  • 您的 UI 和 API 与授权服务器 (AS) 通信
  • AS 管理与 Apple 的连接以及其他 25 种可能的身份验证方法
  • 每次添加新的身份验证选项时,您的任何 UI 和 API 都需要更改零代码
  • 随着时间的推移,您的 UI 和 API 代码仍然简单且可移植

总而言之,我建议您的应用与 Google OAuth2 对话 - 这有助于保护您的数据,而 Apple 应该扮演更小的身份验证方法角色 - Google 应该为您与 Apple 对话。

在 Curity,我们提供 Sign in with Apple 功能。我们的主要任务是保护数据...

ID 令牌验证

如果这是在浏览器响应中收到的,则应由应用程序验证。这通常涉及从授权服务器下载令牌签名公钥。一些提供商可能会为您提供一个端点来执行此操作,就像在 Google 案例中一样。

Apple 提供了一些(非标准)行为,如 this link 中所做的相同的事情。

但是当您尝试实施授权时,在您的应用中进行编码可能会导致以后出现更多问题。另请注意,不应使用 ID 令牌来保护 API 中的数据 - 请改用访问令牌。