【发布时间】:2015-07-24 14:16:28
【问题描述】:
我已经用头撞墙 3 天了,试图让它发挥作用。
POST /oauth2/v3/token HTTP/1.1
Host: www.googleapis.com
Content-length: 495
Content-type: application/x-www-form-urlencoded
Authorization: Bearer ya29.cgEcY6meBrvaH6oe0nD_PtsFyMVqskiUYi7iJxapKHeEgPoIw8gMt0BJdIvRn1MfcEgzTS3_gTwI1w
grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI5MDgyOTgxNjA1NTktc2R1bGFpbWhsaGpxOTY5M2s1Z2E4c25pZjhh%0D%0ANzhlZ3BAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzY29wZSI6Imh0%0D%0AdHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvYW5hbHl0aWNzLnJlYWRvbmx5%0D%0AIiwiYXVkIjoiaHR0cHM6Ly9hY2NvdW50cy5nb29nbGUuY29tL28vb2F1dGgyL3Rv%0D%0Aa2VuIiwiZXhwIjoxNDMxNTE0MDUyLCJpYXQiOjE0MzE1MTEwNTJ9.[Cert]
HTTP/1.1 400 Bad Request
Content-length: 67
X-xss-protection: 1; mode=block
X-content-type-options: nosniff
Expires: Wed, 13 May 2015 10:08:00 GMT
Vary: Origin,X-Origin
Server: GSE
Cache-control: private, max-age=0
Date: Wed, 13 May 2015 10:08:00 GMT
X-frame-options: SAMEORIGIN
Content-type: application/json; charset=UTF-8
{
"error_description": "Bad Request",
"error": "invalid_grant"
}
所以,我在 PL/SQL 中创建它。甲骨文 12c。我已经设法获得 JWT 标头和 JWT Claim 设置以产生与谷歌文档相同的输出。当我创建证书时,我认为是问题发生了。
我是否需要“[-----BEGIN PRIVATE KEY-----”和 -----END PRIVATE KEY-----\n] 作为 SHA-256 的一部分加密。我应该对“新行”做些什么吗? \n 我应该用括号括起来吗?
我应该在什么时候进行 URL 编码?
以下示例中的代码是否足以加密?:http://jastraub.blogspot.co.uk/2009/07/hmacsha256-in-plsql.html
我已经附上了下面的函数,看看你是否能发现任何问题?
感谢您的帮助!
FUNCTION get_JWT (p_token_id ga_app_user.ID_TOKEN%TYPE)
RETURN VARCHAR2
IS
--Plain text
baseJWTheader VARCHAR2 (20000);
baseclaimSet VARCHAR2 (20000);
baseSigKey VARCHAR2 (20000);
--Seconds
sysSeconds NUMBER;
--Base64 Encoded
JWTheader VARCHAR2 (20000);
claimSet VARCHAR2 (20000);
sigKey VARCHAR2 (20000);
sigContent VARCHAR2 (20000);
--Returned value
output RAW (20000);
BEGIN
SELECT JWT_HEADER, JWT_CLAIM_SET, SIGNATURE
INTO baseJWTheader, baseclaimSet, baseSigKey
FROM dwman.ga_app_user au
WHERE AU.ID_TOKEN = p_token_id;
--DBMS_OUTPUT.PUT_LINE ('Base claim Set ' || baseclaimSet);
JWTheader :=
TRANSLATE (
UTL_RAW.cast_to_varchar2 (
UTL_ENCODE.BASE64_ENCODE (UTL_RAW.CAST_TO_RAW (baseJWTheader))),
'+/',
'-_');
SELECT ( SYSDATE
- TO_DATE ('01-01-1970 00:00:00', 'DD-MM-YYYY HH24:MI:SS'))
* 24
* 60
* 60
INTO sysSeconds
FROM DUAL;
baseclaimSet :=
REPLACE (baseclaimSet, '#EXPIRE#', ROUND (sysSeconds + 3000));
baseclaimSet := REPLACE (baseclaimSet, '#START#', ROUND (sysSeconds));
--DBMS_OUTPUT.PUT_LINE ('Claim Set ' || baseclaimSet);
claimSet := UTL_RAW.cast_to_varchar2 (
UTL_ENCODE.BASE64_ENCODE (UTL_RAW.CAST_TO_RAW (baseclaimSet)));
sigKey := baseSigKey;
sigContent := JWTheader || '.' || claimSet;
--DBMS_OUTPUT.PUT_LINE('Sig Content '||sigContent);
sigContent := REPLACE (sigContent, CHR (10), '');
sigContent := REPLACE (sigContent, CHR (13), '');
/*
FOR V_TR in 1..length(sigContent)
LOOP
DBMS_OUTPUT.PUT_LINE (substr(sigContent,V_TR,1)||'='||to_char(ASCII(substr(sigContent,V_TR,1))));
END LOOP;
*/
sigContent :=
sigContent
|| '.'
|| google_signature (sigContent, sigKey);
RETURN UTL_URL.ESCAPE(sigContent, TRUE, 'UTF-8');
END get_JWT;
【问题讨论】:
-
你到底想在这里做什么? invalid_grant 通常表示时间有问题。
-
感谢您的评论。我正在尝试连接到 googleAnalytics 数据以将其拉入数据仓库。我遵循此处所述的代码:developers.google.com/identity/protocols/OAuth2ServiceAccount 在 HTTP/Rest 部分下。我已经接近用 java 编写这个 ETL 过程了,但不认为这会很费力。
-
而您在 PL/SQL 中这样做?还是我应该说你想直接在 PL/SQL 中执行此操作?
-
您不反对将 java 加载到数据库中,可能不做完整的 Api,但是 JWT 帮助程序库可能就足够了?
-
@Fudztown - 我刚刚完成了一个简单的 java-jersey-rest 令牌生成器。因为我可以在 pl/sql 中做任何其他事情,所以我只能在 db 服务器上的嵌入式容器战争中运行它。签名是 /rest/token/new?iss=&sub=&scope=&aud=&key= 并且只返回 jwt 令牌。我刚刚习惯于知道 pl/sql 有限制,而快速休息电话是我通常绕过它们的方式。由于生成的访问代码在一小时内到期,因此 java 中的 cron 作业每小时生成一个并将其存储在数据库中是另一个次优解决方案。
标签: plsql google-oauth google-analytics-api oracle12c service-accounts