2015-11-06 76 views
1

你好我寫的OAuth 2庫訪問谷歌API和我的代碼如下二郎山谷歌的oauth2協議

jwt_create() -> 

    {ok,PemBin} = file:read_file("your-key-file.pem"), 
    PemEntry = public_key:pem_decode(PemBin), 
    [A,B] = PemEntry, 
    io:format("A:: ~p ~n",[A]), 
    PrivateKey = public_key:pem_entry_decode(PemEntry), 
    JwtHeaderJson = encode_json(jwt_header()), 
    JwtClaimsetJson = encode_json(jwt_claimset()), 
    ComputeSignature = compute_signature(JwtHeaderJson, JwtClaimsetJson, PrivateKey), 
    Z=binary:replace(
     binary:replace(<<JwtHeaderJson/binary, ".", JwtClaimsetJson/binary, ".", ComputeSignature/binary>>, 
        <<"+">>, <<"-">>, [global]), 
     <<"/">>, <<"_">>, [global]), 
    io:format("JWT:: ~p ~n",[Z]). 
compute_signature(Header, ClaimSet,#'RSAPrivateKey'{publicExponent=Exponent 

                  ,modulus=Modulus 

                  ,privateExponent=PrivateExponent}) -> 
    base64:encode(crypto:sign(rsa, sha256, <<Header/binary, ".", ClaimSet/binary>>, 
      [Exponent, Modulus, PrivateExponent])). 
encode_json(JWToken) -> 
    base64:encode(jsx:encode(JWToken)). 

我收到錯誤如下:

exception error: no function clause matching public_key:pem_entry_decode([{'PrivateKeyInfo',<<48,130,4,191,2,1,0,48,13,6,9,42,134, 72,134,247,13,1,1,1,5,0,4,130,4,...>>, not_encrypted}, {'Certificate',<<48,130,3,96,48,130,2,72,160,3,2,1,2,2,8, 79,59,244,35,60,15,3,155,48,...>>, not_encrypted}]) (public_key.erl, line 123) in function googleoauth:jwt_create/0 (src/googleoauth.erl, line 55)

請幫助我生成JWS和JWT for OAUTH 2以訪問谷歌apis

回答

1

您正在向public_key傳遞錯誤信息:pem_entry_decode/1:

這將解決你的問題:

PrivateKey = public_key:pem_entry_decode(A), 

PUBLIC_KEY:pem_entry_decode/1只接受一個pem_entry(),但PEM文件可以包含許多條目,也許你的代碼PemEntry = public_key:pem_decode(PemBin)應該讀PemEntries = public_key:pem_decode(PemBin)呢?

另外請注意,前面的行假設2個列表條目,你可能是這個意思而不是(雖然不確定你的意圖)?

[A|B] = PemEntry,