私はこの問題を回避するために頭を悩まされていて、ガイダンスを開いています。 Google Cloud Datastoreサービスアカウントへのアクセスを作成するためにOauthを使用しているAngular 4アプリがあります。私はJWTを使ってそれをエンコードしてGoogleに渡しています。以下は、署名とHTTPリクエストの関数です。Angular4経由でGoogleサービスアカウントに接続するときに「無効な許可タイプ」
エンコードが正しくない場合や、APIに正しくアクセスしようとしていない場合は、わかりません。私が間違っていた可能性がある場所や、nodejをピギーバックしていないこれを行うためのよりよい方法については、どのようなsuggetionsでも利用できます。トークン下記取得する
機能:
getGoogleToken(){
let key = this.createGoogleSig();
let params = {
grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
assertion: key
};
let myheaders = new Headers;
myheaders.append('Content-Type', 'application/x-www-form-urlencoded')
console.log(params);
this.http.post('https://www.googleapis.com/oauth2/v4/token', params, { headers : myheaders}).subscribe(
data => this.thing = data.toString(),
err => console.log(err),
() => console.log('Request Complete')
);
}
をコード
createGoogleSig(){
let now = (Date.now()/1000).toFixed(0);
let exp = +now + 1800;
let key = {
"type": "service_account",
"project_id": "jenenginecms",
"private_key_id": "---",
"private_key": "-----BEGIN PRIVATE KEY-----cut for brevity---END PRIVATE KEY-----\n",
"client_email": "[email protected]",
"client_id": "---",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://accounts.google.com/o/oauth2/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/pepperbirdcms%40jenenginecms.iam.gserviceaccount.com"
}
let claimObj = {
"iss": key.client_email,
"scope": "https://www.googleapis.com/auth/datastore",
"aud": "https://www.googleapis.com/oauth2/v4/token",
"exp": exp,
"iat": +now
}
console.log(claimObj);
let header = Base64.encodeURI('{"alg":"RS256","typ":"JWT"}');
let claimSet = Base64.encodeURI(JSON.stringify(claimObj));
let sig = new KJUR.crypto.Signature({ "alg": "SHA256withRSA" });
let privateKey = key.private_key;
let ret = encryptSignature();
let jwt = header + "." + claimSet + "." + ret;
console.log(jwt)
return jwt;
function encryptSignature() {
sig.init(privateKey);
sig.updateString(header + "." + claimSet);
let cleaned_hex = sig.sign()
let input = new Array();
for (let i = 0; i < cleaned_hex.length/2; i++) {
let h = cleaned_hex.substr(i * 2, 2);
input[i] = parseInt(h, 16);
}
let base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/"
let ret = '';
let i = 0;
let j = 0;
let char_array_3 = new Array(3);
let char_array_4 = new Array(4);
let in_len = input.length;
let pos = 0;
while (in_len--) {
char_array_3[i++] = input[pos++];
if (i == 3) {
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
char_array_4[3] = char_array_3[2] & 0x3f;
for (i = 0; (i < 4); i++)
ret += base64_chars.charAt(char_array_4[i]);
i = 0;
}
}
if (i) {
for (j = i; j < 3; j++)
char_array_3[j] = 0;
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
char_array_4[3] = char_array_3[2] & 0x3f;
for (j = 0; (j < i + 1); j++)
ret += base64_chars.charAt(char_array_4[j]);
while ((i++ < 3))
ret += '=';
}
return ret;
}
}
"無効な付与タイプ"と言われても、トークンとは関係ありません。おそらく、クライアントライブラリを試して、より良い結果が得られるかどうかを確認してください。また、暗号化を行うことでエラーが起こりにくくなります。あなたは完全なエラーを提供できますか? – paolo
フルエラーがそのdescriptive.Responseない ヘッダー: ヘッダ{_headers:マップ(8)、_normalizedNames:マップ(8)} OK: 偽 ステータス: 400 STATUSTEXT : 「OK " タイプ: URL: "https://www.googleapis.com/oauth2/v4/token" _body: " {↵ "エラー": "unsupported_grant_type"、↵ "ましたerror_description": "無効なg rant_type: "↵}↵" __proto__ : ボディ コンストラクタ : ƒ応答(responseOptions) のtoString : ƒ() __proto__ : オブジェクト – iamkhova