错误 "message":"Undefined index: jwt" 的原因可能是什么?
What could be the reason for error "message":"Undefined index: jwt"?
对于我的在线平台,我正在设置一个基本的 google 登录按钮,用户可以通过该按钮创建一个帐户或使用他们的 gmail 电子邮件地址登录。
我创建了我的 凭据 :OAuth 2.0 客户端 ID(同时获得 ID 和密码)和服务帐户(现已删除 - 在请求用户批准访问时不需要)。
对于 oauth 同意屏幕,我添加了我的非敏感范围:
./auth/userinfo.email
./auth/userinfo.profile
openid
我正在使用我自己的 gmail 地址进行测试,API url 使用的是 https://www.googleapis.com/oauth2/v2/userinfo?
email
字段上的查询。
编辑:我已经删除了服务帐户所以忽略它:
我也使用服务帐户电子邮件 (XXX-googleconnect@genial-analyzer-341XXX...) 和(相当长的)生成的密钥设置了我的 jwt 标志。
当我 运行 google API?
时,你能告诉我如何调试错误“消息”:“未定义的索引:jwt”吗?
编辑:我修改了我的代码以反映服务帐户的删除。所以不再有 jwt 令牌:"jwt_bearer": "false",
<?php
$exports = <<<'JSON'
{
"name": "oauth",
"module": "oauth",
"action": "provider",
"options": {
"jwt_bearer": "false",
"service": "google",
"client_id": "307540412021-test06test06test06test06test06.apps.googleusercontent.com",
"client_secret": "XXXXX-X0RMDgT1nEgxAKrOmpcjK4sXY7Qq",
"tokenHandling": "self"
},
"meta": [
{
"name": "access_token",
"type": "text"
}
],
"outputType": "object"
}
JSON;
?>
但现在我得到了"message":"Undefined index: false",
免责声明:我是一个没有编码的人,具有基本的 php 知识,如果您能使用一种易于理解的语言,我将不胜感激(并且很有帮助对于其他非编码人员我敢打赌)
提前致谢。
您需要了解的是,服务帐户授权、Oauth2 和登录之间存在很大差异。
如果您 运行 oauth2 授权并请求使用电子邮件和个人资料范围的访问权限,您将有权访问用户个人资料信息。
如果您尝试 运行 服务帐户身份验证并请求电子邮件和配置文件范围,您要么会收到错误,要么会获取服务帐户配置文件信息。作为服务帐户是虚拟用户。
"message":"Undefined index: jwt"
向我暗示您为错误的客户端使用了错误的代码。
服务帐户客户凭据
function getServiceAccountClient() {
try {
// Create and configure a new client object.
$client = new Google_Client();
$client->useApplicationDefaultCredentials();
$client->addScope([YOUR SCOPES HERE]);
return $client;
} catch (Exception $e) {
print "An error occurred: " . $e->getMessage();
}
}
Oauth2 客户端
function getGoogleClient() {
$client = getOauth2Client();
// Refresh the token if it's expired.
if ($client->isAccessTokenExpired()) {
$client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
file_put_contents($credentialsPath, json_encode($client->getAccessToken()));
}
return $client;
}
/**
* Builds the Google client object.
* Documentation: https://developers.google.com/identity/protocols/OAuth2
* Scopes will need to be changed depending upon the API's being accessed.
* Example: array(Google_Service_Analytics::ANALYTICS_READONLY, Google_Service_Analytics::ANALYTICS)
* List of Google Scopes: https://developers.google.com/identity/protocols/googlescopes
* @return A google client object.
*/
function buildClient(){
$client = new Google_Client();
$client->setAccessType("offline"); // offline access. Will result in a refresh token
$client->setIncludeGrantedScopes(true); // incremental auth
$client->setAuthConfig(__DIR__ . '/client_secrets.json');
$client->addScope([YOUR SCOPES HERE]);
$client->setRedirectUri(getRedirectUri());
return $client;
}
如您所见,每种授权类型的代码完全不同。
我的主要问题是,如果您要让用户登录您的应用,为什么还要尝试将服务帐户授权混入其中?
对于我的在线平台,我正在设置一个基本的 google 登录按钮,用户可以通过该按钮创建一个帐户或使用他们的 gmail 电子邮件地址登录。 我创建了我的 凭据 :OAuth 2.0 客户端 ID(同时获得 ID 和密码)和服务帐户(现已删除 - 在请求用户批准访问时不需要)。 对于 oauth 同意屏幕,我添加了我的非敏感范围:
./auth/userinfo.email
./auth/userinfo.profile
openid
我正在使用我自己的 gmail 地址进行测试,API url 使用的是 https://www.googleapis.com/oauth2/v2/userinfo?
email
字段上的查询。
编辑:我已经删除了服务帐户所以忽略它: 我也使用服务帐户电子邮件 (XXX-googleconnect@genial-analyzer-341XXX...) 和(相当长的)生成的密钥设置了我的 jwt 标志。
当我 运行 google API?
时,你能告诉我如何调试错误“消息”:“未定义的索引:jwt”吗?编辑:我修改了我的代码以反映服务帐户的删除。所以不再有 jwt 令牌:"jwt_bearer": "false",
<?php
$exports = <<<'JSON'
{
"name": "oauth",
"module": "oauth",
"action": "provider",
"options": {
"jwt_bearer": "false",
"service": "google",
"client_id": "307540412021-test06test06test06test06test06.apps.googleusercontent.com",
"client_secret": "XXXXX-X0RMDgT1nEgxAKrOmpcjK4sXY7Qq",
"tokenHandling": "self"
},
"meta": [
{
"name": "access_token",
"type": "text"
}
],
"outputType": "object"
}
JSON;
?>
但现在我得到了"message":"Undefined index: false",
免责声明:我是一个没有编码的人,具有基本的 php 知识,如果您能使用一种易于理解的语言,我将不胜感激(并且很有帮助对于其他非编码人员我敢打赌)
提前致谢。
您需要了解的是,服务帐户授权、Oauth2 和登录之间存在很大差异。
如果您 运行 oauth2 授权并请求使用电子邮件和个人资料范围的访问权限,您将有权访问用户个人资料信息。
如果您尝试 运行 服务帐户身份验证并请求电子邮件和配置文件范围,您要么会收到错误,要么会获取服务帐户配置文件信息。作为服务帐户是虚拟用户。
"message":"Undefined index: jwt"
向我暗示您为错误的客户端使用了错误的代码。
服务帐户客户凭据
function getServiceAccountClient() {
try {
// Create and configure a new client object.
$client = new Google_Client();
$client->useApplicationDefaultCredentials();
$client->addScope([YOUR SCOPES HERE]);
return $client;
} catch (Exception $e) {
print "An error occurred: " . $e->getMessage();
}
}
Oauth2 客户端
function getGoogleClient() {
$client = getOauth2Client();
// Refresh the token if it's expired.
if ($client->isAccessTokenExpired()) {
$client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
file_put_contents($credentialsPath, json_encode($client->getAccessToken()));
}
return $client;
}
/**
* Builds the Google client object.
* Documentation: https://developers.google.com/identity/protocols/OAuth2
* Scopes will need to be changed depending upon the API's being accessed.
* Example: array(Google_Service_Analytics::ANALYTICS_READONLY, Google_Service_Analytics::ANALYTICS)
* List of Google Scopes: https://developers.google.com/identity/protocols/googlescopes
* @return A google client object.
*/
function buildClient(){
$client = new Google_Client();
$client->setAccessType("offline"); // offline access. Will result in a refresh token
$client->setIncludeGrantedScopes(true); // incremental auth
$client->setAuthConfig(__DIR__ . '/client_secrets.json');
$client->addScope([YOUR SCOPES HERE]);
$client->setRedirectUri(getRedirectUri());
return $client;
}
如您所见,每种授权类型的代码完全不同。
我的主要问题是,如果您要让用户登录您的应用,为什么还要尝试将服务帐户授权混入其中?