Skip to content

Commit e3cdf7f

Browse files
committed
新增OAuth2授权登录方式
1 parent 03efa02 commit e3cdf7f

File tree

17 files changed

+188
-29
lines changed

17 files changed

+188
-29
lines changed

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@ Model-View-ViewModel,View 指绿色的 Activity/Fragment,主要负责界面
8484
Glide相比起Fresco要轻量很多,api调用起来也很简洁,对图片加载要求不是很高的话建议使用Glide。
8585

8686
# 更新日志
87+
### v2.3
88+
* 新增OAuth2授权登录方式,旧版登录方式官方不再推荐(官方2020/11后废弃旧版登录方式)
89+
* 调整项目结构,优化代码
8790
### v2.2
8891
* 接入Navigation改写动态页面
8992
* 调整项目结构,优化代码

app/src/main/AndroidManifest.xml

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@
1919
android:allowBackup="true"
2020
android:icon="@mipmap/icon_launcher"
2121
android:label="@string/app_name"
22+
android:networkSecurityConfig="@xml/network_security_config"
2223
android:roundIcon="@mipmap/ic_launcher_round"
2324
android:supportsRtl="true"
24-
android:networkSecurityConfig="@xml/network_security_config"
2525
android:theme="@style/AppTheme"
2626
tools:ignore="GoogleAppIndexingWarning">
2727
<activity
@@ -35,7 +35,19 @@
3535
</activity>
3636
<activity
3737
android:name=".user.activity.LoginActivity"
38-
android:screenOrientation="portrait" />
38+
android:launchMode="singleTask"
39+
android:screenOrientation="portrait">
40+
<intent-filter>
41+
<action android:name="android.intent.action.VIEW" />
42+
43+
<category android:name="android.intent.category.DEFAULT" />
44+
<category android:name="android.intent.category.BROWSABLE" />
45+
46+
<data
47+
android:host="login"
48+
android:scheme="jepackgithub" />
49+
</intent-filter>
50+
</activity>
3951
<activity
4052
android:name=".home.activity.HomeActivity"
4153
android:screenOrientation="portrait"

app/src/main/java/com/fmt/github/config/Configs.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,15 @@ import java.util.*
88
*/
99
object Configs {
1010

11+
const val GITHUB_BASE_URL = "https://github.com/"
12+
1113
//登陆授权
1214
const val CLIENT_ID = "b050ee3cc3cc692d1d46"
1315
const val CLIENT_SECRET = "f52c740c30064a8bed60fc0c919d93251c0c1f15"
1416
const val NOTE = "open_github"
1517
const val NOTE_URL = "https://github.com/fmtjava"
1618
val SCOPE = listOf("user", "repo", "notifications", "gist")
19+
const val OAUTH2_SCOPE = "user,repo,gist,notifications"
1720
val FINGERPRINT: String by lazy { Build.FINGERPRINT + UUID.randomUUID().toString() }
1821

1922
//仓库信息

app/src/main/java/com/fmt/github/home/activity/HomeActivity.kt

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -163,15 +163,11 @@ class HomeActivity : BaseVMActivity(), NavigationView.OnNavigationItemSelectedLi
163163
}
164164

165165
private fun logout() {
166-
mViewModel.deleteAuthorization(mUser.uid).observe(this, Observer {
167-
if (it) {
168-
Preference.clear()
169-
mViewModel.deleteUser()
170-
Intent(this, LoginActivity::class.java).run {
171-
startActivity(this)
172-
finish()
173-
}
174-
}
175-
})
166+
Preference.clear()
167+
mViewModel.deleteUser()
168+
Intent(this, LoginActivity::class.java).run {
169+
startActivity(this)
170+
finish()
171+
}
176172
}
177173
}

app/src/main/java/com/fmt/github/home/adapter/HomeAdapter.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,13 @@ import android.view.ViewGroup
77
import androidx.paging.PagedListAdapter
88
import androidx.recyclerview.widget.DiffUtil
99
import androidx.recyclerview.widget.RecyclerView
10+
import com.fmt.github.config.Configs
1011
import com.fmt.github.databinding.LayoutReceivedEventBinding
1112
import com.fmt.github.home.model.ReceivedEventModel
1213
import com.fmt.github.repos.activity.go2ReposDetailActivity
1314
import com.fmt.github.user.activity.go2UserInfoActivity
1415
import com.fmt.github.user.model.UserModel
1516

