Skip to content

Instantly share code, notes, and snippets.

@jfcote87
Last active August 29, 2015 14:15
Show Gist options
  • Select an option

  • Save jfcote87/4fa7387925b99a7b7808 to your computer and use it in GitHub Desktop.

Select an option

Save jfcote87/4fa7387925b99a7b7808 to your computer and use it in GitHub Desktop.
package main
import (
"golang.org/x/oauth2"
"golang.org/x/oauth2/google"
"golang.org/x/oauth2/jwt"
"log"
)
// Private key generated on my machine.
var properlyEncodedKey = `-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDBWQJZouUL+daxeuka++pm0+yathjVW7zTFobTdHo2FFo5Jumq
LkMVL0AX7LiOEYTPoyGj9h/n64QDO2SrVKYfnyFQ6PpIqk/fP+O1hdFOwNMuSf61
q1WvnSjWGUdZKo8lkP69Tdzw6nHIYjRWR6YwMOMiWghlJVqbaAYyASCUbQIDAQAB
AoGAQZtQXtYVXpDyNtr8Cjn8+dNjb8PmfU9ZrU7xhQL7DSquysHXe/WisaeM2hFr
NlnfdQ1nttknTmzuKKKYsEJS88PQJ6imHe5pFJpYTpV9q/pM2DLxbu8dcNTQXcfO
HsYx261nPA/gsIQqv3Rg8I8hAy2JKAE/yrcOv+f2hxVYtsECQQD7ZfuRKgw2IiZA
RtDAPN546YEvbyhQNM2+AOgzJWtacEaISVGqqgficjtr1iXJ7Gw+prXwNLOcj5RU
IyLqatnpAkEAxOMCW0UBZF9rRvnIjBBVwgs3RWl482EqO2vF7YwbfP9362l+noQz
x3ius7uhspfHap90GT8ZaEROHtdZ0y8P5QJANFeGajHz+u1fQ3C7E9tYgpozYHnn
TdPApnev4L5AvMK1nLiPPVZLb/VSs+ARXBpSazTwmoOOheFLA72RDneSyQJBAK7v
XMqnd2MtfO3lRhFc+jWdLZDY9ASbUqDVU1mLYWkgu/ZJF53UrQUQ73j2v+clAKR1
5PwBmpuQBTFV+pOvfxkCQQDFaPKB2rH9tPLMgbuybdSLQNvML4OSt5U2YmBCioqd
m5cEqNzEyEoYIoCG6XTONUq2DsKjQF5/eaFUfTuxSAHc
-----END RSA PRIVATE KEY-----`
var improperlyEncodedKey = `-----BEGIN RSA PRIVATE KEY-----\n
MIICXQIBAAKBgQDBWQJZouUL+daxeuka++pm0+yathjVW7zTFobTdHo2FFo5Jumq\n
LkMVL0AX7LiOEYTPoyGj9h/n64QDO2SrVKYfnyFQ6PpIqk/fP+O1hdFOwNMuSf61\n
q1WvnSjWGUdZKo8lkP69Tdzw6nHIYjRWR6YwMOMiWghlJVqbaAYyASCUbQIDAQAB\n
AoGAQZtQXtYVXpDyNtr8Cjn8+dNjb8PmfU9ZrU7xhQL7DSquysHXe/WisaeM2hFr\n
NlnfdQ1nttknTmzuKKKYsEJS88PQJ6imHe5pFJpYTpV9q/pM2DLxbu8dcNTQXcfO\n
HsYx261nPA/gsIQqv3Rg8I8hAy2JKAE/yrcOv+f2hxVYtsECQQD7ZfuRKgw2IiZA\n
RtDAPN546YEvbyhQNM2+AOgzJWtacEaISVGqqgficjtr1iXJ7Gw+prXwNLOcj5RU\n
IyLqatnpAkEAxOMCW0UBZF9rRvnIjBBVwgs3RWl482EqO2vF7YwbfP9362l+noQz\n
x3ius7uhspfHap90GT8ZaEROHtdZ0y8P5QJANFeGajHz+u1fQ3C7E9tYgpozYHnn\n
TdPApnev4L5AvMK1nLiPPVZLb/VSs+ARXBpSazTwmoOOheFLA72RDneSyQJBAK7v\n
XMqnd2MtfO3lRhFc+jWdLZDY9ASbUqDVU1mLYWkgu/ZJF53UrQUQ73j2v+clAKR1\n
5PwBmpuQBTFV+pOvfxkCQQDFaPKB2rH9tPLMgbuybdSLQNvML4OSt5U2YmBCioqd\n
m5cEqNzEyEoYIoCG6XTONUq2DsKjQF5/eaFUfTuxSAHc\n
-----END RSA PRIVATE KEY-----`
func main() {
// The properly encoded key formats the jwt assertion and sends it to the server.
// In this case the server correctly returns a 400 Error because there is no
// [email protected].
c := getConfig(properlyEncodedKey)
_, err := c.TokenSource(oauth2.NoContext).Token()
log.Printf("Err = %#v", err)
// Prints:
// 2015/02/20 11:07:37 Err = oauth2: cannot fetch token: 400 Bad Request
// Response: {
// "error" : "invalid_grant"
// }
// Using an improperly encoded pem file, internal.ParseKey(js.conf.PrivateKey) fails
// and returns an unhelpful error.
c = getConfig(improperlyEncodedKey)
_, err = c.TokenSource(oauth2.NoContext).Token()
log.Printf("Err = %v", err)
// Prints:
// 2015/02/20 11:07:37 Err = asn1: structure error: tags don't match (16 vs {class:0 tag:13 length:45 isCompound:true}) {optional:false explicit:false application:false defaultValue:<nil> tag:<nil> stringType:0 set:false omitEmpty:false} pkcs1PrivateKey @2
}
func getConfig(pem string) *jwt.Config {
return &jwt.Config{
Email: "[email protected]",
PrivateKey: []byte(pem),
TokenURL: google.JWTTokenURL,
Scopes: []string{"profile"},
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment