// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

library fuchsia.identity.tokens;

using zx;

/// A long-lived OAuth 2.0 Refresh Token.
table OauthRefreshToken {
    /// The content of the token.
    // Note no maximum size is defined. The OAuth spec states clients should
    // avoid making assumptions about token sizes. No max size is guaranteed to
    // accomodate all implementations but we do not know of any implementation
    // where token size exceeds a few kilobytes so exceeding the maximum size of
    // a FIDL message is very unlikely.
    1: string content;
    /// A unique identifier for the account that the token refers to, as
    /// specified by the authorization server.
    2: AccountId account_id;
};

/// An OAuth 2.0 Access Token.
table OauthAccessToken {
    /// The content of the token.
    // Note no maximum size is defined. The OAuth spec states clients should
    // avoid making assumptions about token sizes. No max size is guaranteed to
    // accomodate all implementations but we do not know of any implementation
    // where token size exceeds a few kilobytes so exceeding the maximum size of
    // a FIDL message is very unlikely.
    1: string content;
    /// The UTC time at which the token will expire. If the field is absent the
    /// token does not have a fixed expiry time.
    2: zx.time expiry_time;
};

/// An OpenID Connect ID Token.
table OpenIdToken {
    /// The content of the JSON Web Token.
    // Note no maximum size is defined. The OpenID Connect spec does not provide
    // an upper bound but we do not know of any implementation where size
    // exceeds a few kilobytes so exceeding the maximum size of a FIDL message
    // is very unlikely.
    1: string content;
    /// The UTC time at which the token will expire. If the field is absent the
    /// token does not have a fixed expiry time.
    2: zx.time expiry_time;
};

/// The reponse from an OpenID Connect UserInfo endpoint.
table OpenIdUserInfo {
    /// The subject to which this info applies.
    1: string:255 subject;
    /// The user's full name.
    // Note no maximum size is defined. The OpenID Connect spec does not provide
    // an upper bound but we do not know of any implementation where size
    // exceeds a few hundred bytes so exceeding the maximum size of a FIDL
    // message is very unlikely.
    2: string name;
    /// The user's email address.
    // Note no maximum size is defined. The OpenID Connect spec does not provide
    // an upper bound but we do not know of any implementation where size
    // exceeds a few kilobytes so exceeding the maximum size of a FIDL message
    // is very unlikely.
    3: string email;
    /// A URL to a profile picture for the user.
    // Note no maximum size is defined. The OpenID Connect spec does not provide
    // an upper bound but we do not know of any implementation where size
    // exceeds a few kilobytes so exceeding the maximum size of a FIDL message
    // is very unlikely.
    4: string picture;
};