16-
const val BASE_WEB_URL = "https://github.com/"
17-
1817
class HomeAdapter(private val mContext: Activity) :
1918
PagedListAdapter<ReceivedEventModel, HomeAdapter.ViewHolder>(object :
2019
DiffUtil.ItemCallback<ReceivedEventModel>() {
@@ -40,7 +39,7 @@ class HomeAdapter(private val mContext: Activity) :
4039
holder.bindData(receivedEventModel)
4140
holder.itemView.setOnClickListener {
4241
val splitArr = receivedEventModel.repo.name.split("/")
43-
go2ReposDetailActivity(mContext,"${BASE_WEB_URL}${receivedEventModel.repo.name}",
42+
go2ReposDetailActivity(mContext,"${Configs.GITHUB_BASE_URL}${receivedEventModel.repo.name}",
4443
splitArr[1],splitArr[0])
4544
}
4645
}

app/src/main/java/com/fmt/github/home/viewmodel/HomeViewModel.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,6 @@ import com.fmt.github.user.repository.UserRepository
77

88
class HomeViewModel(private val mUserRepository: UserRepository) : BaseViewModel() {
99

10-
fun deleteAuthorization(id: Int): LiveData<Boolean> = emit {
11-
mUserRepository.deleteAuthorization(id).code() == 204
12-
}
13-
1410
fun deleteUser() {
1511
launch {
1612
mUserRepository.deleteLocalUser(mUserRepository.getLocalUsers()[0])

app/src/main/java/com/fmt/github/user/activity/LoginActivity.kt

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import androidx.lifecycle.Observer
66
import com.fmt.github.R
77
import com.fmt.github.base.activity.BaseDataBindVMActivity
88
import com.fmt.github.base.viewmodel.BaseViewModel
9+
import com.fmt.github.config.Configs
910
import com.fmt.github.config.Settings
1011
import com.fmt.github.databinding.ActivityLoginBinding
1112
import com.fmt.github.ext.otherwise
@@ -16,13 +17,13 @@ import com.fmt.github.user.model.UserLoginModel
1617
import com.fmt.github.user.model.UserModel
1718
import com.fmt.github.user.model.db.User
1819
import com.fmt.github.user.viewmodel.UserViewModel
20+
import com.fmt.github.utils.AppOpener
1921
import kotlinx.android.synthetic.main.activity_login.*
2022
import org.koin.androidx.viewmodel.ext.android.viewModel
23+
import java.util.*
2124

2225
class LoginActivity : BaseDataBindVMActivity<ActivityLoginBinding>() {
2326

24-
private var mAuthId = 0
25-
2627
private val mViewModel: UserViewModel by viewModel()
2728

2829
private val mUserLoginModel: UserLoginModel by lazy { UserLoginModel() }
@@ -35,6 +36,9 @@ class LoginActivity : BaseDataBindVMActivity<ActivityLoginBinding>() {
3536
mSignInBt.setOnClickListener {
3637
login()
3738
}
39+
mOAuthLoginIv.setOnClickListener {
40+
loginByOAuth()
41+
}
3842
}
3943

4044
override fun initData() {
@@ -64,24 +68,55 @@ class LoginActivity : BaseDataBindVMActivity<ActivityLoginBinding>() {
6468

6569
}
6670

71+
private fun loginByOAuth() {
72+
val randomState = UUID.randomUUID().toString()
73+
val url = "${Configs.GITHUB_BASE_URL}login/oauth/authorize" +
74+
"?client_id=" + Configs.CLIENT_ID +
75+
"&scope=" + Configs.OAUTH2_SCOPE +
76+
"&state=" + randomState
77+
AppOpener.openInBrowser(this, url)
78+
}
79+
80+
override fun onNewIntent(intent: Intent?) {
81+
super.onNewIntent(intent)
82+
intent?.let {
83+
val uri = it.data
84+
if (uri != null) {
85+
val code = uri.getQueryParameter("code")
86+
val state = uri.getQueryParameter("state")
87+
getToken(code, state)
88+
}
89+
}
90+
}
91+
6792
private fun createOrGetAuthorization() {
6893
mViewModel.createOrGetAuthorization().observe(this, Observer<AuthorizationRespModel> {
6994
//保存授权后的Token和ID
7095
Settings.Account.token = it.token
71-
mAuthId = it.id
7296
//获取用户信息
7397
getUserInfo()
7498
})
7599
}
76100

101+
private fun getToken(code: String?, state: String?) {
102+
if (code != null && state != null) {
103+
mOAuthProgress.visibility = View.VISIBLE
104+
mOAuthLoginIv.visibility = View.GONE
105+
mViewModel.getAccessToken(code, state).observe(this, Observer {
106+
Settings.Account.token = it.access_token
107+
getUserInfo()
108+
})
109+
}
110+
}
111+
77112
private fun getUserInfo() {
78113
mViewModel.getUser().observe(this, Observer<UserModel> {
79114
saveUserInfo(it)
80115
})
81116
}
82117

83118
private fun saveUserInfo(userModel: UserModel) {
84-
User(mAuthId, userModel.login, userModel.avatar_url).apply {
119+
User(userModel.id, userModel.login, userModel.avatar_url).apply {
85120
Settings.Account.loginUser = this.login
86121
mViewModel.saveLocalUser(this@apply)
87122
go2MainActivity()
@@ -98,5 +133,7 @@ class LoginActivity : BaseDataBindVMActivity<ActivityLoginBinding>() {
98133
override fun handleError() {
99134
mSignInBt.visibility = View.VISIBLE
100135
mProgressBar.visibility = View.GONE
136+
mOAuthLoginIv.visibility = View.VISIBLE
137+
mOAuthProgress.visibility = View.GONE
101138
}
102139
}

app/src/main/java/com/fmt/github/user/api/UserApi.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,11 @@ interface UserApi {
1818
) fingerprint: String
1919
): AuthorizationRespModel
2020

21-
@DELETE("authorizations/{id}")
22-
suspend fun deleteAuthorization(@Path("id") id: Int): Response<ResponseBody>
21+
@POST
22+
@Headers("Accept: application/json")
23+
suspend fun getAccessToken(
24+
@Url url: String
25+
): OauthTokenModel
2326

2427
@GET("user")
2528
suspend fun getUser(): UserModel
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package com.fmt.github.user.model
2+
3+
data class OauthTokenModel(val access_token:String,val scope:String)

app/src/main/java/com/fmt/github/user/model/UserModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ package com.fmt.github.user.model
22

33
import java.io.Serializable
44

5-
data class UserModel(val login: String, val avatar_url: String):Serializable
5+
data class UserModel(val login: String, val avatar_url: String, val id: Int = 0) : Serializable

0 commit comments

Comments
 (0)