mirror of
https://github.com/librespot-org/librespot.git
synced 2025-10-03 01:39:28 +02:00
Credentials with access token (oauth) (#1309)
* core: Create credentials from access token via OAuth2 * core: Credentials.username is optional: not required for token auth. * core: store auth data within session. We might need this later if need to re-auth and original creds are no longer valid/available. * bin: New --token arg for using Spotify access token. Specify 0 to manually enter the auth code (headless). * bin: Added --enable-oauth / -j option. Using --password / -p option will error and exit. * core: reconnect session if using token authentication Token authenticated sessions cannot use keymaster. So reconnect using the reusable credentials we just obtained. Can perhaps remove this workaround once keymaster is replaced with login5. * examples: replace password login with token login
This commit is contained in:
parent
f6473319f6
commit
4f9151c642
17 changed files with 629 additions and 88 deletions
|
@ -7,23 +7,34 @@ const SCOPES: &str =
|
|||
|
||||
#[tokio::main]
|
||||
async fn main() {
|
||||
let session_config = SessionConfig::default();
|
||||
let mut builder = env_logger::Builder::new();
|
||||
builder.parse_filters("librespot=trace");
|
||||
builder.init();
|
||||
|
||||
let mut session_config = SessionConfig::default();
|
||||
|
||||
let args: Vec<_> = env::args().collect();
|
||||
if args.len() != 3 {
|
||||
eprintln!("Usage: {} USERNAME PASSWORD", args[0]);
|
||||
if args.len() == 3 {
|
||||
// Only special client IDs have sufficient privileges e.g. Spotify's.
|
||||
session_config.client_id = args[2].clone()
|
||||
} else if args.len() != 2 {
|
||||
eprintln!("Usage: {} ACCESS_TOKEN [CLIENT_ID]", args[0]);
|
||||
return;
|
||||
}
|
||||
let access_token = &args[1];
|
||||
|
||||
println!("Connecting...");
|
||||
let credentials = Credentials::with_password(&args[1], &args[2]);
|
||||
let session = Session::new(session_config, None);
|
||||
|
||||
// Now create a new session with that token.
|
||||
let session = Session::new(session_config.clone(), None);
|
||||
let credentials = Credentials::with_access_token(access_token);
|
||||
println!("Connecting with token..");
|
||||
match session.connect(credentials, false).await {
|
||||
Ok(()) => println!(
|
||||
"Token: {:#?}",
|
||||
session.token_provider().get_token(SCOPES).await.unwrap()
|
||||
),
|
||||
Err(e) => println!("Error connecting: {}", e),
|
||||
}
|
||||
Ok(()) => println!("Session username: {:#?}", session.username()),
|
||||
Err(e) => {
|
||||
println!("Error connecting: {e}");
|
||||
return;
|
||||
}
|
||||
};
|
||||
|
||||
let token = session.token_provider().get_token(SCOPES).await.unwrap();
|
||||
println!("Got me a token: {token:#?}");
|
||||
}
|
||||
|
|
|
@ -22,13 +22,13 @@ async fn main() {
|
|||
let audio_format = AudioFormat::default();
|
||||
|
||||
let args: Vec<_> = env::args().collect();
|
||||
if args.len() != 4 {
|
||||
eprintln!("Usage: {} USERNAME PASSWORD TRACK", args[0]);
|
||||
if args.len() != 3 {
|
||||
eprintln!("Usage: {} ACCESS_TOKEN TRACK", args[0]);
|
||||
return;
|
||||
}
|
||||
let credentials = Credentials::with_password(&args[1], &args[2]);
|
||||
let credentials = Credentials::with_access_token(&args[1]);
|
||||
|
||||
let mut track = SpotifyId::from_base62(&args[3]).unwrap();
|
||||
let mut track = SpotifyId::from_base62(&args[2]).unwrap();
|
||||
track.item_type = SpotifyItemType::Track;
|
||||
|
||||
let backend = audio_backend::find(None).unwrap();
|
||||
|
|
|
@ -28,16 +28,16 @@ async fn main() {
|
|||
let connect_config = ConnectConfig::default();
|
||||
|
||||
let mut args: Vec<_> = env::args().collect();
|
||||
let context_uri = if args.len() == 4 {
|
||||
let context_uri = if args.len() == 3 {
|
||||
args.pop().unwrap()
|
||||
} else if args.len() == 3 {
|
||||
} else if args.len() == 2 {
|
||||
String::from("spotify:album:79dL7FLiJFOO0EoehUHQBv")
|
||||
} else {
|
||||
eprintln!("Usage: {} USERNAME PASSWORD (ALBUM URI)", args[0]);
|
||||
eprintln!("Usage: {} ACCESS_TOKEN (ALBUM URI)", args[0]);
|
||||
return;
|
||||
};
|
||||
|
||||
let credentials = Credentials::with_password(&args[1], &args[2]);
|
||||
let credentials = Credentials::with_access_token(&args[1]);
|
||||
let backend = audio_backend::find(None).unwrap();
|
||||
|
||||
println!("Connecting...");
|
||||
|
|
|
@ -13,13 +13,13 @@ async fn main() {
|
|||
let session_config = SessionConfig::default();
|
||||
|
||||
let args: Vec<_> = env::args().collect();
|
||||
if args.len() != 4 {
|
||||
eprintln!("Usage: {} USERNAME PASSWORD PLAYLIST", args[0]);
|
||||
if args.len() != 3 {
|
||||
eprintln!("Usage: {} ACCESS_TOKEN PLAYLIST", args[0]);
|
||||
return;
|
||||
}
|
||||
let credentials = Credentials::with_password(&args[1], &args[2]);
|
||||
let credentials = Credentials::with_access_token(&args[1]);
|
||||
|
||||
let plist_uri = SpotifyId::from_uri(&args[3]).unwrap_or_else(|_| {
|
||||
let plist_uri = SpotifyId::from_uri(&args[2]).unwrap_or_else(|_| {
|
||||
eprintln!(
|
||||
"PLAYLIST should be a playlist URI such as: \
|
||||
\"spotify:playlist:37i9dQZF1DXec50AjHrNTq\""
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue