如何在Kotlin中用PKCE实现Spotify授权码

How to Impement Spotify#39;s Authorization Code With PKCE in Kotlin(如何在Kotlin中用PKCE实现Spotify授权码)
本文介绍了如何在Kotlin中用PKCE实现Spotify授权码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以我想使用Spotify的Web API。我已经阅读了一些文档,您将需要用PKCE实现一个验证码。我不是百分之百确定如何做到这一点,我可以在这方面需要一些帮助。

推荐答案

方法之一是使用Spotify授权库。 在开始之前,将以下依赖项添加到您的Android项目:

// Spotify authorization
implementation 'com.spotify.android:auth:1.2.5'

然后按照Authorization Guide中的步骤开始编码:

1.创建代码验证器并挑战

此helpful article有助于处理授权流的初始加密部分。您可以快速阅读它。

编码的第一步是创建companion object,我们将在其中存储CLIENT_ID或代码验证器和代码质询:

companion object {
        const val CLIENT_ID = "your_client_id"
        const val REDIRECT_URI = "https://com.company.app/callback"

        val CODE_VERIFIER = getCodeVerifier()

        private fun getCodeVerifier(): String {
            val secureRandom = SecureRandom()
            val code = ByteArray(64)
            secureRandom.nextBytes(code)
            return Base64.encodeToString(
                code,
                Base64.URL_SAFE or Base64.NO_WRAP or Base64.NO_PADDING
            )
        }

        fun getCodeChallenge(verifier: String): String {
            val bytes = verifier.toByteArray()
            val messageDigest = MessageDigest.getInstance("SHA-256")
            messageDigest.update(bytes, 0, bytes.size)
            val digest = messageDigest.digest()
            return Base64.encodeToString(
                digest,
                Base64.URL_SAFE or Base64.NO_WRAP or Base64.NO_PADDING
            )
        }
    }

2.构造授权URI

此步骤归结为使用AuthorizationRequest.BuilderAuthorizationClient为Spotify身份验证活动创建意图。

在那里您将提供指南中的所有必要参数:

fun getLoginActivityCodeIntent(): Intent =
        AuthorizationClient.createLoginActivityIntent(
            activity,
            AuthorizationRequest.Builder(CLIENT_ID, AuthorizationResponse.Type.CODE, REDIRECT_URI)
                .setScopes(
                    arrayOf(
                        "user-library-read", "user-library-modify",
                        "app-remote-control", "user-read-currently-playing"
                    )
                )
                .setCustomParam("code_challenge_method", "S256")
                .setCustomParam("code_challenge", getCodeChallenge(CODE_VERIFIER))
                .build()
        )

3.您的应用程序将用户重定向到授权URI

在这里,您可以为授权活动的结果注册回调,该活动将使用我们在上一步中创建的意图:

private val showLoginActivityCode = registerForActivityResult(
        ActivityResultContracts.StartActivityForResult()
    ) { result: ActivityResult ->

        val authorizationResponse = AuthorizationClient.getResponse(result.resultCode, result.data)

        when (authorizationResponse.type) {
            AuthorizationResponse.Type.CODE ->
                // Here You will get the authorization code which you
                // can get with authorizationResponse.code
            AuthorizationResponse.Type.ERROR ->
                // Handle the Error
            else ->
                // Probably interruption
        }
    }


// Usage:
showLoginActivityCode.launch(getLoginActivityCodeIntent())

在那里,您可以访问授权码-authorizationResponse.code。它将在下一步中使用。

4.您的应用程序将代码交换为访问令牌

这里,我们将不得不为Spotify身份验证活动创建另一个意图。这与步骤2中的代码非常相似。在getLoginActivityTokenIntent中,您必须提供从上一步中检索到的代码:

fun getLoginActivityTokenIntent(code: String): Intent =
        AuthorizationClient.createLoginActivityIntent(
            activity,
            AuthorizationRequest.Builder(CLIENT_ID, AuthorizationResponse.Type.TOKEN, REDIRECT_URI)
                .setCustomParam("grant_type", "authorization_code")
                .setCustomParam("code", code)
                .setCustomParam("code_verifier", CODE_VERIFIER)
                .build()
        )

然后创建回调:

private val showLoginActivityToken = registerForActivityResult(
        ActivityResultContracts.StartActivityForResult()
    ) { result: ActivityResult ->

        val authorizationResponse = AuthorizationClient.getResponse(result.resultCode, result.data)

        when (authorizationResponse.type) {
            AuthorizationResponse.Type.TOKEN -> {
                // Here You can get access to the authorization token
                // with authorizationResponse.token
            }
            AuthorizationResponse.Type.ERROR ->
                // Handle Error
            else ->
                // Probably interruption
        }
    }


// Usage:
showLoginActivityToken.launch(getLoginActivityTokenIntent(authorizationCode))
现在授权部分结束了-您已经获得了对授权令牌的访问-authorizationResponse.token。保存它,它将用于创建对Spotify Web API的请求。

5.使用访问令牌访问Spotify Web API

您可以开始使用该接口了。使用Retrofit的简单预览示例:

interface SpotifyApi {

    companion object {
        const val BASE_URL = "https://api.spotify.com/v1/"
    }

    @GET("me")
    suspend fun getMe(@Header("Authorization") bearerWithToken: String): User
}

请注意,bearerWithToken参数应如下所示:"Bearer {your_access_token}"

这篇关于如何在Kotlin中用PKCE实现Spotify授权码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

How to target newer versions in .gitlab-ci.yml using auto devops (java 11 instead of 8 and Android 31 instead of 29)(如何在.gitlab-ci.yml中使用自动开发工具(Java 11而不是8,Android 31而不是29)瞄准较新的版本)
Android + coreLibraryDesugaring: which Java 11 APIs can I expect to work?(Android+core LibraryDesugering:我可以期待哪些Java 11API能够工作?)
How to render something in an if statement React Native(如何在If语句中呈现某些内容Reaction Native)
How can I sync two flatList scroll position in react native(如何在本机Reaction中同步两个平面列表滚动位置)
Using Firebase Firestore in offline only mode(在仅脱机模式下使用Firebase FiRestore)
Crash on Google Play Pre-Launch Report: java.lang.NoSuchMethodError(Google Play发布前崩溃报告:java.lang.NoSuchMethodError)