//
// OAuth20Credentials.h
//
// $Id$
//
// Library: Net
// Package: OAuth
// Module:	OAuth20Credentials
//
// Definition of the OAuth20Credentials class.
//
// Copyright (c) 2014, Applied Informatics Software Engineering GmbH.
// and Contributors.
//
// SPDX-License-Identifier:	BSL-1.0
//


#ifndef Net_OAuth20Credentials_INCLUDED
#define Net_OAuth20Credentials_INCLUDED


#include "Poco/Net/Net.h"


namespace Poco {
namespace Net {


class HTTPRequest;


class Net_API OAuth20Credentials
	/// This class implements OAuth 2.0 authentication for HTTP requests,
	/// via Bearer tokens in the Authorization header, 
	/// according to RFC 6749 and RFC 6750.
	///
	/// To add an Authorization header containing a bearer token
	/// to a HTTPRequest object, create an OAuth20Credentials object
	/// with the bearer token and call authenticate().
	///
	/// The bearer token can also be extracted from a HTTPRequest
	/// by creating the OAuth20Credentials object with a HTTPRequest
	/// object containing a "Bearer" Authorization header and
	/// calling getBearerToken().
	///
	/// The authorization header scheme can be changed from 
	/// "Bearer" to a custom value. For example, GitHub uses
	/// the "token" scheme.
{
public:
	OAuth20Credentials();
		/// Creates an empty OAuth20Credentials object.

	explicit OAuth20Credentials(const std::string& bearerToken);
		/// Creates an OAuth20Credentials object with the given bearer token.

	OAuth20Credentials(const std::string& bearerToken, const std::string& scheme);
		/// Creates an OAuth20Credentials object with the given bearer token
		/// and authorization scheme, which overrides the default scheme ("Bearer").
		///
		/// This is useful for services like GitHub, which use "token" as scheme.

	explicit OAuth20Credentials(const HTTPRequest& request);
		/// Creates an OAuth20Credentials object from a HTTPRequest object.
		///
		/// Extracts bearer token from the Authorization header, which
		/// must use the "Bearer" authorization scheme.
		///
		/// Throws a NotAuthenticatedException if the request does
		/// not contain a bearer token in the Authorization header.

	OAuth20Credentials(const HTTPRequest& request, const std::string& scheme);
		/// Creates an OAuth20Credentials object from a HTTPRequest object.
		///
		/// Extracts bearer token from the Authorization header, which must
		/// use the given authorization scheme.
		///
		/// Throws a NotAuthenticatedException if the request does
		/// not contain a bearer token in the Authorization header.

	~OAuth20Credentials();
		/// Destroys the HTTPCredentials.

	void setBearerToken(const std::string& bearerToken);
		/// Sets the bearer token.
		
	const std::string& getBearerToken() const;
		/// Returns the bearer token.

	void setScheme(const std::string& scheme);
		/// Sets the Authorization header scheme.
		
	const std::string& getScheme() const;
		/// Returns the Authorization header scheme.
		
	void authenticate(HTTPRequest& request);
		/// Adds an Authorization header containing the bearer token to
		/// the HTTPRequest.

	static const std::string SCHEME;

protected:
	void extractBearerToken(const HTTPRequest& request);
		/// Extracts the bearer token from the HTTPRequest.
		
private:
	OAuth20Credentials(const OAuth20Credentials&);
	OAuth20Credentials& operator = (const OAuth20Credentials&);
	
	std::string _bearerToken;
	std::string _scheme;
};


//
// inlines
//
inline const std::string& OAuth20Credentials::getBearerToken() const
{
	return _bearerToken;
}


inline const std::string& OAuth20Credentials::getScheme() const
{
	return _scheme;
}


} } // namespace Poco::Net


#endif // Net_OAuth20Credentials_INCLUDED
