<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic spotify webapi auth and requests in Spotify for Developers</title>
    <link>https://community.spotify.com/t5/Spotify-for-Developers/spotify-webapi-auth-and-requests/m-p/6289534#M14864</link>
    <description>&lt;P&gt;&lt;SPAN&gt;for the past few weeks ive been trying to implement spotify webapi on my app to auth users, get their pfp and handler and also get their currently playing track name and artist name but had no success. id appreciate any help.&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;AuthViewModel:&lt;/STRONG&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;DIV&gt;&lt;PRE&gt;&lt;SPAN&gt;package &lt;/SPAN&gt;com.example.grooveshare.viewmodels&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;android.content.Context&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;android.content.Intent&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;android.net.Uri&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;android.util.Log&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;androidx.activity.result.ActivityResultLauncher&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;androidx.lifecycle.ViewModel&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;net.openid.appauth.AuthorizationException&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;net.openid.appauth.AuthorizationRequest&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;net.openid.appauth.AuthorizationService&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;net.openid.appauth.AuthorizationServiceConfiguration&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;net.openid.appauth.AuthorizationResponse&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;net.openid.appauth.ResponseTypeValues&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;java.security.MessageDigest&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;java.security.SecureRandom&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;java.util.Base64&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;class &lt;/SPAN&gt;SpotifyAuthViewModel : ViewModel() {&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;private val &lt;/SPAN&gt;&lt;SPAN&gt;clientId &lt;/SPAN&gt;= &lt;SPAN&gt;""&lt;BR /&gt;&lt;/SPAN&gt;    &lt;SPAN&gt;private val &lt;/SPAN&gt;&lt;SPAN&gt;redirectUri &lt;/SPAN&gt;= &lt;SPAN&gt;"myapp://callback"&lt;BR /&gt;&lt;/SPAN&gt;    &lt;SPAN&gt;private val &lt;/SPAN&gt;&lt;SPAN&gt;authorizationEndpoint &lt;/SPAN&gt;= &lt;SPAN&gt;"https://accounts.spotify.com/authorize"&lt;BR /&gt;&lt;/SPAN&gt;    &lt;SPAN&gt;private val &lt;/SPAN&gt;&lt;SPAN&gt;tokenEndpoint &lt;/SPAN&gt;= &lt;SPAN&gt;"https://accounts.spotify.com/api/token"&lt;BR /&gt;&lt;/SPAN&gt;    &lt;SPAN&gt;private val &lt;/SPAN&gt;&lt;SPAN&gt;codeVerifier &lt;/SPAN&gt;= generateCodeVerifier()&lt;BR /&gt;    &lt;SPAN&gt;private lateinit var &lt;/SPAN&gt;&lt;SPAN&gt;authService&lt;/SPAN&gt;: AuthorizationService&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;fun &lt;/SPAN&gt;&lt;SPAN&gt;initializeAuthService&lt;/SPAN&gt;(context: Context) {&lt;BR /&gt;        &lt;SPAN&gt;authService &lt;/SPAN&gt;= AuthorizationService(context)&lt;BR /&gt;        Log.d(&lt;SPAN&gt;"SpotifyAuth"&lt;/SPAN&gt;, &lt;SPAN&gt;"AuthorizationService initialized"&lt;/SPAN&gt;)&lt;BR /&gt;    }&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;private fun &lt;/SPAN&gt;&lt;SPAN&gt;generateCodeVerifier&lt;/SPAN&gt;(): String {&lt;BR /&gt;        &lt;SPAN&gt;val &lt;/SPAN&gt;secureRandom = SecureRandom()&lt;BR /&gt;        &lt;SPAN&gt;val &lt;/SPAN&gt;codeVerifier = ByteArray(&lt;SPAN&gt;32&lt;/SPAN&gt;)&lt;BR /&gt;        secureRandom.nextBytes(codeVerifier)&lt;BR /&gt;        &lt;SPAN&gt;return &lt;/SPAN&gt;Base64.getUrlEncoder().withoutPadding().encodeToString(codeVerifier)&lt;BR /&gt;    }&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;private fun &lt;/SPAN&gt;&lt;SPAN&gt;generateCodeChallenge&lt;/SPAN&gt;(verifier: String): String {&lt;BR /&gt;        &lt;SPAN&gt;val &lt;/SPAN&gt;bytes = verifier.&lt;SPAN&gt;toByteArray&lt;/SPAN&gt;(Charsets.&lt;SPAN&gt;US_ASCII&lt;/SPAN&gt;)&lt;BR /&gt;        &lt;SPAN&gt;val &lt;/SPAN&gt;messageDigest = MessageDigest.getInstance(&lt;SPAN&gt;"SHA-256"&lt;/SPAN&gt;)&lt;BR /&gt;        &lt;SPAN&gt;val &lt;/SPAN&gt;digest = messageDigest.digest(bytes)&lt;BR /&gt;        &lt;SPAN&gt;return &lt;/SPAN&gt;Base64.getUrlEncoder().withoutPadding().encodeToString(digest)&lt;BR /&gt;    }&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;fun &lt;/SPAN&gt;&lt;SPAN&gt;authenticate&lt;/SPAN&gt;(authResultLauncher: ActivityResultLauncher&amp;lt;Intent&amp;gt;) {&lt;BR /&gt;        &lt;SPAN&gt;if &lt;/SPAN&gt;(!::&lt;SPAN&gt;authService&lt;/SPAN&gt;.&lt;SPAN&gt;isInitialized&lt;/SPAN&gt;) {&lt;BR /&gt;            Log.e(&lt;SPAN&gt;"SpotifyAuth"&lt;/SPAN&gt;, &lt;SPAN&gt;"AuthorizationService is not initialized"&lt;/SPAN&gt;)&lt;BR /&gt;            &lt;SPAN&gt;return&lt;BR /&gt;&lt;/SPAN&gt;        }&lt;BR /&gt;&lt;BR /&gt;        &lt;SPAN&gt;val &lt;/SPAN&gt;serviceConfig = AuthorizationServiceConfiguration(&lt;BR /&gt;            Uri.parse(&lt;SPAN&gt;authorizationEndpoint&lt;/SPAN&gt;),&lt;BR /&gt;            Uri.parse(&lt;SPAN&gt;tokenEndpoint&lt;/SPAN&gt;)&lt;BR /&gt;        )&lt;BR /&gt;&lt;BR /&gt;        &lt;SPAN&gt;val &lt;/SPAN&gt;authRequest = AuthorizationRequest.Builder(&lt;BR /&gt;            serviceConfig,&lt;BR /&gt;            &lt;SPAN&gt;clientId&lt;/SPAN&gt;,&lt;BR /&gt;            ResponseTypeValues.&lt;SPAN&gt;CODE&lt;/SPAN&gt;,&lt;BR /&gt;            Uri.parse(&lt;SPAN&gt;redirectUri&lt;/SPAN&gt;)&lt;BR /&gt;        ).setCodeVerifier(&lt;SPAN&gt;codeVerifier&lt;/SPAN&gt;, generateCodeChallenge(&lt;SPAN&gt;codeVerifier&lt;/SPAN&gt;), &lt;SPAN&gt;"S256"&lt;/SPAN&gt;)&lt;BR /&gt;            .setScope(&lt;SPAN&gt;"user-read-currently-playing user-read-email user-read-private"&lt;/SPAN&gt;)&lt;BR /&gt;            .build()&lt;BR /&gt;&lt;BR /&gt;        Log.d(&lt;SPAN&gt;"SpotifyAuth"&lt;/SPAN&gt;, &lt;SPAN&gt;"Authorization Request URI: &lt;/SPAN&gt;&lt;SPAN&gt;${&lt;/SPAN&gt;authRequest.toUri()&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;)&lt;BR /&gt;&lt;BR /&gt;        &lt;SPAN&gt;val &lt;/SPAN&gt;authIntent = &lt;SPAN&gt;authService&lt;/SPAN&gt;.getAuthorizationRequestIntent(authRequest)&lt;BR /&gt;        authResultLauncher.launch(authIntent) &lt;SPAN&gt;// Launch the auth intent using the Activity Result API&lt;BR /&gt;&lt;/SPAN&gt;    }&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;fun &lt;/SPAN&gt;&lt;SPAN&gt;handleAuthResponse&lt;/SPAN&gt;(intent: Intent?) {&lt;BR /&gt;        Log.d(&lt;SPAN&gt;"SpotifyAuth"&lt;/SPAN&gt;, &lt;SPAN&gt;"Received Intent: &lt;/SPAN&gt;&lt;SPAN&gt;$&lt;/SPAN&gt;intent&lt;SPAN&gt;"&lt;/SPAN&gt;)&lt;BR /&gt;        Log.d(&lt;SPAN&gt;"SpotifyAuth"&lt;/SPAN&gt;, &lt;SPAN&gt;"Intent Action: &lt;/SPAN&gt;&lt;SPAN&gt;${&lt;/SPAN&gt;intent?.&lt;SPAN&gt;action&lt;/SPAN&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;)&lt;BR /&gt;        Log.d(&lt;SPAN&gt;"SpotifyAuth"&lt;/SPAN&gt;, &lt;SPAN&gt;"Intent Data: &lt;/SPAN&gt;&lt;SPAN&gt;${&lt;/SPAN&gt;intent?.&lt;SPAN&gt;data&lt;/SPAN&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;)&lt;BR /&gt;&lt;BR /&gt;        &lt;SPAN&gt;if &lt;/SPAN&gt;(intent == &lt;SPAN&gt;null &lt;/SPAN&gt;|| &lt;SPAN&gt;intent&lt;/SPAN&gt;.&lt;SPAN&gt;data &lt;/SPAN&gt;== &lt;SPAN&gt;null&lt;/SPAN&gt;) {&lt;BR /&gt;            Log.e(&lt;SPAN&gt;"SpotifyAuth"&lt;/SPAN&gt;, &lt;SPAN&gt;"Intent or data is null"&lt;/SPAN&gt;)&lt;BR /&gt;            &lt;SPAN&gt;return&lt;BR /&gt;&lt;/SPAN&gt;        }&lt;BR /&gt;&lt;BR /&gt;        &lt;SPAN&gt;val &lt;/SPAN&gt;authorizationResponse = AuthorizationResponse.fromIntent(&lt;SPAN&gt;intent&lt;/SPAN&gt;)&lt;BR /&gt;        &lt;SPAN&gt;val &lt;/SPAN&gt;authorizationException = AuthorizationException.fromIntent(intent)&lt;BR /&gt;&lt;BR /&gt;        &lt;SPAN&gt;if &lt;/SPAN&gt;(authorizationResponse != &lt;SPAN&gt;null&lt;/SPAN&gt;) {&lt;BR /&gt;            Log.d(&lt;SPAN&gt;"SpotifyAuth"&lt;/SPAN&gt;, &lt;SPAN&gt;"Authorization Response: &lt;/SPAN&gt;&lt;SPAN&gt;${&lt;/SPAN&gt;&lt;SPAN&gt;authorizationResponse&lt;/SPAN&gt;.jsonSerializeString()&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;)&lt;BR /&gt;            &lt;SPAN&gt;val &lt;/SPAN&gt;tokenRequest = &lt;SPAN&gt;authorizationResponse&lt;/SPAN&gt;.createTokenExchangeRequest()&lt;BR /&gt;&lt;BR /&gt;            &lt;SPAN&gt;authService&lt;/SPAN&gt;.performTokenRequest(tokenRequest) &lt;SPAN&gt;{ &lt;/SPAN&gt;tokenResponse, exception &lt;SPAN&gt;-&amp;gt;&lt;BR /&gt;&lt;/SPAN&gt;                &lt;SPAN&gt;if &lt;/SPAN&gt;(tokenResponse != &lt;SPAN&gt;null&lt;/SPAN&gt;) {&lt;BR /&gt;                    Log.d(&lt;SPAN&gt;"SpotifyAuth"&lt;/SPAN&gt;, &lt;SPAN&gt;"Token Response: &lt;/SPAN&gt;&lt;SPAN&gt;${&lt;/SPAN&gt;&lt;SPAN&gt;tokenResponse&lt;/SPAN&gt;.jsonSerializeString()&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;)&lt;BR /&gt;                    &lt;SPAN&gt;val &lt;/SPAN&gt;accessToken = &lt;SPAN&gt;tokenResponse&lt;/SPAN&gt;.&lt;SPAN&gt;accessToken&lt;BR /&gt;&lt;/SPAN&gt;                    Log.d(&lt;SPAN&gt;"SpotifyAuth"&lt;/SPAN&gt;, &lt;SPAN&gt;"Access Token: &lt;/SPAN&gt;&lt;SPAN&gt;$&lt;/SPAN&gt;accessToken&lt;SPAN&gt;"&lt;/SPAN&gt;)&lt;BR /&gt;                    &lt;SPAN&gt;// &lt;/SPAN&gt;&lt;SPAN&gt;TODO: Use the access token to fetch user profile and currently playing track&lt;BR /&gt;&lt;/SPAN&gt;                } &lt;SPAN&gt;else &lt;/SPAN&gt;{&lt;BR /&gt;                    Log.e(&lt;SPAN&gt;"SpotifyAuth"&lt;/SPAN&gt;, &lt;SPAN&gt;"Token Exchange Failed: &lt;/SPAN&gt;&lt;SPAN&gt;${&lt;/SPAN&gt;exception?.&lt;SPAN&gt;errorDescription&lt;/SPAN&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;)&lt;BR /&gt;                }&lt;BR /&gt;            &lt;SPAN&gt;}&lt;BR /&gt;&lt;/SPAN&gt;        } &lt;SPAN&gt;else &lt;/SPAN&gt;{&lt;BR /&gt;            Log.e(&lt;SPAN&gt;"SpotifyAuth"&lt;/SPAN&gt;, &lt;SPAN&gt;"Authorization Failed: &lt;/SPAN&gt;&lt;SPAN&gt;${&lt;/SPAN&gt;authorizationException?.&lt;SPAN&gt;errorDescription&lt;/SPAN&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;)&lt;BR /&gt;        }&lt;BR /&gt;    }&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;override fun &lt;/SPAN&gt;&lt;SPAN&gt;onCleared&lt;/SPAN&gt;() {&lt;BR /&gt;        &lt;SPAN&gt;super&lt;/SPAN&gt;.onCleared()&lt;BR /&gt;        &lt;SPAN&gt;if &lt;/SPAN&gt;(::&lt;SPAN&gt;authService&lt;/SPAN&gt;.&lt;SPAN&gt;isInitialized&lt;/SPAN&gt;) {&lt;BR /&gt;            &lt;SPAN&gt;authService&lt;/SPAN&gt;.dispose()&lt;BR /&gt;        }&lt;BR /&gt;    }&lt;BR /&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;the logs i get everytime the app runs are the following:&lt;/P&gt;&lt;PRE&gt;19:22:45.582 7422-7422 SpotifyAuth com.example.grooveshare D AuthorizationService initialized&lt;BR /&gt;19:22:48.116 7422-7422 SpotifyAuth com.example.grooveshare D Authorization Request URI: https://accounts.spotify.com/authorize?redirect_uri=myapp%3A%2F%2Fcallback&amp;amp;client_id=&amp;amp;response_type=code&amp;amp;state=x4_BWl8fKVPqz_kydQ0Xgw&amp;amp;nonce=f_Cn98xXWNyuRBW_upaJrw&amp;amp;scope=user-read-currently-playing%20user-read-email%20user-read-private&amp;amp;code_challenge=B6V3YAprIgNR3g7tpxFdaBGbKGozViF6F_JVOPNGsMk&amp;amp;code_challenge_method=S256&lt;BR /&gt;19:22:52.199 7422-7422 SpotifyAuth com.example.grooveshare D Received Intent: null&lt;BR /&gt;19:22:52.199 7422-7422 SpotifyAuth com.example.grooveshare D Intent Action: null&lt;BR /&gt;19:22:52.199 7422-7422 SpotifyAuth com.example.grooveshare D Intent Data: null&lt;BR /&gt;19:22:52.199 7422-7422 SpotifyAuth com.example.grooveshare E Intent or data is null&lt;/PRE&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;steps ive taken so far:&lt;/P&gt;&lt;P&gt;made sure my redirect uri stated in the viewmodel is the same w the one stated in spotify dashboard and also that the intent is correctly established in AndroidManifest.xml&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Sun, 25 Aug 2024 16:27:28 GMT</pubDate>
    <dc:creator>bogscam</dc:creator>
    <dc:date>2024-08-25T16:27:28Z</dc:date>
    <item>
      <title>spotify webapi auth and requests</title>
      <link>https://community.spotify.com/t5/Spotify-for-Developers/spotify-webapi-auth-and-requests/m-p/6289534#M14864</link>
      <description>&lt;P&gt;&lt;SPAN&gt;for the past few weeks ive been trying to implement spotify webapi on my app to auth users, get their pfp and handler and also get their currently playing track name and artist name but had no success. id appreciate any help.&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;AuthViewModel:&lt;/STRONG&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;DIV&gt;&lt;PRE&gt;&lt;SPAN&gt;package &lt;/SPAN&gt;com.example.grooveshare.viewmodels&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;android.content.Context&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;android.content.Intent&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;android.net.Uri&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;android.util.Log&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;androidx.activity.result.ActivityResultLauncher&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;androidx.lifecycle.ViewModel&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;net.openid.appauth.AuthorizationException&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;net.openid.appauth.AuthorizationRequest&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;net.openid.appauth.AuthorizationService&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;net.openid.appauth.AuthorizationServiceConfiguration&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;net.openid.appauth.AuthorizationResponse&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;net.openid.appauth.ResponseTypeValues&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;java.security.MessageDigest&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;java.security.SecureRandom&lt;BR /&gt;&lt;SPAN&gt;import &lt;/SPAN&gt;java.util.Base64&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;class &lt;/SPAN&gt;SpotifyAuthViewModel : ViewModel() {&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;private val &lt;/SPAN&gt;&lt;SPAN&gt;clientId &lt;/SPAN&gt;= &lt;SPAN&gt;""&lt;BR /&gt;&lt;/SPAN&gt;    &lt;SPAN&gt;private val &lt;/SPAN&gt;&lt;SPAN&gt;redirectUri &lt;/SPAN&gt;= &lt;SPAN&gt;"myapp://callback"&lt;BR /&gt;&lt;/SPAN&gt;    &lt;SPAN&gt;private val &lt;/SPAN&gt;&lt;SPAN&gt;authorizationEndpoint &lt;/SPAN&gt;= &lt;SPAN&gt;"https://accounts.spotify.com/authorize"&lt;BR /&gt;&lt;/SPAN&gt;    &lt;SPAN&gt;private val &lt;/SPAN&gt;&lt;SPAN&gt;tokenEndpoint &lt;/SPAN&gt;= &lt;SPAN&gt;"https://accounts.spotify.com/api/token"&lt;BR /&gt;&lt;/SPAN&gt;    &lt;SPAN&gt;private val &lt;/SPAN&gt;&lt;SPAN&gt;codeVerifier &lt;/SPAN&gt;= generateCodeVerifier()&lt;BR /&gt;    &lt;SPAN&gt;private lateinit var &lt;/SPAN&gt;&lt;SPAN&gt;authService&lt;/SPAN&gt;: AuthorizationService&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;fun &lt;/SPAN&gt;&lt;SPAN&gt;initializeAuthService&lt;/SPAN&gt;(context: Context) {&lt;BR /&gt;        &lt;SPAN&gt;authService &lt;/SPAN&gt;= AuthorizationService(context)&lt;BR /&gt;        Log.d(&lt;SPAN&gt;"SpotifyAuth"&lt;/SPAN&gt;, &lt;SPAN&gt;"AuthorizationService initialized"&lt;/SPAN&gt;)&lt;BR /&gt;    }&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;private fun &lt;/SPAN&gt;&lt;SPAN&gt;generateCodeVerifier&lt;/SPAN&gt;(): String {&lt;BR /&gt;        &lt;SPAN&gt;val &lt;/SPAN&gt;secureRandom = SecureRandom()&lt;BR /&gt;        &lt;SPAN&gt;val &lt;/SPAN&gt;codeVerifier = ByteArray(&lt;SPAN&gt;32&lt;/SPAN&gt;)&lt;BR /&gt;        secureRandom.nextBytes(codeVerifier)&lt;BR /&gt;        &lt;SPAN&gt;return &lt;/SPAN&gt;Base64.getUrlEncoder().withoutPadding().encodeToString(codeVerifier)&lt;BR /&gt;    }&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;private fun &lt;/SPAN&gt;&lt;SPAN&gt;generateCodeChallenge&lt;/SPAN&gt;(verifier: String): String {&lt;BR /&gt;        &lt;SPAN&gt;val &lt;/SPAN&gt;bytes = verifier.&lt;SPAN&gt;toByteArray&lt;/SPAN&gt;(Charsets.&lt;SPAN&gt;US_ASCII&lt;/SPAN&gt;)&lt;BR /&gt;        &lt;SPAN&gt;val &lt;/SPAN&gt;messageDigest = MessageDigest.getInstance(&lt;SPAN&gt;"SHA-256"&lt;/SPAN&gt;)&lt;BR /&gt;        &lt;SPAN&gt;val &lt;/SPAN&gt;digest = messageDigest.digest(bytes)&lt;BR /&gt;        &lt;SPAN&gt;return &lt;/SPAN&gt;Base64.getUrlEncoder().withoutPadding().encodeToString(digest)&lt;BR /&gt;    }&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;fun &lt;/SPAN&gt;&lt;SPAN&gt;authenticate&lt;/SPAN&gt;(authResultLauncher: ActivityResultLauncher&amp;lt;Intent&amp;gt;) {&lt;BR /&gt;        &lt;SPAN&gt;if &lt;/SPAN&gt;(!::&lt;SPAN&gt;authService&lt;/SPAN&gt;.&lt;SPAN&gt;isInitialized&lt;/SPAN&gt;) {&lt;BR /&gt;            Log.e(&lt;SPAN&gt;"SpotifyAuth"&lt;/SPAN&gt;, &lt;SPAN&gt;"AuthorizationService is not initialized"&lt;/SPAN&gt;)&lt;BR /&gt;            &lt;SPAN&gt;return&lt;BR /&gt;&lt;/SPAN&gt;        }&lt;BR /&gt;&lt;BR /&gt;        &lt;SPAN&gt;val &lt;/SPAN&gt;serviceConfig = AuthorizationServiceConfiguration(&lt;BR /&gt;            Uri.parse(&lt;SPAN&gt;authorizationEndpoint&lt;/SPAN&gt;),&lt;BR /&gt;            Uri.parse(&lt;SPAN&gt;tokenEndpoint&lt;/SPAN&gt;)&lt;BR /&gt;        )&lt;BR /&gt;&lt;BR /&gt;        &lt;SPAN&gt;val &lt;/SPAN&gt;authRequest = AuthorizationRequest.Builder(&lt;BR /&gt;            serviceConfig,&lt;BR /&gt;            &lt;SPAN&gt;clientId&lt;/SPAN&gt;,&lt;BR /&gt;            ResponseTypeValues.&lt;SPAN&gt;CODE&lt;/SPAN&gt;,&lt;BR /&gt;            Uri.parse(&lt;SPAN&gt;redirectUri&lt;/SPAN&gt;)&lt;BR /&gt;        ).setCodeVerifier(&lt;SPAN&gt;codeVerifier&lt;/SPAN&gt;, generateCodeChallenge(&lt;SPAN&gt;codeVerifier&lt;/SPAN&gt;), &lt;SPAN&gt;"S256"&lt;/SPAN&gt;)&lt;BR /&gt;            .setScope(&lt;SPAN&gt;"user-read-currently-playing user-read-email user-read-private"&lt;/SPAN&gt;)&lt;BR /&gt;            .build()&lt;BR /&gt;&lt;BR /&gt;        Log.d(&lt;SPAN&gt;"SpotifyAuth"&lt;/SPAN&gt;, &lt;SPAN&gt;"Authorization Request URI: &lt;/SPAN&gt;&lt;SPAN&gt;${&lt;/SPAN&gt;authRequest.toUri()&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;)&lt;BR /&gt;&lt;BR /&gt;        &lt;SPAN&gt;val &lt;/SPAN&gt;authIntent = &lt;SPAN&gt;authService&lt;/SPAN&gt;.getAuthorizationRequestIntent(authRequest)&lt;BR /&gt;        authResultLauncher.launch(authIntent) &lt;SPAN&gt;// Launch the auth intent using the Activity Result API&lt;BR /&gt;&lt;/SPAN&gt;    }&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;fun &lt;/SPAN&gt;&lt;SPAN&gt;handleAuthResponse&lt;/SPAN&gt;(intent: Intent?) {&lt;BR /&gt;        Log.d(&lt;SPAN&gt;"SpotifyAuth"&lt;/SPAN&gt;, &lt;SPAN&gt;"Received Intent: &lt;/SPAN&gt;&lt;SPAN&gt;$&lt;/SPAN&gt;intent&lt;SPAN&gt;"&lt;/SPAN&gt;)&lt;BR /&gt;        Log.d(&lt;SPAN&gt;"SpotifyAuth"&lt;/SPAN&gt;, &lt;SPAN&gt;"Intent Action: &lt;/SPAN&gt;&lt;SPAN&gt;${&lt;/SPAN&gt;intent?.&lt;SPAN&gt;action&lt;/SPAN&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;)&lt;BR /&gt;        Log.d(&lt;SPAN&gt;"SpotifyAuth"&lt;/SPAN&gt;, &lt;SPAN&gt;"Intent Data: &lt;/SPAN&gt;&lt;SPAN&gt;${&lt;/SPAN&gt;intent?.&lt;SPAN&gt;data&lt;/SPAN&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;)&lt;BR /&gt;&lt;BR /&gt;        &lt;SPAN&gt;if &lt;/SPAN&gt;(intent == &lt;SPAN&gt;null &lt;/SPAN&gt;|| &lt;SPAN&gt;intent&lt;/SPAN&gt;.&lt;SPAN&gt;data &lt;/SPAN&gt;== &lt;SPAN&gt;null&lt;/SPAN&gt;) {&lt;BR /&gt;            Log.e(&lt;SPAN&gt;"SpotifyAuth"&lt;/SPAN&gt;, &lt;SPAN&gt;"Intent or data is null"&lt;/SPAN&gt;)&lt;BR /&gt;            &lt;SPAN&gt;return&lt;BR /&gt;&lt;/SPAN&gt;        }&lt;BR /&gt;&lt;BR /&gt;        &lt;SPAN&gt;val &lt;/SPAN&gt;authorizationResponse = AuthorizationResponse.fromIntent(&lt;SPAN&gt;intent&lt;/SPAN&gt;)&lt;BR /&gt;        &lt;SPAN&gt;val &lt;/SPAN&gt;authorizationException = AuthorizationException.fromIntent(intent)&lt;BR /&gt;&lt;BR /&gt;        &lt;SPAN&gt;if &lt;/SPAN&gt;(authorizationResponse != &lt;SPAN&gt;null&lt;/SPAN&gt;) {&lt;BR /&gt;            Log.d(&lt;SPAN&gt;"SpotifyAuth"&lt;/SPAN&gt;, &lt;SPAN&gt;"Authorization Response: &lt;/SPAN&gt;&lt;SPAN&gt;${&lt;/SPAN&gt;&lt;SPAN&gt;authorizationResponse&lt;/SPAN&gt;.jsonSerializeString()&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;)&lt;BR /&gt;            &lt;SPAN&gt;val &lt;/SPAN&gt;tokenRequest = &lt;SPAN&gt;authorizationResponse&lt;/SPAN&gt;.createTokenExchangeRequest()&lt;BR /&gt;&lt;BR /&gt;            &lt;SPAN&gt;authService&lt;/SPAN&gt;.performTokenRequest(tokenRequest) &lt;SPAN&gt;{ &lt;/SPAN&gt;tokenResponse, exception &lt;SPAN&gt;-&amp;gt;&lt;BR /&gt;&lt;/SPAN&gt;                &lt;SPAN&gt;if &lt;/SPAN&gt;(tokenResponse != &lt;SPAN&gt;null&lt;/SPAN&gt;) {&lt;BR /&gt;                    Log.d(&lt;SPAN&gt;"SpotifyAuth"&lt;/SPAN&gt;, &lt;SPAN&gt;"Token Response: &lt;/SPAN&gt;&lt;SPAN&gt;${&lt;/SPAN&gt;&lt;SPAN&gt;tokenResponse&lt;/SPAN&gt;.jsonSerializeString()&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;)&lt;BR /&gt;                    &lt;SPAN&gt;val &lt;/SPAN&gt;accessToken = &lt;SPAN&gt;tokenResponse&lt;/SPAN&gt;.&lt;SPAN&gt;accessToken&lt;BR /&gt;&lt;/SPAN&gt;                    Log.d(&lt;SPAN&gt;"SpotifyAuth"&lt;/SPAN&gt;, &lt;SPAN&gt;"Access Token: &lt;/SPAN&gt;&lt;SPAN&gt;$&lt;/SPAN&gt;accessToken&lt;SPAN&gt;"&lt;/SPAN&gt;)&lt;BR /&gt;                    &lt;SPAN&gt;// &lt;/SPAN&gt;&lt;SPAN&gt;TODO: Use the access token to fetch user profile and currently playing track&lt;BR /&gt;&lt;/SPAN&gt;                } &lt;SPAN&gt;else &lt;/SPAN&gt;{&lt;BR /&gt;                    Log.e(&lt;SPAN&gt;"SpotifyAuth"&lt;/SPAN&gt;, &lt;SPAN&gt;"Token Exchange Failed: &lt;/SPAN&gt;&lt;SPAN&gt;${&lt;/SPAN&gt;exception?.&lt;SPAN&gt;errorDescription&lt;/SPAN&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;)&lt;BR /&gt;                }&lt;BR /&gt;            &lt;SPAN&gt;}&lt;BR /&gt;&lt;/SPAN&gt;        } &lt;SPAN&gt;else &lt;/SPAN&gt;{&lt;BR /&gt;            Log.e(&lt;SPAN&gt;"SpotifyAuth"&lt;/SPAN&gt;, &lt;SPAN&gt;"Authorization Failed: &lt;/SPAN&gt;&lt;SPAN&gt;${&lt;/SPAN&gt;authorizationException?.&lt;SPAN&gt;errorDescription&lt;/SPAN&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;SPAN&gt;"&lt;/SPAN&gt;)&lt;BR /&gt;        }&lt;BR /&gt;    }&lt;BR /&gt;&lt;BR /&gt;    &lt;SPAN&gt;override fun &lt;/SPAN&gt;&lt;SPAN&gt;onCleared&lt;/SPAN&gt;() {&lt;BR /&gt;        &lt;SPAN&gt;super&lt;/SPAN&gt;.onCleared()&lt;BR /&gt;        &lt;SPAN&gt;if &lt;/SPAN&gt;(::&lt;SPAN&gt;authService&lt;/SPAN&gt;.&lt;SPAN&gt;isInitialized&lt;/SPAN&gt;) {&lt;BR /&gt;            &lt;SPAN&gt;authService&lt;/SPAN&gt;.dispose()&lt;BR /&gt;        }&lt;BR /&gt;    }&lt;BR /&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;the logs i get everytime the app runs are the following:&lt;/P&gt;&lt;PRE&gt;19:22:45.582 7422-7422 SpotifyAuth com.example.grooveshare D AuthorizationService initialized&lt;BR /&gt;19:22:48.116 7422-7422 SpotifyAuth com.example.grooveshare D Authorization Request URI: https://accounts.spotify.com/authorize?redirect_uri=myapp%3A%2F%2Fcallback&amp;amp;client_id=&amp;amp;response_type=code&amp;amp;state=x4_BWl8fKVPqz_kydQ0Xgw&amp;amp;nonce=f_Cn98xXWNyuRBW_upaJrw&amp;amp;scope=user-read-currently-playing%20user-read-email%20user-read-private&amp;amp;code_challenge=B6V3YAprIgNR3g7tpxFdaBGbKGozViF6F_JVOPNGsMk&amp;amp;code_challenge_method=S256&lt;BR /&gt;19:22:52.199 7422-7422 SpotifyAuth com.example.grooveshare D Received Intent: null&lt;BR /&gt;19:22:52.199 7422-7422 SpotifyAuth com.example.grooveshare D Intent Action: null&lt;BR /&gt;19:22:52.199 7422-7422 SpotifyAuth com.example.grooveshare D Intent Data: null&lt;BR /&gt;19:22:52.199 7422-7422 SpotifyAuth com.example.grooveshare E Intent or data is null&lt;/PRE&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;steps ive taken so far:&lt;/P&gt;&lt;P&gt;made sure my redirect uri stated in the viewmodel is the same w the one stated in spotify dashboard and also that the intent is correctly established in AndroidManifest.xml&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Sun, 25 Aug 2024 16:27:28 GMT</pubDate>
      <guid>https://community.spotify.com/t5/Spotify-for-Developers/spotify-webapi-auth-and-requests/m-p/6289534#M14864</guid>
      <dc:creator>bogscam</dc:creator>
      <dc:date>2024-08-25T16:27:28Z</dc:date>
    </item>
  </channel>
</rss>

