Một số dịch vụ của Google, chẳng hạn như Drive, Gmail và nhiều dịch vụ khác, cung cấp các API công khai mà bạn có thể dùng để tạo ứng dụng giúp người dùng xử lý dữ liệu của họ trong các dịch vụ này. Để truy cập vào các dịch vụ này, ứng dụng phải triển khai một trong các quy trình ứng dụng OAuth 2.0 để nhận được sự đồng ý của người dùng và lấy mã truy cập, từ đó cấp quyền truy cập vào các API.
Bạn có thể sử dụng thư viện Đăng nhập bằng Google (thư viện này triển khai quy trình OAuth 2.0 cho bạn) để lấy mã truy cập cho người dùng đã đăng nhập.
Điều kiện tiên quyết
Trước khi ứng dụng iOS của bạn có thể gọi API của Google, hãy hoàn tất các bước thiết lập sau:
1. Bật API cho dự án của bạn
Mọi ứng dụng gọi API của Google đều cần bật các API đó trong Google Cloud Console.
Cách bật API cho dự án:
- Mở Thư viện API trong Google Cloud Console.
- Nếu bạn nhận được lời nhắc, hãy chọn một dự án hoặc tạo dự án mới.
- Chọn API bạn muốn bật, sau đó nhấp vào Bật.
2. Tạo thông tin uỷ quyền
Bất kỳ ứng dụng iOS nào sử dụng OAuth 2.0 để truy cập vào API của Google đều phải có thông tin uỷ quyền để xác định ứng dụng với máy chủ uỷ quyền của Google. Các bước sau đây giải thích cách tạo thông tin xác thực cho dự án của bạn:
- Chuyển đến trang Thông tin đăng nhập trong Google Cloud Console.
- Nhấp vào Tạo ứng dụng OAuth (hoặc Tạo thông tin xác thực > Mã ứng dụng khách OAuth).
- Chọn loại ứng dụng iOS.
- Nhập tên cho ứng dụng OAuth. Tên này xác định ứng dụng khách trong trang Thông tin xác thực của dự án.
- Nhập mã nhận dạng gói cho ứng dụng của bạn. Mã nhận dạng gói là giá trị của khoá
CFBundleIdentifiertrong tệpInfo.plistcủa ứng dụng. Giá trị này thường xuất hiện trong ngăn General (Chung) hoặc ngăn Signing & Capabilities (Ký và chức năng) của trình chỉnh sửa dự án Xcode, hoặc trong trang App Information (Thông tin ứng dụng) trên Apple App Store Connect. Xác nhận rằng bạn sử dụng đúng mã nhận dạng gói, vì bạn không thể thay đổi mã này nếu sử dụng Kiểm tra ứng dụng. - (Không bắt buộc) Nhập mã cửa hàng ứng dụng của ứng dụng nếu ứng dụng được xuất bản trong Apple App Store. Mã cửa hàng là một chuỗi số có trong mọi URL của Apple App Store.
- (Không bắt buộc) Nhập Mã nhóm của bạn. Xem phần Tìm Mã nhóm trong tài liệu về Tài khoản nhà phát triển Apple. Bạn cần có Mã nhóm nếu bật tính năng Kiểm tra ứng dụng cho ứng dụng khách của mình.
- (Không bắt buộc) Bật tính năng Kiểm tra ứng dụng cho ứng dụng iOS. Khi bạn bật tính năng Kiểm tra ứng dụng, dịch vụ Chứng thực ứng dụng của Apple sẽ được dùng để xác minh rằng các yêu cầu OAuth 2.0 bắt nguồn từ ứng dụng OAuth của bạn là chính hãng và đến từ ứng dụng của bạn, giúp giảm nguy cơ mạo danh ứng dụng.
- Nhấp vào Tạo.
Mã ứng dụng khách của bạn sẽ được tạo và hiển thị trong Google Cloud Console. Thêm lược đồ URL mã ứng dụng khách đảo ngược (ví dụ: com.googleusercontent.apps.1234567890-abcdef) vào Info.plist của ứng dụng để xử lý lệnh chuyển hướng uỷ quyền.
3. Hoàn tất quy trình tích hợp cơ bản đối với tính năng Đăng nhập bằng Google
Hoàn tất quy trình tích hợp cơ bản đối với tính năng Đăng nhập bằng Google trước khi yêu cầu phạm vi gia tăng và gọi API của Google.
1. Kiểm tra xem những phạm vi nào đã được cấp
Trước khi gọi API của Google, hãy kiểm tra xem ứng dụng của bạn đã được cấp những phạm vi nào bằng cách sử dụng thuộc tính grantedScopes của GIDGoogleUser:
Swift
let driveScope = "https://www.googleapis.com/auth/drive.readonly"
let grantedScopes = user.grantedScopes
if grantedScopes == nil || !grantedScopes!.contains(driveScope) {
// Request additional Drive scope.
}
Objective-C
NSString *driveScope = @"https://www.googleapis.com/auth/drive.readonly";
// Check if the user has granted the Drive scope
if (![user.grantedScopes containsObject:driveScope]) {
// request additional drive scope
}
Dựa trên việc người dùng có cấp một phạm vi nhất định hay không, bạn có thể cần phải yêu cầu thêm phạm vi để hỗ trợ một hoạt động tương tác cụ thể.
2. Yêu cầu thêm phạm vi
Nếu bạn cần yêu cầu thêm phạm vi, hãy gọi addScopes:presentingViewController:completion hoặc addScopes:presentingWindow:completion để yêu cầu người dùng cấp thêm quyền truy cập cho ứng dụng của bạn.
Ví dụ: để yêu cầu quyền chỉ có thể đọc đối với các tệp trên Drive của người dùng, hãy làm như sau:
Swift
let additionalScopes = ["https://www.googleapis.com/auth/drive.readonly"]
guard let currentUser = GIDSignIn.sharedInstance.currentUser else {
return ; /* Not signed in. */
}
currentUser.addScopes(additionalScopes, presenting: self) { signInResult, error in
guard error == nil else { return }
guard let signInResult = signInResult else { return }
// Check if the user granted access to the scopes you requested.
}
Objective-C
NSArray *additionalScopes = @[ @"https://www.googleapis.com/auth/drive.readonly" ];
GIDGoogleUser *currentUser = GIDSignIn.sharedInstance.currentUser;
[currentUser addScopes:additionalScopes
presentingViewController:self
completion:^(GIDSignInResult * _Nullable signInResult,
NSError * _Nullable error) {
if (error) { return; }
if (signInResult == nil) { return; }
// Check if the user granted access to the scopes you requested.
}];
3. Thực hiện lệnh gọi API bằng mã thông báo mới
Để đảm bảo rằng các lệnh gọi API của Google luôn có mã truy cập chưa hết hạn, hãy gói các lệnh gọi trong một khối refreshTokensIfNeededWithCompletion::
Swift
currentUser.refreshTokensIfNeeded { user, error in
guard error == nil else { return }
guard let user = user else { return }
// Get the access token to attach it to a REST or gRPC request.
let accessToken = user.accessToken.tokenString
// Or, get an object that conforms to GTMFetcherAuthorizationProtocol for
// use with GTMAppAuth and the Google APIs client library.
let authorizer = user.fetcherAuthorizer()
}
Objective-C
[currentUser refreshTokensIfNeededWithCompletion:^(
GIDGoogleUser * _Nullable user,
NSError * _Nullable error) {
if (error) { return; }
if (user == nil) { return; }
// Get the access token to attach it to a REST or gRPC request.
NSString *accessToken = user.accessToken.tokenString;
// Or, get an object that conforms to GTMFetcherAuthorizationProtocol for
// use with GTMAppAuth and the Google APIs client library.
id<GTMFetcherAuthorizationProtocol> authorizer = [user fetcherAuthorizer];
}];
Sử dụng mã truy cập để gọi API bằng cách thêm mã truy cập vào tiêu đề của yêu cầu REST hoặc gRPC (Authorization: Bearer ACCESS_TOKEN) hoặc bằng cách sử dụng trình uỷ quyền của trình tìm nạp với Thư viện ứng dụng API của Google.