OAuth 2 Token (JWT) の Decode


ご参考のため、OAuth で使用する Id Token の Decode (または Parse) プログラムを掲載しておきます。(RFC 4648 に従って Encode されています。)

なお、OAuth の仕様では、id token についてこの JWT フォーマット (RFC 7519 参照) を使用していますが、Azure AD では独自に登録された custom api でも verify できるよう、id token と同じフォーマットの access token が使用されているため、ここで紹介する decode 方法で Azure AD の access token も解析可能です。(OAuth の仕様では access token のフォーマットについては自由であり、実際、Microsoft Account、Google Account など他の Provider では access token には独自の ticket が使われています。)

. . .

static void Main(string[] args)
{
  // Original Token String
  // (Context Token, Id Token, etc)
  string token = "eyJ0eXAiOiJKV . . .";

  string[] strArray = token.Split(new char[] { '.' });

  Console.WriteLine("arg1 : {0}", ContextParse(strArray[0]));
  Console.WriteLine("arg2 : {0}", ContextParse(strArray[1]));
  Console.WriteLine("arg3 : {0}", strArray[2]);

  Console.ReadLine();
}

static string ContextParse(string arg)
{    
  string s = arg;

  s = s.Replace('-', '+').Replace('_', '/');
  switch ((s.Length % 4))
  {
    case 0:
      break;
    case 1:
      break;
    case 2:
      s = s + "==";
      break;
    case 3:
      s = s + '=';
      break;
  }
  byte[] decodeByte = Convert.FromBase64String(s);
  string decodeStr = Encoding.UTF8.GetString(decodeByte);

  return decodeStr;
}
. . .

上記の 3 番目の要素は、Signature のバイト列をエンコードした文字列です。上記の ContextParse と同様のロジック (ただし、最後の Encoding.UTF8.GetString は不要です) でバイト列に戻すことができますので、証明書の検証をおこなう際は、この方法でバイト列に戻してください。

解説したように、Id token や Azure AD が使用する Access Token、Office 365 (SharePoint Online) が App に渡す Context Token など、Microsoft の Platform が使用される多くの token で、この JWT トークンによるエンコード方法が採用されています。

Context Token に Refresh Token が含まれていることや、Access Token に actor (App Context) と nameid (User Context) が含まれているなど、いろいろな確認に役立ちますので、是非、今後のデバッグにお役立てください。(Refresh Token は、それ自体、意味を持たないトークン情報です。Access Token を発行するために使用します。)

補足 : 「Office 365 Home (Outlook.com, OneDrive, etc) 開発」で記載している Windows Live の access token は compact tickets であり、この方法で decode できません。
Windows Live (Office 365 Home, Solo) の場合、代わりに、authentication token を使って decode (検証) します。

2015/02 追記 : Azure AD の Access Token の内容 (JWT, Signature など中身) の検証方法 (verify) については、「Azure AD : Service の開発 (access token の validation check)」に掲載しました。

 

Comments (0)

Skip to main content