我正在尝试为我的 Android 和 iOS 应用设置 Google 登录。
Google 登录在应用程序中配置,并且应该将在应用程序中检索到的 id 令牌发送到服务器。然后,服务器端的 PHP 代码应使用 Google 客户端来验证使用以下代码发送的 Id 令牌:
$client = new Google_Client(['client_id' => $CLIENT_ID]);
try{
$payload = $client->verifyIdToken($request["idToken"]);
} catch(Exception $e){
api_error("ID verification failed E1; ".$e->getMessage(), 304);
}
if($payload) {
$sid = "G".$payload['sub'];
} else {
api_error("ID verification failed E2;", 304);
}
但是,虽然此代码成功验证了我的 Android 应用程序发送的 idtoken,但在从 iOS 应用程序发送 idtoken 时却失败了。payload 变量返回 null 并且总是到达代码的 ID 验证失败 E2 部分。
在 REST api 端点https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=中调试从移动设备发送的 idtoken为我提供了 Android 和 iOS 的成功响应。我可以在响应中发现的唯一区别是azp和aud值。鉴于应用程序使用不同的客户端 ID,我认为这种差异是预期的。
在 Android 代码中,Google SDK 具有 requestIdToken(webClientId) 方法,该方法允许您设置 Web 客户端 id 变量以请求 id 令牌。对于 iOS Google 登录,我找不到设置 Web 客户端 ID 的选项。我尝试将 webClientId 设置为 GIDSignIn.sharedInstance() 中的 serverClientId 但这给了我一个 400 错误,告诉我观众无效。
有没有办法设置这个 webclientid,iOS 有没有 requestIdToken 等价物?我目前正在使用以下代码在 iOS 上获取 idtoken:
@IBOutlet weak var googLoginButton: GIDSignInButton!
@IBOutlet weak var fbLoginButton: FBSDKLoginButton!
let tokenValidation = TokenValidation();
var isShown = false;
override func viewDidLoad() {
super.viewDidLoad()
fbLoginButton.delegate = self;
GIDSignIn.sharedInstance().delegate = self
GIDSignIn.sharedInstance().uiDelegate = self
}
TokenValidation 类是我编写的用于将数据发送到服务器的自定义类。
ViewController 有一个调用以下函数的 GIDSignInButton:
func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!,
withError error: Error!) {
if (error == nil) {
let idToken = user.authentication.idToken
tokenValidation.setFBAccessToken(accessToken: nil);
tokenValidation.setGoogleIdToken(googleIdToken: idToken);
startTokenValidate(tokenValidation: tokenValidation);
} else {
showMessage(messageStr: error.localizedDescription);
}
}
startTokenValidate 函数然后调用我的 API 端点来验证令牌。应用程序内的错误变量始终为零。
有什么方法可以检索正确的 idtoken,或者是否有其他方法可以使用后端服务器验证 Google 登录?